众人所知,利用ssh与scp连接远程linux主机与传输文件的时候需要交互式的输入密码,有时候我们写脚本的时候,需要自动的输入密码,ssh可以利用密钥方式免输入密码。今天我所讲的是利用sshpass(google一下下载)进行非交互式输入密码。据说也可以利用except,具体的用法你可以google一下,我今天只讲sshpass的用法。
#!/bin/sh
#在打包目录自动对设备进行升级
PASSWORD=admin@rizhi
USERNAME=root
FILENAME=log.txt
IP="200.200.103.1,200.200.103.3,200.200.103.7,200.200.103.9"
LOG_NAME=auto_update_log.txt
#打印错误代码并退出
die()
{
ecode=$1;
shift;
echo "$*, exit $ecode$" | tee -a $LOG_NAME;
exit $ecode;
}
#[ $# -lt 2 ] && usage
update_device()
{
iparr=`echo $IP | sed 's/,/ /g'`
echo "IP = [$iparr]" | tee -a $LOG_NAME
for iptem in $iparr
do
iptem=`echo $iptem | sed 's/ //g'`
echo "auto_update device ${iptem} ${CGREEN}step 1:upload ${FILENAME}...${C0}" | tee -a $LOG_NAME
sshpass -p ${PASSWORD} scp -P 222 vtp.pkg ${USERNAME}@${iptem}:/sf/ | tee -a $LOG_NAME
if [ $? -ne 0 ]; then
echo "${CRED}auto_update device ${iptem} step 1:upload ${FILENAME} FAILED!${C0}" | tee -a $LOG_NAME
continue
fi
echo "auto_update device ${iptem} ${CGREEN}step 2: update from pkg...${C0}" | tee -a $LOG_NAME
sshpass -p ${PASSWORD} ssh -p 222 ${USERNAME}@${iptem} "cd /sf;chmod u+x vtp.pkg;if [ $? -eq 0 ];then reboot;else echo update fail;fi" | tee -a $LOG_NAME
if [ $? -ne 0 ]; then
echo "${CREAD}auto_update device ${iptem} step 2:update from pkg FAILED!${C0}" | tee -a $LOG_NAME
continue
fi
done
}
main()
{
update_device
rm -f vtp.pkg
}
main $*
exit 0
由以上代码:红色标记的则为重点使用sshpass传入密码给scp和ssh,并进行操作。
我在代码中利用tee -a $LOG_NAME,这是把打印的信息既可以打印大终端(屏幕)有可以写入$LOG_NAME 中。在使用sshpass之前你要安装它才行。