#! /bin/bash
exelocal=1
sshcmd_comm()
{
#参数赋值,注意这里有加双引号
srccommand="$1"
descommand="$2"
password="$3"
r_option="$4"
timeout=180
#判断srccommand或者descommand 是否为null
if [ "x$srccommand" = "x" -o "x$descommand" = "x" ]; then
echo "wrong parameter"
exit 1
fi
#这个地方应该是写错了吧,数字判断是否相等应该用==
if [ $r_option = 1 ]; then
r_option="-r"
else
r_option=""
fi
#通过expect 执行交互命令
expect <<-END1
set timeout -1
spawn scp -o "ConnectTimeout ${timeout}" ${r_option} $srccommand $descommand
expect {
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
expect -re "\[P|p]assword:"
send "${password}\r"
}
-re "\[P|p]assword:" {
send "${password}\r"
}
timeout {
send_user "connection to $targetip timed out: \$expect_out(buffer)\n"
exit 13
}
eof {
#捕获ssh 远程执行的命令的返回的结果
catch wait result
exit [lindex \$result 3]
}
}
expect {
eof {
catch wait result
exit [lindex \$result 3]
}
-re "\[P|p]assword:" {
send_user "invalid password or account. \$expect_out(buffer)\n"
exit 13
}
timeout {
send_user "connection to $targetip time out: \$expect_out(buffer)\n"
exit 13
}
}
END1
return $?
}
usage()
{
echo "Usage: sshscp.sh -s "src" -d "des" [-p login_password] [-r]"
}
delete_known_hosts()
{
#往known_hosts 中写空文件的方式来删除
known_hosts=/root/.ssh/known_hosts
sudo > ${known_hosts}
}
src=
des=
loginpassword=
r_option=0
#parse 调用这个脚本时的可选参数
while getopts "u:p:s:d:hr" OPTIONS
do
case $OPTIONS in
p) loginpassword="$OPTARG";;
s) src="$OPTARG";;
d) des="$OPTARG";;
r) r_option=1;;
h) usage;exit 1;;
\?) echo "ERROR - Invalid Parameter"; echo "ERROR - Invalid parameter" >&2; usage; exit 1;;
*) echo "ERROR - Invalid Parameter"; echo "ERROR - Invalid parameter" >&2; usage; exit 1;;
esac
done
#判断字符串是否为null
if [ "x$src" = "x" -o "x$des" = "x" ]; then
echo "$src $des"
usage
exit 1
fi
#方式ssh 时失败,因此提示清空/root/.ssh/known_hosts 文件
delete_known_hosts
#调用前面的定义的函数,执行scp 命令
sshcmd_comm "$src" "$des" "$loginpassword" "${r_option}"
#返回sshcmd_comm 执行的结果
exit $?
utils/sshscp.sh
最新推荐文章于 2024-02-04 21:37:27 发布