要經過一個跳板機ssh
登陸其餘主機,每次使用ssh hostIp -l username
再輸入密碼的方式太耗時,想要進行密碼自動填充php
使用expect
+bash shell
在ssshHost.sh
腳本中封裝expect
的ssh登陸自動填充密碼功能linux
expect
的自動填充密碼功能+interact
交互功能(hostIp, connectionStr)
寫入配置文本或者直接在shell腳本做爲字典ctrl
+d
退出主要代碼:
expect部分:shell
function auto_login_ssh(){ expect -c " set timeout 3600; spawn ssh -o StrictHostKeyChecking=no $2; expect { *assword:* { send $1\r; } } interact " return $? }
bash shell部分:數組
declare -a hostInfoDict hostInfoDict=( ["127"]="127.0.0.1 username passwd" ) echo $# if [ $# -ne 1 ]; then echo "The args are problematic need hostIPNickName" exit 1 fi sshHostIp=$1 echo $sshHostIp # echo ${hostInfoDict[$sshHostIp]} OLD_IFS="$IFS" IFS=" " path_info_arr=(${hostInfoDict[$sshHostIp]}) IFS="$OLD_IFS" hostIP=${path_info_arr[0]} hostUser=${path_info_arr[1]} hostPassWD=${path_info_arr[2]} auto_login_ssh $hostPassWD $hostUser"@"$hostIP
其中:安全
timeout
爲3600s強制退出interact
開啓交互模式return $?
返回上一個命令執行結果,0:正常執行,正值:異常declare -a hostInfoDict
聲明shell字典["127"]="127.0.0.1 username passwd"
[hostIpNickName]="hostIp userName passWD"$#
獲取輸入參數個數[ $# -ne 1 ]
對於數值比較,要用文本類型描述,如:ne
、eq
、gt
等,對於字符串比較,用符號描述,如:==
、!=
、>
等sshHostIp=$1
獲取第一個參數,即hostIpNickNameIFS=" "
設置分隔符,注意保護現場與恢復現場(${hostInfoDict[$sshHostIp]})
shell字典取值使用${}
執行腳本:
ssshHost.sh 127bash
一、 ssh
的用戶名、密碼爲明文,很容易泄露
二、只要經過前臺登陸上堡壘機,都能執行該腳本登陸相關主機
三、若是設置timeout = -1
永不過時,若ssh鏈接界面沒有使用ctrl
+d
,而是直接關閉界面的話,該腳本不會退出,一直停留在後臺
四、ssh
登陸到別的主機以後,存在中文亂碼現象。ssh
相關解決方案思考:
一、 將shell腳本加密,或者使用編譯後的C
來調用該腳本
二、沒有好方法,若是要進行密碼校驗的話,失去了腳本的基本功能-_-!
三、根據場景設置了3600s強制下線,這個能夠新增一個腳本對當前相似於僵死進程kill
掉
四、在跳板機增長LANG=zh_CN.GBK
,默認以GBK
登陸
容我再想一想……加密