【问题标题】:Execute commands on remote host via telnet with python script使用 python 脚本通过 telnet 在远程主机上执行命令
【发布时间】:2015-11-20 14:32:11
【问题描述】:

我一直在尝试编写一个脚本来简化我的一组工作。我用 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

您可能也猜到了,这段代码是为特定的开关接口设计的。用户名和密码提示在一行中。为了执行多个命令,我需要特定的 shell 级别(例如调试级别)。我也在这里使用了期望模块,但我认为它只是传递而不检查期望部分中的字符串..

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

任何帮助表示赞赏。
提前谢谢,

【问题讨论】:

  • 那么你是在找人把一个expect脚本翻译成python脚本吗?
  • 看看 Python 的 telnetlib 并将你所有的命令等放在一个可迭代的(例如字典)中。尝试遍历这些“数据集”并在此 for 循环中完成您的工作。
  • 或者,继续使用expect 并学会爱上TCL 语言,它像Python 一样是一种动态脚本语言,能够完成您需要的一切(包括循环、命令行参数处理等) )。
  • 你试过pexpect吗?
  • @silentphoenix,感谢您的提醒!我会看看你指出的例子和 telnetlib。问候,

标签: python linux bash shell telnet


【解决方案1】:

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

#!/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 类型的交换机上工作而设计的,所以请执行我的代码可能的低级设计。重要的是它可以工作并实现我们的需求.. :)

干杯!

【讨论】:

    【解决方案2】:

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

    http://www.fabfile.org/

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

    【讨论】:

    • 谢谢伙计,以前从未听说过。我现在去看看。
    • 它实际上不是服务器。他试图通过 telnet 运行一堆命令。我不认为 Fab 支持 telnet 作为传输机制。所有这些实用程序都通过 SSH 运行。
    猜你喜欢
    • 2012-01-12
    • 2012-08-23
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多