使用 python 脚本通过 telnet 在远程主机上执行命令

Execute commands on remote host via telnet with python script

我一直在尝试编写一个脚本来简化我的一组工作。我用 shell 命令尝试过,但代码看起来太直接了,老实说太业余了。我正在尝试学习 python 编写脚本,在您的帮助下,我希望我的这个问题可以变成一种解释性练习。

下面是我写的shell代码:

#!/usr/bin/expect 

spawn telnet IPaddress
sleep 0.1
expect "Enter username and password"
send "username password \n"
sleep 0.1
send "debug; \n"
sleep 0.1
send "def t1 suspend_loader \n"
expect "enter subcommands"
send "traceback \n \n;"
sleep 1
send "act t1 \n"
sleep 0.1
send "quit \n"
sleep 0.1
send "stor2tst;audit_modules \n"
expect "PS Checksum audit completed"
send "quit \n"
sleep 0.1
send "debug"
sleep 0.1
send "print t1 \n"
sleep 0.5
send "quit \n"
sleep 0.1
send "logutil;open MOD;back all;quit \n"
sleep 0.1
send "debug \n"
sleep 0.1
send "di modules:pr.514 d 1 (&0) char n=68 \n"
send "quit \n"
sleep 1
send "quit \n"
send "logout \n"



interact

你可能也已经猜到了,这段代码是为特定的switch接口设计的。用户名和密码提示出现在一行中。为了执行多个命令,我需要特定的 shell 级别(例如调试级别)。我在这里也使用了 expect 模块,但我认为它只是在不检查 expect 部分中的字符串的情况下继续传递..

我想做什么?
我需要远程登录到已知 IP 地址列表(20 台服务器)。
所有服务器都有相同的用户名和密码。
我需要在每台服务器上执行这些命令集,并且 return 将指定目录下的日志文件分开的任何输出(例如 /tmp/dir)。
此外,一些命令需要 "double enter" 才能执行!这就是为什么我在 traceback 命令之后使用 \n \n 的原因。

感谢任何帮助。
提前致谢,

您应该能够使用 fabric 运行 对多个服务器执行相同的命令。

http://www.fabfile.org/

http://docs.fabfile.org/en/1.10/usage/execution.html#roles

我自己编写了以下代码,希望这对可能正在寻找类似解决方案的人有所帮助:

#!/usr/bin/expect

set timeout 150

array set hosts {0 <IPaddr> 1 <IPaddr> 2 <IPaddr> 3 <IPaddr> 4 <IPaddr> 5 <IPaddr> 6 <IPaddr> 7 <IPaddr> 8 <IPaddr> 9 <IPaddr> 10 <IPaddr> 11 <IPaddr>}

for {set i 0} {$i < 12 } { incr i } {

spawn telnet $hosts($i)
expect "Enter username and password"
send "root toor \n"
sleep 2
expect ">" {send "print '****************$hosts($i)****************' \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect "enter subcommands"
expect ">" {send "command \n\n"}
expect ">" {send "command \n"}
expect ">" {send "command \n"}
expect ">" {send "print '****************$hosts($i)****************' \n"}
interact
}

正如我在问题描述中提到的,此代码专门设计用于 Nortel DMS 类型的交换机,因此请原谅我可能的代码低级设计。重要的是它可以工作并满足我们的需求.. :)

干杯!