为 Telnet 会话创建脚本?

Posted

技术标签:

【中文标题】为 Telnet 会话创建脚本?【英文标题】:Creating a script for a Telnet session? 【发布时间】: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 会话。

谢谢。

【问题讨论】:

使用 python telnetlib 模块。一个例子在这里***.com/questions/1491494/telnet-automation-scripting 【参考方案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】:

几个问题:

    你能把东西放在你正在远程登录的设备上吗? 脚本执行的命令是相同的还是因机器/用户而异? 您希望单击图标的人必须提供用户 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 会话

以上是关于为 Telnet 会话创建脚本?的主要内容,如果未能解决你的问题,请参考以下文章

在启动的 telnet 会话中使用期望脚本

从 shell 脚本生成交互式 telnet 会话

RUBY 脚本:连接到 Telnet 会话时等待任何输出

在 telnet 会话中使用变量

如何在 telnet 会话期间迭代队列? [复制]

有没有办法将 telnet 会话输出作为邮递员测试脚本的一部分?