背景
兩臺linux主機
A:本地主機,IP:192.168.1.81
B:服務主機,IP:192.168.1.91
要滿足需求
- 從A上傳文件到B
- 全程腳本實現,不能人工輸入
制作SSH證書
在A主機制作證書,-P參數是密碼,注意這里我的用戶是root,這里的密碼是證書密碼,如果你的腳本要運行在jenkins里,而又沒有為jenkins創建用戶目錄,后續的腳本寫法就會有問題并且還暴露root密碼,最好的做法是在jenkins用戶下創建證書
[root@centos]# ssh-keygen -t rsa -P 'mypassword'
把A的證書,推送到B上
[root@centos]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.91
測試登錄,輸入制作證書時的密碼“mypassword”,沒設密碼直接回車
[root@centos]# ssh 192.168.1.91
如果登錄成功,則當前執行的指令都是B主機上,所以要退出回到A
[root@centos]# exit
安裝 expect
expect主要是可以根據反饋來做出不同判斷,從而自動輸入密碼
yum install expect
自動上傳bash腳本
這個腳本是運行在jenkins里的,但是沒有為jenkins創建用戶目錄,證書也是以root的賬戶制作的,所以就必須要暴露root密碼了
#!/bin/sh
src_dir=/home/android_debug/apk #本地文件目錄
target_dir=root@192.168.1.91:/home/uploadapp/ #服務器目錄
root_password=rootpassword #root賬號密碼
ssh_password=mypassword #證書密碼
upload2server()
{
if [ $# -eq "3" ];then #如果參數個數等于3
src=$1
dest=$2
pwd=$3
#expect做反饋和控制,-d參數是輸出調試信息
/usr/bin/expect -d<<-EOF
set timeout -1
spawn su - root #切換到root用戶的環境
expect {
"*password*" { send "${pwd}\r";}
"*密碼*" { send "${pwd}\r";}
}
send "scp ${src} ${dest}\r" #上傳文件
expect {
"*passphrase*" { send "${ssh1_password}\r";}
}
expect 100%
#這個地方很重要,如果匹配到100%代表上傳成功
#這時候要發退出root環境,否則會一直等待到超時
send "logout\r"
expect eof
exit 0
EOF
fi
}
mv ${src_dir}/*.apk ${src_dir}/publish.apk
upload2server ${src_dir}/publish.apk ${target_dir} ${ssh_password}