expect自动远程拷贝脚本,利用rsync命令,脚本内容如下:
#!/usr/bin/expect -- proc Usage_Exit {self} { puts "" puts "Usage: $self ip user passwd port sourcefile destdir direction bwlimit timeout" puts "" puts " sourcefile: a file or directory to be transferred" puts " 需要拷贝目录时目录名后不要带 /, 否则会拷贝该目录下的所有文件" puts " destdir: the location that the sourcefile to be put into" puts " direction: pull or push" puts " pull: remote -> local" puts " push: local -> remote" puts " bwlimit: bandwidth limit, kbit/s, 0 means no limit" puts " timeout: timeout of expect, s, -1 means no timeout" puts "" exit 1 } if { [llength $argv] < 9 } { Usage_Exit $argv0 } set ip [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set port [lindex $argv 3] set sourcefile [lindex $argv 4] set destdir [lindex $argv 5] set direction [lindex $argv 6] set bwlimit [lindex $argv 7] set timeoutflag [lindex $argv 8] set yesnoflag 0 set timeout $timeoutflag for {} {1} {} { # for is only used to retry when "Interrupted system call" occured if { $direction == "pull" } { if { $bwlimit > 0 } { spawn rsync -crazP --bwlimit=$bwlimit -e "/usr/bin/ssh -q -l$user -p$port" $ip:$sourcefile $destdir } elseif { $bwlimit == 0 } { spawn rsync -crazP -e "/usr/bin/ssh -q -l$user -p$port" $ip:$sourcefile $destdir } else { Usage_Exit $argv0 } } elseif { $direction == "push" } { if { $bwlimit > 0 } { spawn rsync -crazP --bwlimit=$bwlimit -e "/usr/bin/ssh -q -l$user -p$port" $sourcefile $ip:$destdir } elseif { $bwlimit == 0 } { spawn rsync -crazP -e "/usr/bin/ssh -q -l$user -p$port" $sourcefile $ip:$destdir } else { Usage_Exit $argv0 } } else { Usage_Exit $argv0 } expect { "assword:" { send "$passwdr" break; } "yes/no)?" { set yesnoflag 1 send "yesr" break; } "FATAL" { puts "nCONNECTERROR: $ip occur FATAL ERROR!!!n" exit 1 } timeout { puts "nCONNECTERROR: $ip Logon timeout!!!n" exit 1 } "No route to host" { puts "nCONNECTERROR: $ip No route to host!!!n" exit 1 } "Connection Refused" { puts "nCONNECTERROR: $ip Connection Refused!!!n" exit 1 } "Connection refused" { puts "nCONNECTERROR: $ip Connection Refused!!!n" exit 1 } "Host key verification failed" { puts "nCONNECTERROR: $ip Host key verification failed!!!n" exit 1 } "Illegal host key" { puts "nCONNECTERROR: $ip Illegal host key!!!n" exit 1 } "Connection Timed Out" { puts "nCONNECTERROR: $ip Logon timeout!!!n" exit 1 } "Interrupted system call" { puts "n$ip Interrupted system call!!!n" } } } if { $yesnoflag == 1 } { expect { "assword:" { send "$passwdr" } "yes/no)?" { set yesnoflag 2 send "yesr" } } } if { $yesnoflag == 2 } { expect { "assword:" { send "$passwdr" } } } expect { "assword:" { send "$passwdr" puts "nPASSWORDERROR: $ip Password error!!!n" exit 1 } eof { puts "OK_SCP: $ipn" exit 0; } }
用法:
./scp.exp Usage: ./scp.exp ip user passwd port sourcefile destdir direction bwlimit timeout sourcefile: a file or directory to be transferred 需要拷贝目录时目录名后不要带 /, 否则会拷贝该目录下的所有文件 destdir: the location that the sourcefile to be put into direction: pull or push pull: remote -> local push: local -> remote bwlimit: bandwidth limit, kbit/s, 0 means no limit timeout: timeout of expect, s, -1 means no timeout