#!/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
需要拷贝目录时目录名后不要带 /, 否则会拷贝该目录下的所有文件
对rsync不熟悉的朋友,请参阅如下文章: