首页 > 代码库 > expect使用

expect使用

有些命令却需要用户手动去就交互如passwd、scp


对自动部署免去用户交互很痛苦,expect能很好的解决这类问题。


expect的核心是spawn expect send set


spawn 调用要执行的命令

expect 等待命令提示信息的出现,也就是捕捉用户输入的提示:

send 发送需要交互的值,替代了用户手动输入内容

set 设置变量值

interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif


expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。


设置expect永不超时

set timeout -1


设置expect 300秒超时,如果超过300没有expect内容出现,则退出

set timeout 300

使用实例:

批量发送ssh秘钥

allip=`nmap -v -sP 192.168.238.0/24|grep 192.168|grep -v "down"|grep -v 192.168.238.2 |cut -d " " -f5 2>/dev/null` 通过nmap扫描ip,获取ip

        [ ! -x /usr/bin/expect ] && yum install expect -y  判断是否安装了expect因为默认是没有安装的

下面就是一个循环了 

        for i in $allip;do

                if [[ $i =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]];then

                /usr/bin/expect <<EOF

                set timeout 10

                spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i

                expect {

                        "password" {send "redhat\n"}

                }

        expect eof

EOF


这样就可以自动把自己主机上的秘钥发送到对应的主机上面


本文出自 “12336320” 博客,请务必保留此出处http://12346320.blog.51cto.com/12336320/1896781

expect使用