【问题标题】:Variables on telnettelnet 上的变量
【发布时间】:2019-12-07 23:39:26
【问题描述】:

我对编码很陌生,我需要一个小的自动化批处理文件。

我通常只是从 CMD 打开 Telnet 并这样做:

我输入:o 192.168.1.248

然后我连接到设备 我发送我的字符串WE1*1RTMP,设备回复E1*1RTMP

这是正确的,一切正常。

但我想让它自动化,而不需要我输入所有内容,只需启动一个 .bat 文件。

  • 我可以用Ncat 做到这一点,创建一个bat 文件,上面写着: echo WE1*1RTMP | ncat 192.1568.1.248 23一切正常。

  • 我也可以使用带有 .bat 文件的 Plink 来做到这一点,上面写着 plink.exe -load RECtelnet < *path to a text file containing the WE1*1RTMP command. 现在我需要一种方法来检查设备的响应。

当命令被正确接收并执行时,我得到的答案是E1*1RTMP,但我很想有一些东西来检查这个。 就像我得到的响应和这个一样,运行后一切都消失了,但是如果响应有什么不同,就像我输入一个无法从设备识别的命令时得到的 E10 错误,而不是消失的 cmd 窗口只是说“嘿,你的命令失败”或类似的东西。

我也可以使用 SSH 发送此命令,我有另一个名为“REC”的 Plink 配置文件通过 SSH 连接我,如果与 telnet 相比这更容易自动化的话。

我该如何存档? 感谢所有愿意提供帮助的人。

【问题讨论】:

    标签: batch-file telnet


    【解决方案1】:

    我将示例脚本修改为更紧凑,并使用 yoru 命令和 IP 并使用 telnet 而不是 SSH 等。

    REM Script Name:  TelnetToDevice.cmd
    @(
      SETLOCAL EnableDelayedExpansion
      ECHO OFF
      REM SETUP Device Connection Details and commands
      SET "_PLink.Path=%~dp0plink.exe"
      SET "_PLink.Method=-telnet"
      REM SET "_PLink.Method=-ssh"
      SET "_Device.User=USERNAME"
      SET "_Device.PW=PASSWORD"
      SET "_Devices.List="192.1568.1.248""
      SET "_Devices.Cmd.List="WE1*1RTMP""
      SET /A "_Results.Count=0"
    )
    
    
    FOR %%A IN (%_Devices.List%) DO (
      FOR %%B IN (%_Devices.Cmd.List%) DO (
        FOR /F "Tokens=*" %%C IN ('
          ECHO.Y^|%_PLink.Path% %_PLink.Method% %_Device.User%@%%~A -pw %_Device.PW% "%%~B"
        ') DO (
          ECHO.Results is "%%C"
          SET /A "_Results.Count+=1"
          SET "_Result.!_Results.Count!=%%C"
        )
      )
    )
    
    ECHO.
    ECHO.Listing all Variables generated:
    ECHO.
    SET "_Result."
    
    PAUSE
    
    (
      ENDLOCAL
      EXIT /B 0
    )
    

    好的,如果您只需要收集该命令的输出,可能会启动另一个命令作为响应,那么使用 PLINK 在 CMD 中执行此操作相当容易,并且 NCAT 应该也可以工作。

    (我使用 Plink 从 CMD 连接到我们的 Cisco 设备以收集数据,并在收到某些响应时运行一些简单的命令)

    这是通过在FOR /F 循环中解析结果来捕获命令的输出来完成的。

    直接在 CLI 中:

    NCAT

    FOR /F "Tokens=*" %A IN ('
      ECHO.WE1*1RTMP^| ncat 192.1568.1.248 23
    ') DO (
      ECHO.%%A
      SET "_Result=%%A"
    )
    

    PLINK

    FOR /F "Tokens=*" %A IN ('
      plink.exe -load RECtelnet ^< "C:\path\to\file containing WE1*1RTMP command.txt"
    ') DO (
      ECHO.%%A
      SET "_Result=%%A"
    )
    

    注意,我假设您知道在上述命令中,在这些情况下您需要提供用户名密码等,因为您说这些是正常工作的命令。

    我碰巧有一个脚本,用于连接到多个设备并运行命令,它对您的需求来说太过分了,我将编写一个精简的版本,但将它作为运行示例包含在内似乎是值得的在 CMD 脚本中:

    这是我用来检查和修复光纤开关的实际 CMD 脚本的外壳:

    @(
        SETLOCAL ENABLEDELAYEDEXPANSION
        ECHO OFF
        REM SETUP Device Connection Details and commands
        SET "_PLink.Path=%~dp0plink.exe"
        SET "_Device.User=USERNAME"
        SET "_Device.PW=PASSWORD"
        SET "_Devices.List="IP/Hostname1" "IP/Hostname_2" "IP/Hostname_3" "IP/HostnameN""
        SET "_Devices.Cmd.List="show feature ^| inc http" "show system internal flash ^| include Mount" "show system internal flash ^| include tmp" "dir ^| include free" "show system internal dir /var/tmp ^| Inc 'log.+[0-9][0-9][0-9][0-9][0-9][0-9]'" "show environment fan ^| ex ---- ^| ex Filter" "show environment temperature ^| ex ---- ^| ex '('""
    
        REM Setup Log files and Email
        CALL :GetDateTime
        SET "_Log.Folder=%~dp0Log"
        SET "_eMail.Folder=%~d0\Temp"
        IF NOT EXIST "!_Log.Folder!" ( MD "!_Log.Folder!" )
        IF NOT EXIST "!_eMail.Folder!" ( MD "!_eMail.Folder!" )
        SET "_Log.File=!_Log.Folder!\%~n0_Log_!IsoDate!_!IsoTime!.log"
        SET "_eMail.File=!_eMail.Folder!\%~n0_eml.tmp"
        SET "_eMail.Subject=%~n0 - Log"
        ECHO.>"!_eMail.File!"
        SET "_SMTPServer=SMTPServerIP"
        SET "_RcptTo=Yourname@YourDomain.com"
        SETLOCAL DISABLEDELAYEDEXPANSION
    )
    CALL :Main
    
    
    (
        ENDLOCAL
        Exit /b %eLvl%
    )
    
    
    :Main
        FOR %%A IN (%_Devices.List%) DO (
            CALL :OutEcho
            CALL :DateEcho %%~A:
            FOR %%B IN (%_Devices.Cmd.List%) DO (
                FOR /F "Tokens=*" %%C IN ('
                    ECHO.Y^|%_PLink.Path% -ssh %_Device.User%@%%~A -pw %_Device.PW% "%%~B"
                ') DO (
                    CALL :OutEcho %%~A: %%~C
                    (
                        ECHO.%%~C | FIND /I "log" >NUL
                    ) && (
                        FOR /F "Tokens=1" %%D IN ("%%~C") DO (
                            CALL :OutEcho %%~A: Deleting:  %%~D
                            FOR %%b IN (
                                %_Devices.Cmd.DeleteFoundFile%
                            ) DO (
                                FOR /F "Tokens=*" %%c IN ('
                                    %_PLink.Path% -ssh %_Device.User%@%%~A -pw %_Device.PW% "%%~b%%~D"
                                ') DO (
                                    CALL :OutEcho %%~A: %%~c
                                )
                                CALL :OutEcho %%~A: Deleted:  %%~D
                            )
                        )
                    )
                )
            )
    
        )
        CALL :SendMail "%_eMail.File%" "%_eMail.Subject%"
    GOTO :EOF
    
    
    :SendMail
        ECHO.Sending Email for "%~2"
        CALL ECHO CALL "%~dp0mailsend.exe" -domain reval.com -smtp %_SMTPServer% -f %Computername%@reval.com -t %_RcptTo% -sub "%~2" -attach "%~1",text,i
        CALL "%~dp0mailsend.exe" -domain reval.com -smtp %_SMTPServer% -f %Computername%@reval.com -t %_RcptTo% -sub "%~2" -attach "%~1",text,i
    GOTO :EOF
    
    
    :DateEcho
        (
            SETLOCAL
            CALL :GetDateTime
        )
        CALL :OutEcho %TDate% - %*
        ENDLOCAL
    GOTO :EOF
    
    
    :OutEcho
        ECHO.%*
        ECHO.%*>>"%_Log.File%"
        ECHO.%*>>"%_eMail.File%"
    GOTO :EOF
    
    
    :GetDateTime
        FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
            FOR /F "Tokens=2-4 Skip=1 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
                SET "%%~a=%%~A"
                SET "%%~b=%%~B"
                SET "%%~c=%%~C"
                SET /a "#%%~a=1%%~A - (2%%~A-1%%~A)"
                SET /a "#%%~b=1%%~B - (2%%~B-1%%~B)"
                SET /a "#%%~c=1%%~C - (2%%~C-1%%~C)"
                SET "HH=%%~D"
                SET "Mn=%%~E"
                SET "SS=%%~F"
                SET "Ms=%%~G"
                SET /a "#HH=1%%~D - (2%%~D-1%%~D)"
                SET /a "#Mn=1%%~E - (2%%~E-1%%~E)"
                SET /a "#SS=1%%~F - (2%%~F-1%%~F)"
                SET /a "#Ms=1%%~G - (2%%~G-1%%~G)"
                SET /a "#TMinutes=((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E))"
                SET /a "#TSeconds=((((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E)))*60)+(1%%~F - (2%%~F-1%%~F))"
            )
        )
        SET "TTime=%HH%.%Mn%.%SS%"
        SET "IsoTime=%HH%.%Mn%.%SS%.%Ms%"
        SET "TDate=%yy%-%mm%-%dd%"
        SET "IsoDate=%yy%-%mm%-%dd%"
    GOTO :EOF
    

    下面是一个更严格的脚本,它直接使用您提供的信息。

    REM Script Name:  TelnetToDevice.cmd
    @(
      SETLOCAL EnableDelayedExpansion
      ECHO OFF
      REM SETUP Device Connection Details and commands
      SET "_PLink.Path=%~dp0plink.exe"
      SET "_PLink.Method=-telnet"
      REM SET "_PLink.Method=-ssh"
      SET "_Device.User=USERNAME"
      SET "_Device.PW=PASSWORD"
      SET "_Devices.List="192.1568.1.248""
      SET "_Devices.Cmd.List="WE1*1RTMP""
      SET /A "_Results.Count=0"
    )
    
    
    FOR %%A IN (%_Devices.List%) DO (
      FOR %%B IN (%_Devices.Cmd.List%) DO (
        FOR /F "Tokens=*" %%C IN ('
          ECHO.Y^|%_PLink.Path% %_PLink.Method% %_Device.User%@%%~A -pw %_Device.PW% "%%~B"
        ') DO (
          ECHO.Results is "%%C"
          SET /A "_Results.Count+=1"
          SET "_Result.!_Results.Count!=%%C"
        )
      )
    )
    
    ECHO.
    ECHO.Listing all Variables generated:
    ECHO.
    SET "_Result."
    
    PAUSE
    
    (
      ENDLOCAL
      EXIT /B 0
    )
    

    【讨论】:

    • 感谢您的回答,不幸的是,这两个都不起作用。我有一个网页,我可以在其中检查命令是否已正确运行并且它们根本不运行。
    • @Veehxia 我还包含了我使用的完整脚本的示例,通常对于 PLINK,我实际上会直接将这些行作为参数传递。由于这是一个执行特定且不同任务的脚本,因此我将实际命令保留在原处,因此您可以看到在这种情况下它们是如何被转义的。我还会发布一个更短的版本,我认为它只是你的作品。
    • @Veehxia 通常使用 PLINk 我也必须指定用户名和密码,我假设您只是从命令中省略了它,因为您知道需要重新添加它,这是正确的吗?
    • @Veehxia 我发布了使用您提供的信息的版本,并大大减少了答案顶部的总脚本,也试一试。
    • 非常感谢,我周五回来试试。可悲的是,我对这一切都很陌生,有什么我应该改变的,让它在我的机器上运行吗?
    【解决方案2】:

    你做你想做的最简单的方法可能是:

    1. 安装python

    2. 将其写入文本文件(例如使用记事本),并将其保存为以.py 结尾的内容:

      import socket
      import traceback
      
      try:
          mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          mysock.connect(("192.168.1.248", 23))
          mysock.send(b"WE1*1RTMP\n")
          read_so_far = b""
      
          while b"E1*1RTMP".startswith(read_so_far):
              read_bit = sock.recv(1024)
              if read_bit == b"":
                  print("Didn't get full message; had", repr(read_so_far))
                  input("Press enter to continue... ")
                  break
              read_so_far += read_bit
              if read_so_far.startswith(b"E1*1RTMP"):
                  print("Got success message")
                  break
          else:
              print("Got the wrong message: ", repr(read_so_far))
              input("Press enter to continue... ")
      except Exception as e:
          traceback.print_exc()
          input("Press enter to continue... ")
          raise
      

      注意:行的缩进方式很重要。

    3. 双击该文件现在应该可以执行您想要的操作。如果出现问题,请在此处寻求帮助之前打开命令提示符,cd 到相关目录并在命令行使用python myfile.py(或您命名的文件)运行它。这里的人需要那个输出。

    4. 在未来的某个时候,拿起一本关于 Python 的书,或者在 coursera 或其他地方注册一个以 Python 为重点的课程。我听说过“适用于每个人的 Python”的好消息,但那里有很多东西 - 现在你当地的大型书店的计算机部分有 10% 以上是试图教你 Python 的书籍。

    【讨论】:

    • 谢谢你的回答,我试着按照你说的一步一步做,但这就是我从 cmd 得到的: Traceback (最近一次调用最后一次): File "C:\Users\ Utente\Desktop\diretta.py", line 7, in mysock.send("WE1*1RTMP\n") TypeError: a bytes-like object is required, not 'str' Press enter to continue... 在我按 Enter 似乎没有任何反应,我在设备网页上检查过,命令尚未执行。
    • 呃,对不起。脚本现已修复。
    • 谢谢。我直到星期五才离开工作场所,所以我不能马上尝试,但我会确保在我这样做后发布更新。再次感谢您的时间和帮助。
    猜你喜欢
    • 2016-06-21
    • 2013-05-15
    • 2014-09-01
    • 2020-08-03
    • 2011-05-31
    • 2018-11-05
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多