Автоматизация Telnet с помощью PowerShell - PullRequest
7 голосов
/ 14 апреля 2010

Как мне написать скрипт PowerShell для автоматизации этого набора команд?

  • Телнет к машине,
  • выполнить несколько команд,
  • анализировать на выходе в окне telnet,
  • на основании этого вывода отправьте еще несколько команд

Ответы [ 5 ]

3 голосов
/ 14 сентября 2012

Хорошо, это не самое элегантное решение, и оно полагается на дрожь 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;

И это должно делать то, что вы просите ...

Примечание: не мое решение, найденное из этого сообщения в блоге , и я использовал его один или два раза.

2 голосов
/ 16 апреля 2010

Я бы ничего не делал здесь с сокетами, потому что вам понадобится реализовать хотя бы часть спецификации telnet. Если я помню, эта спецификация немного смешная. Но здесь перечислены некоторые реализации .NET telnet: C # Библиотека Telnet , которую вы, вероятно, можете адаптировать или использовать напрямую из powershell так же, как Goyuix использует код сокета в своем ответе.

1 голос
/ 21 марта 2019

Я предлагаю вам использовать TeraTerm это бесплатное программное обеспечение. Вы можете подключиться к своей машине через telnet и запустить скрипт TTL. это очень мощный и надежный. Я использую это каждый день для своей работы. Вы можете сделать больше поиска, если вы заинтересованы. пример сценария TTL:

i = 100
do while i>0
    sendln 'un 1357'
    wait '>'
    sendln '.w 4 42800024 0000000a'
    wait '>'
    sendln '.w 4 42800014 00000004'
    wait 'in service'
    sendln 'info'
    wait'>'
    sendln 'start'
    wait '20'#13#10'>' '0'#13#10'>'
    if result!=2 then 
        break
    endif
    i = i - 1
loop
1 голос
/ 15 апреля 2010

Вместо того, чтобы пытаться автоматизировать исполняемый файл telnet, просто создайте сокет и выполните команды, прочитайте их и примите решения на основе этого. Вот упрощенный пример подключения к моему локальному веб-серверу:

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 и передать имя пользователя / пароль вместо заголовка веб-запроса ... но этого должно быть достаточно, чтобы начать работу.

0 голосов
/ 01 мая 2018

Я создал сценарий powershell для telnet нескольких хранилищ с одного хоста и имеет опции для захвата или без захвата команды tracert и ping

Команда для Telnet нескольких хостов и захвата команды tracert и ping

    #Mutlple Telneting guide

    #Created by : Mohit

    #How to use ? 
    #Step 1 : Add mutiple IPs in DestinationIP.csv 
    #Step 2 : Run Batch file TelnetMultipleHost.bat

    ####################################################################################################################
    $DestinationIP= Get-Content .\DestinationIP.csv
    $ipV4 = (Test-Connection -ComputerName (hostname) -Count 1).IPV4Address.IPAddressToString
    ####################################################################################################################

    write-host "-------------------Welcome to Multiple Telnet Host Panel-------------------------"
    write-host ""
    write-host ""
    write-host "IMPORTANT: Make sure you are running this tool from source IP which in this case is " $ipV4
    write-host ""
    $Ports = Read-Host -Prompt "Enter Destination Port No.(# for multple ports just seperate ports with ,)"
    write-host ""
    write-host "Port No. you entered:" $Ports
    write-host ""
    write-host "Select Option"
    write-host ""
    write-host "Type 1 for telnet Host WITH trace logs"
    write-host "Type 2 for telnet Host WITHOUT trace logs"
    write-host ""
    $option =Read-Host -Prompt "Type here"
    write-host ""
    Start-Transcript -Path .\TraceLogs_$ipV4.txt


    switch($option)
    {
    #Type 1 for telnet Host WITH trace logs
    1{
      foreach ($Destination in $DestinationIP) 
      {
            foreach ($Port in $Ports) {

                    # Create a Net.Sockets.TcpClient object to use for      # checking for open TCP ports.
                    $Socket = New-Object Net.Sockets.TcpClient
                    # Suppress error messages
                    $ErrorActionPreference = 'SilentlyContinue'
                    # Try to connect
                    $Socket.Connect($Destination, $Port)
                    # Make error messages visible again
                    $ErrorActionPreference = 'Continue'
                    # Determine if we are connected.
                    if ($Socket.Connected) {
                        "${Destination}: Port $Port is open"
                        $Socket.Close()
                    }
                    else {
                        "${Destination}: Port $Port is closed or filtered"

                        if (test-connection $Destination -count 1 -quiet) {
                                     write-host $Destination "Ping succeeded." -foreground green

                            } else {
                                     write-host $Destination "Ping failed." -foreground red
                                }

                        Test-NetConnection $Destination -TraceRoute

                    }
                    # Apparently resetting the variable between iterations is necessary.
                    $Socket = $null
           }
        }
    }
    # Type 2 for telnet Host WITHOUT trace logs
    2{
    foreach ($Destination in $DestinationIP) {
        foreach ($Port in $Ports) {

            # Create a Net.Sockets.TcpClient object to use for
            # checking for open TCP ports.
            $Socket = New-Object Net.Sockets.TcpClient

            # Suppress error messages
            $ErrorActionPreference = 'SilentlyContinue'

            # Try to connect
            $Socket.Connect($Destination, $Port)

            # Make error messages visible again
            $ErrorActionPreference = 'Continue'

            # Determine if we are connected.
            if ($Socket.Connected) {
                "${Destination}: Port $Port is open"
                $Socket.Close()
            }
            else {
                "${Destination}: Port $Port is closed or filtered"

                 }
            # Apparently resetting the variable between iterations is necessary.
            $Socket = $null
        }
     } 
    }
    }
    Stop-Transcript

Обратите внимание: TelnetMultipleHost.bat этот пакет используется для запуска команды powershell

Убедитесь, что у нас есть файл bat, ps1 в том же каталоге

Код для пакетного файла:

@ эхо выкл Powershell.exe -исполнение политики удаленной подписи -Файл. \ TelnetMultipleHost.ps1 пауза

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...