【需求背景】
从不同机器之间批量copy大文件,想实现一个脚本自动化运作
【实现方法】
#!/usr/bin/expect
set user [lindex $argv 0]
set ip [lindex $argv 1]
set passwd [lindex $argv 2]
set srcfile [lindex $argv 3]
set dstdir [lindex $argv 4]
spawn scp $user@$ip:$srcfile $dstdir
expect {
"yes/no)?" { send "yes\r";puts "yes" }
"assword:" { send "$passwd\r" }
}
expect eof
【问题】
由于文件较大(10G-100G不等),每次拷贝文件,操作会在一段时间后就会自动中断,导致文件无法完全传输
【问题产生原因】
expect中执行命令是有一个timeout的设定的,默认超时时间为10s。
若一条命令未timeout限定时间内执行完,就会中断该条命令的下一条命令。
备注:
这个特性最初设置是为了防止某些命令执行完后导致死机的情况
【解决方案】
在expect脚本中设定timeout,覆盖原本的timeout即可
#!/usr/bin/expect
set user [lindex $argv 0]
set ip [lindex $argv 1]
set passwd [lindex $argv 2]
set srcfile [lindex $argv 3]
set dstdir [lindex $argv 4]
set timeout 2000
spawn scp $user@$ip:$srcfile $dstdir
expect {
"yes/no)?" { send "yes\r";puts "yes" }
"assword:" { send "$passwd\r" }
timeout { puts "$IP time out" ;exit 1 }
}
expect eof