其中send -- "/usr/bin/svn upr"改成send -- "/usr/bin/nohup /usr/bin/svn up & r"会更好,前者在内网没问题,在公网可能会不行,可能会因为执行时间过长而中断。

这个脚本还需要一个pwd.txt文件,pwd.txt文件用于存放需要更新的服务器列表信息,格式为:

ip1     username       passwd

ip2     username       passwd
...

因为我目前用的是普通用户,如果这里是用root,那脚本里的expect "$"需要改成expect "#"

svnsshup.exp为:

#!/usr/bin/expect -d


set timeout 90
#exp_internal 1
proc do_ssh_login {host username pass} {
    set timeout_case 0
    set done 1

    send_user "n"
    spawn ssh $username@$host
    send_user "Connecting host $hostn"
    while {$done} {

        expect {
            timeout {
                switch -- $timeout_case {
                    0 { send "n" }
                    1 {
                        send_user "retrying...n"
                        send "n"
                    }
                    2 {
                        puts stderr "login timeout...n"
                        close
                        set done 0
                        break
                    }
                }
                incr timeout_case
            }

            "*(yes/no)?" {send "yesn"}
            "Password:" {send "$passn"}
            "password:" {send "$passn"}
            "*Permission denied*" {
                send_user "Permission deniedn"
                close
                set done 0
                break
            }
            "*Connection refused*" {
                send_user "Connection refusedn"
                close
                set done 0
                break
            }
            "*$*" {
                send -- "cd /home/top_city/dev.xxxx.com/topcity/r"
                expect "$"
                send -- "/usr/bin/svn upr"
                #sleep 70
                expect {
                    "$" {
                        set done 0
                        send_user "n"
                        send "exitn"
                    }
                }
            }
        }
    }

}

set f [open "pwd.txt" r]
while { [gets $f line] >= 0 } {
    do_ssh_login [lindex $line 0] [lindex $line 1] [lindex $line 2]
}

close $f