Expect Loop从文本文件运行命令

时间:2014-06-11 11:53:18

标签: ubuntu tcl expect

我正在尝试编写一个expect循环,它查看文本文件中的主机列表,然后从另一个以主机IP和文件extension.txt命名的文本文件中运行一系列命令

例如,在hosts.txt文件中,我将定义以下主机:

192.168.1.1
192.168.3.1
192.168.2.197

等。

在另一个目录中,我将使用一组不同的命令命名如下:我希望在每个主机上运行这些命令:

192.168.1.1.txt 192.168.3.1.txt 192.168.2.197.txt

因此,如果hosts.txt中存在主机192.168.1.1,它将针对该主机运行192.168.1.1.txt中的命令。为了实现这一目标,最简单的工具是什么?

1 个答案:

答案 0 :(得分:1)

我不是100%肯定,但解决方案的部分是:

# Read-a-file helper procedure
proc readFile {filename} {
    set f [open $filename]
    set content [read $f]
    close $f
    return $content
}

foreach host [split [readFile hosts.txt] "\n"] {
    if {[catch { set commands [readFile $host.txt] }]} continue
    spawn ssh $host
    # ... handle connecting ...
    # get a prompt ...
    expect -ex "$ "
    foreach line [split $commands "\n"] {
        send $line\r
        # Get the prompt
        expect -ex "$ "
    }
    send "exit\r"
    expect eof
    close
}

这将为您提供主机和针对该主机运行的命令,跳过缺少的文件,然后将每个文件的每一行发送到相应的主机,同时设置和拆除所有连接的连接。我已经跳过了如何处理密码的问题,而且我对此并不是100%肯定(我不是常规的Expect用户,所以expect eof / { {1}}可能是错的)。它应该看起来非常相似。

您可以考虑使命令文件(部分)期望您只是close的脚本。在这段代码中更简单一点(代价是要求这些文件稍微复杂一点)。