2010-04-13 73 views
7

如何编写PowerShell脚本来自动执行这组命令?使用PowerShell自动化Telnet

  • telnet到一台机器,
  • 执行几个命令,
  • 分析在远程登录窗口中的输出,
  • 基于该输出,发送几个命令
+0

服务器端是什么? UNIX? OSX?窗户+ TELNETD? powershell v1或v2?你可以在远程端安装东西吗?客户端? – x0n 2010-04-14 01:20:41

+0

写什么脚本? – 2010-04-14 01:27:02

+1

@Romain - 标题说明了一切:powershell。 – x0n 2010-04-14 01:49:17

回答

1

而不是尝试自动执行telnet可执行文件,只需创建套接字并发出命令,读回它们,然后根据这些命令做出决定。下面是一个简化的示例连接到我的本地Web服务器:

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() 
} 

显然,你需要将它从80端口的变化,并通过用户名/密码,而不是一个Web请求头......不过这已经足够了让你开始。

+0

感谢您的示例。我对PowerShell非常陌生。我尝试了一些基于上述代码的东西,但事情并不奏效,但我必须错过一些东西。在这里我想要做的。 telnet portnum //等到屏幕显示BIOS START <发送以下顺序>“esc crtl [”如果我可以执行上述操作,脚本的其余部分变得非常容易。再次感谢输入,我会继续尝试基于上面的例子。 – 2010-04-14 21:02:18

+0

等待,您正尝试远程登录到远程计算机以捕获引导顺序?!告诉我我错了... – x0n 2010-04-14 22:15:26

+0

不,telnet通过远程机器上的串口捕获开发板的输出。我将anthor telnet会话导入远程机器,将命令发送到开发板。所以我们的想法是捕获第一个telnet会话的输出,找出开发板的状态,通过第二个telnet窗口向开发板发送更多命令。 – 2010-04-15 16:16:51

2

我不会在这里用套接字做任何事情,因为你将需要实现至少部分的telnet规范。如果我记得,那个规范有点有趣。但是这里列出了一些.NET远程登录实现:C# Telnet Library,您可能可以直接从PowerShell调整或使用,就像Goyuix在他的答案中使用套接字代码一样。

3

确定这是不是最优雅的解决方案,而且它依赖于不寒而栗 VBscript的,但这里有云......

创建一个VBScript实际加快telnet会话,这是一个例子

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 

然后使用PowerShell来调用脚本,并通过它,你希望在执行命令,在下面的例子中,这些命令存储在一个名为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; 

这应该做你的要求......

注意:不是我的解决方案,从this blog post发现我已经使用它一次或两次。

相关问题