我正在尝试编写一个期望循环,它查看文本文件中的主机列表,然后从另一个以主机 IP 和文件 extension.txt 命名的文本文件运行一系列命令
例如,在 hosts.txt 文件中,我将定义以下主机:
192.168.1.1
192.168.3.1
192.168.2.197
ETC..
在另一个目录中,我将拥有如下命名的文件,其中包含我想在每个主机上运行的一组不同的命令:
192.168.1.1.txt 192.168.3.1.txt 192.168.2.197.txt
因此,如果主机 192.168.1.1 存在于 hosts.txt 中,它将针对该主机运行 192.168.1.1.1.txt 中的命令。为了实现这一目标,最简单的工具是什么?
最佳答案
我不是 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
/close
可能是错误的)。它应该看起来很相似。您可能会考虑将命令文件设置为(部分)期望脚本,您只是
source
.在这段代码中会更简单一些(代价是要求这些文件更复杂一些)。
关于ubuntu - 期望循环从文本文件运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162283/