为Telnet会话创建脚本?

43

有没有一种简单的方法可以创建一个脚本,以便连接到 Telnet 服务器,执行一些常规的 Telnet 操作,然后注销?我正在处理不熟悉 Telnet 和需要运行的命令的用户。我想要的就是让他们双击脚本,然后该脚本会自动为他们执行命令。

你可能会问,“用户在什么平台上?”他们将在 Windows 和 Linux 上使用。使用 Perl、Java 或 Python 等语言的实现是可接受的。我看到 Perl 有一个 Net::Telnet 模块。有人用过吗?

我的理想解决方案是创建两个脚本文件,一个是 Windows 的 BAT 文件,另一个是 Linux 的 shell 脚本。虽然这会导致维护成本增加,但这意味着我不必在每台机器上安装 Perl/Java/Python 等语言环境。不幸的是,我还没有看到任何自动化批处理文件或 shell 脚本中的 Telnet 会话的方法。

谢谢。


1
使用Python的telnetlib模块。一个例子在这里:https://dev59.com/eknSa4cB1Zd3GeqPPI8G - Vanuan
11个回答

42

我在Unix下使用过各种脚本化telnet会话的方法,但最简单的可能是一系列echosleep命令,将它们的输出导入到telnet中。将输出导入另一个命令也是一种可能性。

愚蠢的例子

(echo 密码; echo "show ip route"; sleep 1; echo "quit" ) | telnet 我的路由器

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


这里括号的目的是什么? - Wakan Tanka
7
将回声和休眠强制在子shell中运行,共享标准输出,并实际上使休眠在“退出”命令被回显之前暂停输出,以允许完整的路由表打印,然后连接断开。 - Vatine
太好了,现在我可以使用这个来测试一个服务器(echo "^]"; echo "quit")|telnet mail.domain.co.uk 25。 - Paul Littlefield

14

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

编辑:上面的页面建议 维基百科 Expect 条目 是一个有用的资源 :-)


1
如果您不想学习TCL,那么其他语言也提供了类似的实现,比如Perl的Expect.pm模块。 - Josh Kelley
1
Expect 分发包中包含一个名为 autoexpect 的脚本,该脚本可以通过查看会话来生成一个 expect 脚本。生成的脚本足够简单易懂,可进行微调。 - sigjuice
3
TCL/TK不适合编写工具,因为在嵌入式系统上无法完全满足其依赖关系。放弃使用那些麻烦的东西,直接使用netcat就可以了,几乎不会占用CPU负载。 - Martin Zeitler
Expect只支持Linux/Unix系统,不支持Windows。 - YetAnotherRandomUser

12

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

我发现有些posix的telnet无法正确处理重定向(这就是为什么我建议使用netcat)。


优秀的答案,telnet无法工作,但通过nc来进行传输管道却可以。 - I82Much
5
各位,当你们给我点踩的时候,请告诉我为什么(特别是在多年之后)。请注意,在翻译过程中不会添加解释或其他内容。 - KevinDTimm
1
你的回答本可以作为Vatine答案下的评论,或者对他的回答进行编辑。当你提到“与vatine展示的格式相同”时,没有必要发布全新的答案。在SO中,获得最佳答案比有很多互相交叉引用的答案更好,至少我是这么认为的。顺便说一句,我没有给你点踩。 - artfuldev

8

这个vbs脚本可以重新加载思科交换机,请确保在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上有效的解决方案(尝试了Cygwin上的类Linux解决方案,但它们都对我无效)。 - ericcurtin

3
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")

3

检查是否有SendCommand工具

使用方法如下:

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

3

也许听起来不是一个好主意,但我使用Java并使用简单的TCP/IP套接字编程连接到Telnet服务器并进行通信。如果您知道实现的协议,那么它将完美地工作。对于SSH等协议,除非您知道如何进行握手等操作,否则可能会很困难,但是简单的Telnet就像一种处理方式。

我尝试的另一种方法是在Java中使用外部进程System.exec()等,然后让Windows内置的Telnet为您执行任务,您只需向本地系统进程发送和接收数据即可。


0

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 <&${stream}


0

几个问题:

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

话虽如此,我之前写了一些Java代码,用于与几个IP启用的电源插座(BayTech RPC3)通信,这可能对您有用。如果您有兴趣,我可以看看是否能找到它并发布到某个地方。


0

我喜欢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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接