我正在尝试同时ssh到多个主机并同时为所有主机执行相同的命令。我正在使用expect登录并自动发送命令。我创建的脚本可以工作,但是一个接一个地为每个主机连续地连接和执行命令。我想要的是让期望同时为所有主机工作,例如为每个主机创建子进程或在后台工作。
任何想法如何实现?
对于我的代码,我正在读取包含多个IP地址的文件并将其传递给脚本。
这是我的代码:
#! /bin/expect
set prompt ">"
set fd [open ./hosts r]
set hosts [read -nonewline $fd]
close $fd
foreach host [split $hosts "\n" ] {
set timeout 30
spawn ssh admin@$host
lappend spawn_id_list $spawn_id
}
foreach id $spawn_id_list {
set spawn_id $id
while (1) {
expect {
"ssh:" {
exit
}
"no)? " {
send "yes\r"
}
"password: " {
send "password\r"
}
"$prompt" {
send "some commands\r"
break
}
timeout {
exit
}
-re . {
exp_continue
}
eof {
exit
}
}
}
}
expect eof
答案 0 :(得分:1)
如何使用Expect' fork
?
根据Expect的manual:
fork
创建了一个新流程。新流程是该流程的精确副本 目前的期待流程。成功后,fork
会将0
返回给新成员 (子)进程并返回子进程的进程ID 到父进程。失败(总是由于缺乏 资源,例如交换空间,内存),fork
将-1
返回给 父进程,并且没有创建子进程。分叉进程通过
exit
命令退出,就像原始进程一样。允许分叉进程写入日志 文件。如果您没有禁用调试或登录大部分 这些过程,结果可能令人困惑。一些pty实现可能会被多个读者混淆 作家,甚至是暂时的。因此,以前最安全 产卵过程。