我正在尝试编写一个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中的命令。为了实现这一目标,最简单的工具是什么?
答案 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
的脚本。在这段代码中更简单一点(代价是要求这些文件稍微复杂一点)。