利用sshpass解决ssh与scp交互密码验证,tee -a 写日志与终端
众人所知,利用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之前你要安装它才行。