expect 命令

本人喜欢用shell写一些同步逻辑,但是会需要用到同步文件,并远程执行脚本的需求

使用expect命令的时候,我是嵌在shell里面执行的

下面是拷贝文件过去的例子:

expect -c "
    set timeout 30;
    spawn scp /home/data/fname.txt root@100.10.140.3:/home/data/
    expect {
        \"*assword\" { send \"$password\r\"; exp_continue;}
        \"*yes/no*\" {send \"yes\r\"; exp_continue;}
        eof { send_user \"error response\"}
    }
"

set timeout 30; 是为了防止同步的时候文件过大,导致会话被提前中断, 所以设置了30秒超时

下面是远程执行命令的例子:

expect -c "
    set timeout 30;
    spawn ssh root@100.10.140.3 \"pwd;cd /root;sh exec_cmd.sh;\"
    expect {
        \"*assword\" { send \"$password\r\"; exp_continue;}
        \"*yes/no*\" {send \"yes\r\"; exp_continue;}
        eof { send_user \"error response\"}
    }
"

上面两个例子都用到一个很关键的set timeout,这个设置时常,可以防止命令提前终止,如果遇到超大文件,或者更慢的命令,需要设置更长的时间,才能保证expect能达到预期的效果