expect 远程交互脚本

本文着重介绍如何通过expect 来完成远程服务器程序的升级,对于想了解他的朋友只是个引子。目前该程序测试已成功。

主要有三个文件:

        1、要升级的程序:

                                        firstapp

                                        update.sh

                                        ip.txt     

firstapp: 是你修改的程序,将要去替换服务器上正在运行的程序。

update.sh: 就是用expect编写的交互脚本。

ip.txt:     为服务器的IP地址,如果服务器过多,可全部写入该文件,#号可注释掉某行 ,也可用//添加注释


                                       

update.sh脚本内容如下:

#!/usr/bin/expect -f


proc my_fun {ip} {

    set USER "tony"
    set PASSWD "123456"
    set FILE    "firstapp"
    set BACKUP "${FILE}_`date +%Y%m%d`"

    set PATH "/home/tony/bin/"


    set timeout -1

    spawn scp ${FILE} ${USER}@${ip}:/tmp/
    expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send "${PASSWD}\r" }
    }
    
    expect eof
    
    spawn ssh -l ${USER} ${ip} 
    expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send "${PASSWD}\r" }
    }

    expect {
        "*$ " { send "sudo killall ${FILE}\r" }
        "*$" { send "${PASSWD}\r" }
    }

    expect "tony:"
    send "${PASSWD}\r"
    
    expect {
        "*$ " { send "rm ${PATH}${FILE}-* ${PATH}${FILE}_*; mv ${PATH}${FILE} ${PATH}${BACKUP}; cp /tmp/$FILE ${PATH}; chmod 777 ${PATH}${FILE}\r" }
        "*$" { send "rm ${PATH}${FILE}-* ${PATH}${FILE}_*; mv ${PATH}${FILE} ${PATH}${BACKUP}; cp /tmp/$FILE ${PATH}; chmod 777 ${PATH}${FILE}\r" }
        
    }
    
    expect {
        "*$ " { send "${PATH}${FILE} &\r" }
        "*$" { send "${PATH}${FILE} &\r" }
    }
    
    expect {
        "*$ " { send "ll $PATH |grep ${FILE}\r" }
        "*$" { send "ll $PATH |grep ${FILE}\r" }
    }
    
    expect {
        "*$ " { send "exit\r" }
        "*$" { send "exit\r" }
    }
    
    expect eof

}

set fd [open ip.txt r]
set done 0

while {[gets $fd line] >= 0} {

    incr done    
    set ops [string first "#" $line]
    
    if { ${ops} == -1 } {
        set index [string first "/" $line]
        if { ${index} != -1 } {
            set line [string range $line 0 [expr $index-1]]
            set line [string trim $line]
        }
        
        if { "$line" != "" } {
            puts "(${done}) /***************************Client IP: $line*******************************/"
            my_fun $line
        }
    }

}

close $fd


运行时会提示你安装expect,几秒钟的事情。

spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。

expect {
        "*$ " { send "sudo killall ${FILE}\r" }
        "*$" { send "${PASSWD}\r" }
    }

意思是说直至"$"或者"$ "出现,这个空格是我调试时发现的,我这ubuntu系统会多一个空格。大家注意下到底自己的系统返回的是什么就行了,则会一直阻塞在这,因为我们对ecpect设置了阻塞模式”set timeout  -1“ 。while中也只是简单的读取文件操作,这就不解释了,呵呵,我也只是为了升级方便乱写的。


最后贴下ip.txt的内容:

192.168.1.100  //升级该IP地址的服务器程序
#192.168.1.102 //这个我不想升级,我用#注释掉

192.168.1.101 //等1.100 升级完成,下个就到我了


PS: 该文存在诸多BUG,别当真!!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值