2010-04-13 36 views
7

Làm cách nào để tôi có thể viết kịch bản PowerShell để tự động hóa bộ lệnh này?Tự động Telnet bằng PowerShell

  • Telnet đến một máy,
  • thực hiện vài lệnh,
  • phân tích tại đầu ra trong cửa sổ telnet,
  • dựa trên đầu ra, gửi vài lệnh hơn
+0

phía máy chủ là gì? unix? osx? windows + telnetd? powershell v1 hoặc v2? bạn có thể cài đặt công cụ ở phía xa không? phía khách hàng? – x0n

+0

Kịch bản được viết là gì? –

+1

@Romain - tiêu đề cho biết tất cả: powershell. – x0n

Trả lời

1

Thay vì cố gắng tự động hóa một telnet thực thi, chỉ cần tạo socket và đưa ra các lệnh, đọc lại chúng và đưa ra các quyết định dựa trên đó. Dưới đây là một ví dụ đơn giản đi kết nối với máy chủ web địa phương của tôi:

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

Rõ ràng bạn sẽ cần phải thay đổi nó từ cổng 80, và thông qua một tên người dùng/mật khẩu thay vì một tiêu đề yêu cầu web ... nhưng điều này nên là đủ để giúp bạn bắt đầu.

+0

Cảm ơn bạn đã lấy mẫu. Tôi rất mới để powershell. Tôi đã thử vài thứ dựa trên đoạn mã trên nhưng mọi thứ không hiệu quả, nhưng tôi phải thiếu cái gì đó. Đây là những gì tôi tring để làm. telnet portnum // đợi cho đến khi màn hình nói BIOS BẮT ĐẦU "esc crtl [" nếu tôi có thể thực hiện ở trên, phần còn lại của tập lệnh trở nên khá dễ dàng. Một lần nữa cảm ơn cho đầu vào, tôi sẽ tiếp tục cố gắng dựa trên ví dụ trên. –

+0

chờ đợi, bạn đang cố gắng telnet vào một máy từ xa để nắm bắt các trình tự khởi động ?! cho tôi biết tôi sai ... – x0n

+0

không, telnet chụp đầu ra của bảng phát triển thông qua cổng nối tiếp trên máy từ xa. Tôi có phiên telnet anthor vào máy từ xa để gửi các lệnh tới bảng phát triển.Vì vậy, ý tưởng là để nắm bắt đầu ra từ phiên telnet đầu tiên, tìm ra trạng thái của bảng phát triển là gì, gửi các lệnh khác tới bảng phát triển thông qua cửa sổ telnet thứ hai. –

2

Tôi sẽ không làm bất cứ điều gì với ổ cắm ở đây vì bạn sẽ cần phải thực hiện ít nhất một phần của thông số kỹ thuật telnet. Nếu tôi nhớ, thông số đó hơi buồn cười. Nhưng có một số triển khai thực hiện telnet .NET được liệt kê ở đây: C# Telnet Library mà bạn có thể thích ứng hoặc sử dụng trực tiếp từ PowerShell theo cùng cách mà Goyuix đang sử dụng mã socket trong câu trả lời của mình.

3

Ok đây không phải là giải pháp thanh lịch nhất, và nó dựa vào rùng mình VBScript nhưng ở đây nó đi ...

Tạo một VBScript để thực sự xúc tiến việc phiên telnet, đây là một ví dụ

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 

sau đó sử dụng Powershell để gọi script này và vượt qua nó các lệnh mà bạn muốn thực hiện, trong ví dụ dưới đây các lệnh này được lưu trữ trong một tập tin gọi 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; 

Và đó nên làm những gì bạn đang yêu cầu ...

Lưu ý: Không giải pháp của tôi, tìm thấy từ this blog post và tôi đã sử dụng nó một lần hoặc hai lần.

Các vấn đề liên quan