bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本

Posted

技术标签:

【中文标题】bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本【英文标题】:bash/expect/loop - how to loop a simple bash script doing telnet 【发布时间】:2013-12-30 13:21:06 【问题描述】:

我想循环运行这个脚本。

需要做的是读取该文件中包含 IP 地址的文件,例如:

10.0.0.0
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4

并在上面列出的每个 ip 上运行此脚本。

这就是我所拥有的:

#!/usr/bin/expect

spawn telnet 10.0.0.0
expect "User Name :"
send "username\r"

expect "Password  :"
send "password\r"
expect ">"
send "4\r"
expect "*#"
exit

如何让上面的脚本在 txt 文件中工作每个 IP。

【问题讨论】:

【参考方案1】:

这只是对@user3088572 答案的评论。逐行读取文件的惯用方式是:

set fildes [open "myhosts.txt" r]
while [gets $fildes ip] != -1 
    # do something with $ip

close $fildes

【讨论】:

【参考方案2】:

您可以在期望脚本中读取该文件。

打开文件并将文件描述符分配给一个变量,读取每一行并执行上面你写的代码。

set fildes [open "myhosts.txt" r]
set ip [gets $fildes]
while [string length $ip] > 0 

    spawn telnet $ip
    expect "User Name :"
    send "username\r"

    expect "Password  :"
    send "password\r"
    expect ">"
    send "4\r"
    expect "*#"
    exit
    set ip [gets $fildes]

close $fildes

【讨论】:

脚本运行良好!但它只使用 myhosts.txt 中的第一个 IP,它不使用 myhosts.txt 第一行下的 ip 但登录正常 对不起,我有那个退出要删除:D非常感谢你:) 它退出是因为我继承了您的拼写错误。说明退出的行应该发送“exit\r”,因为该行的目的是告诉生成的 telnet 退出。但是拼写错误告诉脚本退出。 exit更改为send "exit\r"; expect eof; exp_close; wait【参考方案3】:

我不是expect 的专家,但您需要做的第一件事是更改您的期望脚本以接受参数。它应该像这样工作(看起来你需要-f in #!/usr/bin/expect):

#!/usr/bin/expect -f

set ip [lindex $argv 0]
spawn telnet $ip
...

然后您可以在 bash 脚本中简单地遍历 IP 列表:

while read ip ; do
    myExpectScript $ip
done < list_of_ip.txt

【讨论】:

你能说得更具体点吗?哪一部分?您收到什么错误消息?

以上是关于bash/expect/loop - 如何循环执行 telnet 的简单 bash 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个循环执行ajax方法里面嵌套的ajax方法

如何让bat文件一直循环执行

计次循环如何让他执行完我调用的线程,再继续循环

sql写语句如何循环执行10000次

如何在for循环中执行多个查询

JavaScript for 循环是如何执行的?