2010-04-13 8 views
7

Comment écrire un script PowerShell pour automatiser cet ensemble de commandes?Automatisation de Telnet avec PowerShell

  • Telnet à une machine,
  • exécuter quelques commandes,
  • Analysons à la sortie dans la fenêtre telnet,
  • basé sur cette sortie, envoyer quelques commandes
+0

quel est le côté serveur? unix? osx? Windows + Telnetd? PowerShell v1 ou v2? pouvez-vous installer des choses sur le côté distant? le côté client? – x0n

+0

Quel est le script à écrire? –

+1

@Romain - le titre dit tout: powershell. – x0n

Répondre

1

Plutôt que essayez d'automatiser un exécutable telnet, créez simplement le socket et lancez les commandes, relisez-les et prenez des décisions en fonction de cela. Voici un exemple simplificatrice connexion à mon serveur web local:

function test() { 
    $msg = [System.Text.Encoding]::ASCII.GetBytes("GET/HTTP/1.0`r`nHost: localhost`r`n`r`n") 
    $c = New-Object System.Net.Sockets.TcpClient("localhost", 80) 
    $str = $c.GetStream() 
    $str.Write($msg, 0, $msg.Length) 
    $buf = New-Object System.Byte[] 4096 
    $count = $str.Read($buf, 0, 4096) 
    [System.Text.Encoding]::ASCII.GetString($buf, 0, $count) 
    $str.Close() 
    $c.Close() 
} 

vous De toute évidence besoin de le changer à partir du port 80, et passer un nom d'utilisateur/mot de passe au lieu d'un en-tête de requête web ... mais cela devrait être suffisant pour vous aider à démarrer.

+0

Merci pour l'exemple. Je suis très nouveau à powershell. J'ai essayé peu de choses basées sur le code ci-dessus mais les choses n'ont pas fonctionné, mais je dois manquer quelque chose. Voici ce que je veux faire. telnet portnum // attend jusqu'à ce que l'écran dise BIOS START "esc crtl [" si je peux faire ce qui précède, le reste du script devient assez facile. Encore une fois merci pour l'entrée, je vais continuer à essayer en fonction de l'exemple ci-dessus. –

+0

Attendez, vous essayez de telnet dans une machine distante pour capturer la séquence de démarrage ?! dites-moi que je me trompe ... – x0n

+0

non, telnet capture la sortie d'une carte de développement via un port série sur la machine distante. J'ai la session de telnet d'anthor dans la machine à distance pour envoyer des commandes au panneau de développement.L'idée est donc de capturer la sortie de la première session telnet, de déterminer quel est l'état du tableau de développement, d'envoyer plus de commandes au tableau de développement via la deuxième fenêtre telnet. –

2

Je ne ferais rien avec les sockets ici parce que vous aurez besoin d'implémenter au moins certaines parties de la spécification telnet. Si je me souviens, cette spécification est un peu drôle. Mais il y a quelques implémentations de telnet de .NET énumérées ici: C# Telnet Library que vous pouvez probablement adapter ou utiliser directement de powershell de la même manière que Goyuix utilise le code de douille dans sa réponse.

3

Ok ce n'est pas la solution la plus élégante, et il ne repose sur frisson VBscript, mais ici, il va ...

Créer un VBScript pour accélérer effectivement la session telnet, ceci est un exemple

set oShell = CreateObject("WScript.Shell") 
oShell.run("Telnet") 
WScript.Sleep 1000 
oShell.SendKeys("Open 127.0.0.1 23") 
WScript.Sleep 1000 
oShell.SendKeys("{Enter}") 
WScript.Sleep 1000 
oShell.SendKeys("n") 
WScript.Sleep 1000 
oShell.SendKeys("{Enter}") 
WScript.Sleep 1000 
oShell.SendKeys"MyName" 
WScript.Sleep 1000 
oShell.SendKeys("{Enter}") 
WScript.Sleep 1000 
oShell.SendKeys("MyPassword") 
WScript.Sleep 1000 
oShell.SendKeys("{Enter}") 
WScript.Sleep 1000 
oShell.SendKeys("MyCommand") 
WScript.Sleep 1000 
oShell.SendKeys("{Enter}") 
WScript.Sleep 1000 

utilisez ensuite Powershell pour appeler ce script et passer les commandes que vous voulez exécution, dans l'exemple ci-dessous ces commandes sont stockées dans un fichier appelé CommandList.txt

function Connect-MyTelnet{ 
Param(
[string] $IPAddress, 
[string] $Port, 
[string] $UserName, 
[string] $Password, 
[string] $cmdlistPath 
) 
    ## - Setting default values: 
    if($port -eq $null){ $Port = "23"; }; 
    if($cmdlistPath -eq $null) { $CmdlistPath = 'c:\temp\cmdlist.txt'; }; 

    ## create vbscript file: MyTelnetSession.vbs 
    ## - For Microsoft Telnet: 
    $MyVBScript = @" 
        set oShell = CreateObject("WScript.Shell")`r`n 
        oShell.run("Telnet")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("Open $IPAddress $Port")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("{Enter}")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("n")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("{Enter}")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("$UserName")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("{Enter}")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("$Password")`r`n 
        WScript.Sleep 1000`r`n 
        oShell.SendKeys("{Enter}")`r`n 
        WScript.Sleep 1000`r`n 
       "@; 

    ## - Get file with telnet commands: 
    [array] $Cmdlist = Get-Content $cmdlistPath; 

    ## loop through and build each telnet command line: 
    foreach($cmd in $cmdlist) 
    { 
     ## - Build VBscript lines: 
     $MyVBScript += 'oShell.SendKeys("'+$cmd+'")'+"`r`n"; 
     $MyVBScript += "WScript.Sleep 1000`r`n"; 
     $MyVBScript += 'oShell.SendKeys("{Enter}")'+"`r`n"; 
     $MyVBScript += 'WScript.Sleep 1000'+"`r`n"; 
    } 

    ## - Close Telnet Session: 
     $MyVBScript += 'oShell.SendKeys(" QUIT")'+"`r`n"; 
     $MyVBScript += "WScript.Sleep 1000`r`n"; 
     $MyVBScript += 'oShell.SendKeys("{Enter}")'+"`r`n"; 
     $MyVBScript += 'WScript.Sleep 1000'+"`r`n"; 

    ## - Save and execute generated VBscript: 
    $MYVBScript | Out-File -FilePath c:\temp\MyTelnet.vbs -Encoding ASCII; 
    & c:\temp\MyTelnet.vbs 
}; Set-Alias ct Connect-MyTelnet; 

Et cela devrait faire ce que vous demandez ...

Note: Pas ma solution, trouvée de this blog post et moi-même avons fait usage une ou deux fois.