【问题标题】:Creating a script for a Telnet session?为 Telnet 会话创建脚本?
【发布时间】:2010-10-17 02:59:53
【问题描述】:

有谁知道创建脚本的简单方法,该脚本可以连接到远程登录服务器,执行一些常用的远程登录操作,然后注销?我正在与不熟悉 telnet 以及他们需要运行的命令的用户打交道。我想要的只是让他们双击一个脚本,并让该脚本自动为他们执行命令。

您可能想知道,“用户在哪个平台上?”它们将在 Windows 和 Linux 上运行。 Perl、Java 或 Python 等语言的实现是可以接受的。我看到 Perl 有一个 Net:: Telnet 模块。有人用过吗?

我理想的解决方案是创建两个脚本文件。 Windows 的 BAT 文件和 Linux 的 shell 脚本。虽然这会使双重维护成为问题,但这意味着我不必在每台机器上安装 Perl/Java/Python/etc...。不幸的是,我还没有看到任何方法可以使用批处理文件或 shell 脚本自动执行 telnet 会话。

谢谢。

【问题讨论】:

标签: scripting telnet


【解决方案1】:

我使用了多种方法来编写 unix 下的 telnet 会话脚本,但最简单的方法可能是一系列 echo 和 sleep 命令,它们的输出通过管道传输到 telnet。也可以将输出通过管道传输到另一个命令中。

愚蠢的例子

(回显密码;回显“显示IP路由”;睡眠1;回显“退出”)|远程登录我的路由器

这(基本上)检索 Cisco 路由器的路由表。

【讨论】:

  • 括号 在这里的作用是什么?
  • @WakanTanka 强制 echo 和 sleep 在子 shell 中运行,共享一个标准输出,实际上在“quit”命令回显之前让 sleep 暂停输出,以允许完整的路由表在连接断开之前打印。
【解决方案2】:

Expect 就是为此而构建的,可以处理输入/输出以及超时等。请注意,如果您不是 TCL 粉丝,可以使用针对 Perl/Python/Java 的 Expect 模块。

编辑:上面的页面表明the Wikipedia Expect 条目是一个有用的资源:-)

【讨论】:

  • Expect 实现也有其他语言版本,比如 Perl 的 Expect.pm 模块,如果你不想学习 TCL。
  • Expect 发行版包含一个名为 autoexpect 的脚本,它将通过查看会话来生成一个期望脚本。生成的脚本很简单,可以调整。
  • TCL/TK 用它编写的工具很糟糕——仅仅因为嵌入式系统无法完全满足依赖关系......忘记所有的废话,只需使用 netcat = 几乎没有 CPU 负载。
  • 预期仅适用于 Linux/Unix。不支持 Windows。
【解决方案3】:

另一种方法是使用与 vatine 显示相同格式的 netcat(或 nc,取决于哪个 posix),或者您可以创建一个文本文件,其中包含在其自己的行中的每个命令。

我发现一些 posix' telnet 不能正确处理重定向(这就是我建议使用 netcat 的原因)

【讨论】:

  • 很好的答案,telnet 无法正常工作,但通过 nc 管道可以正常工作。
  • 来吧,人们,当您投反对票时,请告诉我原因(尤其是事后几年)
  • 您的回答可能只是对 Vatine 回答的评论。或者对他的编辑。当您提到“与 vatine 节目相同的格式”时,无需发布全新的答案。在 SO 中,得到最好的答案比让很多答案相互引用要好,或者我相信。顺便说一句,我没有投反对票。
【解决方案4】:

此 vbs 脚本会重新加载 cisco 交换机,请确保在 windows 上安装了 telnet。

Option explicit
Dim oShell
set oShell= Wscript.CreateObject("WScript.Shell")
oShell.Run "telnet"
WScript.Sleep 1000
oShell.Sendkeys "open 172.25.15.9~"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 1000
oShell.Sendkeys "en~"
WScript.Sleep 1000
oShell.Sendkeys "password~"
WScript.Sleep 1000
oShell.Sendkeys "reload~"
WScript.Sleep 1000
oShell.Sendkeys "~"
Wscript.Quit

【讨论】:

  • 只有在 Windows 上对我有用的解决方案(在 Windows 上的 Cygwin 上尝试了类似 Linuxy 的解决方案,但没有一个对我有用)
【解决方案5】:

这听起来可能不是一个好主意,但我使用 java 并使用简单的 TCP/IP 套接字编程来连接到 telnet 服务器并交换通信。如果您知道实现的协议,它会完美运行。对于 SSH 等,除非您知道如何进行握手等,否则可能会很困难,但简单的 telnet 就像一种享受。

我尝试的另一种方法是在 java System.exec() 等中使用外部进程,然后让内置 telnet 的 windows 为您完成这项工作,您只需向本地系统进程发送和接收数据。

【讨论】:

    【解决方案6】:

    检查SendCommand tool

    您可以按如下方式使用它:

    perl sendcommand.pl -i login.txt -t cisco -c "show ip route"
    

    【讨论】:

      【解决方案7】:
      import telnetlib
      
      user = "admin"
      password = "\r"
      
      def connect(A):
          tnA = telnetlib.Telnet(A)
          tnA.read_until('username: ', 3)
          tnA.write(user + '\n')
          tnA.read_until('password: ', 3)
          tnA.write(password + '\n')
          return tnA
      def quit_telnet(tn)
          tn.write("bye\n")
          tn.write("quit\n")
      

      【讨论】:

        【解决方案8】:

        几个问题:

        1. 你能把东西放在你正在远程登录的设备上吗?
        2. 脚本执行的命令是相同的还是因机器/用户而异?
        3. 您希望单击图标的人必须提供用户 ID 和/或密码吗?

        也就是说,我前段时间写了一些 Java 来与几个支持 IP 的电源板 (BayTech RPC3) 交谈,这些电源板可能对您有用。如果您有兴趣,我会看看我是否可以将其挖掘并发布到某个地方。

        【讨论】:

          【解决方案9】:

          我喜欢 Active State 使用 python 给出的示例。这是完整的link。我从链接中添加了部分简单日志,但您可以了解您可以做什么。

          import telnetlib
          
          prdLogBox='142.178.1.3'
          uid = 'uid'
          pwd = 'yourpassword'
          
          tn = telnetlib.Telnet(prdLogBox)
          tn.read_until("login: ")
          tn.write(uid + "\n")
          tn.read_until("Password:")
          tn.write(pwd + "\n")
          tn.write("exit\n")
          tn.close()
          

          【讨论】:

            【解决方案10】:

            Bash shell 支持这种开箱即用的方式,例如

            exec {stream}<>/dev/tcp/example.com/80
            printf "GET / HTTP/1.1\nHost: example.com\nConnection: close\n\n" >&${stream}
            cat <&${stream}
            

            要过滤并只显示一些行,请运行:grep Example &lt;&amp;${stream}

            【讨论】:

              【解决方案11】:

              在 BAT Dos 文件中编写 telnet 会话并执行。

              【讨论】:

              • 您无法从 BATch 文件中控制/编写 FTP 会话,您只能开始 FTP 会话。要编写 FTP 会话脚本,您必须使用脚本命令 -s:filename.txt 来识别包含您的脚本的文本文件。
              • FTP?我相信问题是关于 TELNET 会话
              猜你喜欢
              • 2017-08-29
              • 2012-12-07
              • 2017-07-09
              • 2010-09-11
              • 2015-09-29
              • 2019-08-22
              • 2014-01-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多