2010-04-13 56 views
7

¿Cómo puedo escribir un script de PowerShell para automatizar este conjunto de comandos?Automatización de Telnet con PowerShell

  • Telnet a una máquina,
  • ejecutar algunos comandos,
  • analizan en la salida en la ventana de telnet,
  • basado en que la producción, enviar unos cuantos comandos
+0

¿cuál es el lado del servidor? Unix? osx? Windows + telnetd? ¿PowerShell v1 o v2? ¿Puedes instalar cosas en el lado remoto? el lado del cliente? – x0n

+0

¿En qué se escribe el script? –

+1

@Romain: el título lo dice todo: powershell. – x0n

Respuesta

1

En lugar de intente automatizar un ejecutable de telnet, solo cree el socket y emita los comandos, léalos y tome decisiones basadas en eso. Este es un ejemplo muy simplificado conectar con el servidor 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() 
} 

Obviamente que tendría que cambiarlo desde el puerto 80, y pasar un nombre de usuario/contraseña en lugar de una cabecera de solicitud web ... pero esto debe ser lo suficientemente para que comiences

+0

Gracias por la muestra. Soy muy nuevo en PowerShell. Probé algunas cosas según el código anterior, pero las cosas no funcionaron, pero me falta algo. Aquí lo que intento hacer. telnet portnum // espera hasta que la pantalla dice BIOS START "Ctrl esc [" si yo puedo hacer lo anterior, resto de la secuencia de comandos se hace muy fácil. De nuevo, gracias por la entrada, voy a seguir intentando basándome en el ejemplo anterior. –

+0

espera, ¿está intentando hacer telnet en una máquina remota para capturar la secuencia de arranque? dime que estoy equivocado ... – x0n

+0

no, telnet captura la salida de una placa de desarrollo a través de un puerto serie de la máquina remota. Tengo una sesión de telnet anthor en la máquina remota para enviar comandos a la placa de desarrollo.Entonces, la idea es capturar el resultado de la primera sesión de Telnet, determinar cuál es el estado de la placa de desarrollo, enviar más comandos a la placa de desarrollo a través de la segunda ventana de telnet. –

2

que no haría nada con tomas aquí, ya que van a necesitar para poner en práctica al menos partes de la especificación de telnet. Si recuerdo, esa especificación es un poco divertida. Sin embargo, hay algunas implementaciones .NET telnet enumerados aquí: C# Telnet Library que es probable que pueda adaptar o utilizar directamente desde powershell de la misma manera que Goyuix está utilizando el código toma en su respuesta.

3

Muy bien, este no es la solución más elegante, y lo hace depender de estremecimiento VBScript, pero aquí va ...

Crear un VBScript para acelerar realmente la sesión de telnet, esto es un ejemplo

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 

a continuación, utilice Powershell para invocar ese guión y pasarlo los comandos que desee ejecución, en el siguiente ejemplo de estos comandos se almacenan en un archivo llamado 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; 

Y eso debería hacer lo que están pidiendo ...

Nota: No es mi solución, que se encuentra desde this blog post y me han hecho uso de ella una o dos veces.