1.方法1:简便方法
upload ()
{
/usr/bin/expect << EOD
spawn bash -c "scp -r /tmp/log1/* root@127.0.0.1:/tmp/log2"
for {} {1} {} {
"*(yes/no)?" { send "yes/n"; continue }
"*assword:" { send "password/n"; continue }
-re . { exp_continue }
eof { break }
}
EOD
}
由于expect和bash的关键字不一样,所以使用bash -c进行关键字转换,否则会出现找不到文件的提示。
2.方法2,用于密码又特殊字符的情况
TMP_EXPECT_FILE="/tmp/test_scp$$"
LOCAL_IP=`grep "IP" $(cd "$(dirname "$0")";pwd)/TEMP_IPFILE | awk -F"=" '{print $2}'`
#generate expect
echo '#!/usr/bin/expect
set LOCAL_IP [lindex $argv 0]
set REMOTE_IP [lindex $argv 1]
set CP_FILE [lindex $argv 2]
set REMOTE_DIR [lindex $argv 3]
set USER [lindex $argv 4]
set PASSWD [lindex $argv 5]
set timeout 5
set timeout -1 用于无限时间
spawn scp -o BindAddress=$LOCAL_IP -o "RSAAuthentication no" -o "PublicKeyAuthentication no" $CP_FILE $USER@$REMOTE_IP:$REMOTE_DIR
expect {
"*Connection refuse*" { exit 1 }
"*yes/no*" { send "yes/n";exp_continue }
*assword*" { send "$PASSWD/n" }
}
expect {
"*assowrd*" { send "PWSSWD/n"; exp_continue }
"*:~*" { exit 0 }
"*denied*" { exit 1 }
"*try again*" { exit 1 }
"*Last login:*" { exit 0 }
}
expect timeout { exit 1}
expect eof
' > ${TMP_EXPECT_FILE}
chmod u+x ${TMP_EXPECT_FILE} || return 1
expect -d -f "${TMP_EXPECT_FILE}" "$LOCAL_IP" "$REMOTE_IP" "$CP_FILE" "$REMOTE_DIR" "$USER" "$PASSWD" 2>&1 >> $LOG
return $?