如何在生成后为多个主机同时执行相同的期望

时间:2017-10-25 11:03:35

标签: parallel-processing background-process expect spawn simultaneous

我正在尝试同时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

1 个答案:

答案 0 :(得分:1)

如何使用Expect' fork

根据Expect的manual

  

fork创建了一个新流程。新流程是该流程的精确副本   目前的期待流程。成功后,fork会将0返回给新成员   (子)进程并返回子进程的进程ID   到父进程。失败(总是由于缺乏   资源,例如交换空间,内存),fork-1返回给   父进程,并且没有创建子进程。

     

分叉进程通过exit命令退出,就像原始进程一样。允许分叉进程写入日志   文件。如果您没有禁用调试或登录大部分   这些过程,结果可能令人困惑。

     

一些pty实现可能会被多个读者混淆   作家,甚至是暂时的。因此,以前最安全   产卵过程。