使用Bash脚本自动化Telnet会话

92

我正在使用Bash脚本自动化一些与telnet相关的任务。

自动化后,用户将不需要与telnet进行交互(也就是说,脚本将完全自动化)。

脚本大致如下:

# execute some commands on the local system
# access a remote system with an IP address: 10.1.1.1 (for example)

telnet 10.1.1.1

# execute some commands on the remote system
# log all the activity (in a file) on the local system
# exit telnet
# continue with executing the rest of the script

我遇到了两个问题:

  1. 如何从脚本中在远程系统上执行命令(无需人为干预)?

    通过一些测试代码的经验,我发现当执行 telnet 10.1.1.1 命令时,telnet 进入交互会话,然后脚本中后续的代码会在本地系统上执行。那么,我该如何在远程系统上运行这些代码而不是在本地运行呢?

  2. 我无法获取本地系统中 telnet 会话的日志文件。使用的标准输出重定向操作会在远程系统上创建一个副本(我不想复制操作来将日志复制到本地系统)。我该如何实现这个功能?

13个回答

0

使用ssh来实现这个目的。生成不带密码的密钥,并将其放置在远程机器的.authorized_keys文件中。创建要在远程运行的脚本,将其复制到另一台机器上,然后只需使用ssh远程运行即可。

我多次使用此方法取得了巨大成功。还请注意,它比telnet更安全。


1
“ssh”相比于“telnet”来说更加安全,但是一些IP设备并没有提供“ssh”服务,只能依赖于“telnet”协议来使用该设备。 - fduff
2
telnet(该程序)可以用作任何(或更实际地说,大多数)基于文本的客户端/服务器连接的客户端。它可用于简单的测试,例如HTTP和IMAP。@Tomas的建议是将Telnet(远程登录服务)的使用替换为SSH。虽然他的评论是正确的,但这可能不是OP所需的。 - Rob Shepherd
Rob,telnet确实可以用于连接任何端口,但请看OP的问题 - 在他的上下文中,他只想使用telnet进行登录(引用:“在远程系统上执行一些命令”)。为此目的使用telnet非常危险。 - Tomas
这不是对问题的回答,该问题明确表示要使用现有脚本“自动化一些与Telnet相关的任务”。 - FractalSpace

0

获取思科服务器版本的脚本:

#!/bin/sh

servers='
192.168.34.1
192.168.34.3
192.168.34.2
192.168.34.3
'
user='cisco_login'
pass='cisco_password'

show_version() {
host=$1
expect << EOF
set timeout 20
set host $host
set user $user
set pass $pass
spawn telnet $host
expect "Username:"
send "$user\r"
expect "Password:"
send "$pass\r"
expect -re ".*#"
send "show version\r"
expect -re ".*-More-.*"
send " "
expect -re ".*#"
send "exit\r"
EOF
}

for ip in $servers; do
  echo '---------------------------------------------'
  echo "$ip"
  show_version $ip | grep -A3 'SW Version'
done

-4

使用 tcpdumpwireshark 进行操作,查看发送到服务器本身的命令。

试试这个

printf (printf "$username\r\n$password\r\nwhoami\r\nexit\r\n") | ncat $target 23

一些服务器需要在密码上延迟,因为它不会在堆栈上保留行。
printf (printf "$username\r\n";sleep 1;printf "$password\r\nwhoami\r\nexit\r\n") | ncat $target 23**

9
新手也不应该粗鲁无礼。请查看常见问题解答,网址为http://stackoverflow.com/faq。 - Verbeia
1
并不是要冒犯,更像是...我不知道,道歉。我只是一直看到人们使用expect命令作为解决方案。我只想让人们意识到有一个更好的解决方案来理解你想要实现的目标。expect命令不会向你展示它是如何工作的,它只是不知道时的权宜之计。这比不知道更加混乱。当你有疑问时,请查阅源代码。如果源代码不可用,并且它是一个网络协议,则可以使用tcpdump、wireshark、snoop数据包并跟踪命令流程,以便在具备工作知识的情况下组合出一些东西。 - str8
7
如果您这么说 - 我是一名Mathematica程序员,因此您的答案和评论内容对我来说是一个谜。但我并不是唯一一位将“白痴”一词解释为有意冒犯的人。我认为您需要花更多时间在该网站上观察人们的行为。 - Verbeia

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