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

使用python脚本通过telnet在远程主机上执行命令,python,linux,bash,shell,telnet,Python,Linux,Bash,Shell,Telnet,我一直在试图写一个脚本来简化我的一系列工作。我用shell命令试过了,但是代码看起来太直截了当了,老实说,也太业余了。我正在努力学习python的脚本编写,在您的帮助下,我希望我的这个问题能够变成一个解释性的实践 以下是我编写的shell代码: 正如您可能已经猜到的,此代码是为特定的交换机接口设计的。用户名和密码提示以单行形式出现。为了执行多个命令,我需要特定的shell级别(例如调试级别)。我在这里也使用了expect模块,但我认为它只是传递,没有检查expect部分中的字符串 我想做什么?

我一直在试图写一个脚本来简化我的一系列工作。我用shell命令试过了,但是代码看起来太直截了当了,老实说,也太业余了。我正在努力学习python的脚本编写,在您的帮助下,我希望我的这个问题能够变成一个解释性的实践

以下是我编写的shell代码:

正如您可能已经猜到的,此代码是为特定的交换机接口设计的。用户名和密码提示以单行形式出现。为了执行多个命令,我需要特定的shell级别(例如调试级别)。我在这里也使用了expect模块,但我认为它只是传递,没有检查expect部分中的字符串

我想做什么?
我需要远程登录到已知IP地址列表(20台服务器)。
所有服务器都有相同的用户名和密码。
我需要在每台服务器上执行这些命令集,并将任何输出返回到指定目录下的单独日志文件(例如/tmp/dir)。
另外,有几个命令需要“双击”才能执行!这就是为什么我使用了\n\n after traceback命令

感谢您的帮助。

提前感谢,

您应该能够使用fabric为多台服务器运行相同的命令


我已经为自己编写了以下代码,希望这些代码能够帮助寻找类似解决方案的人:

#!/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
}
#/usr/bin/expect
设置超时150
数组集主机{0 1 2 3 4 5 6 7 8 9 10 11}
对于{set i 0}{$i<12}{incr i}{
生成telnet$hosts($i)
应为“输入用户名和密码”
发送“根目录\r\n”
睡眠2
预期“>”{send“print'*********************$hosts($i)*******************'\n}
应为“>”{send”命令\n}
应为“>”{send”命令\n}
应为“>”{send”命令\n}
应为“输入子命令”
应为“>”{send”命令\n\n“}
应为“>”{send”命令\n}
应为“>”{send”命令\n}
预期“>”{send“print'*********************$hosts($i)*******************'\n}
互动
}
正如我在问题描述中提到的,此代码是专门设计用于北电DMS类型交换机的,因此请参阅我的代码可能的低级设计。。重要的是它能起作用并满足我们的需求:)


干杯

那么,您是否要求有人将expect脚本翻译成python脚本?请看一下python,并将所有命令等放在一个iterable中(例如dict)。尝试迭代这些“集合”数据,并在这个for循环中完成您的工作。或者,继续使用
expect
,并学会爱上这种语言,就像Python是一种能够完成所有需要的事情(包括循环、命令行参数处理等)的动态脚本语言一样。您尝试过吗?@silentphoenix,谢谢你提醒我!我将看一看您指出的示例以及telnetlib。你好,谢谢,伙计,以前从没听说过。我现在检查一下,它实际上不是服务器。他试图做的是通过telnet运行大量命令。我认为Fab不支持telnet作为传输机制。所有这些实用程序都是通过SSH运行的。
#!/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
}