ssh登陸自動填充密碼

問題

要經過一個跳板機ssh登陸其餘主機,每次使用ssh hostIp -l username再輸入密碼的方式太耗時,想要進行密碼自動填充php

解決

使用expect+bash shell
ssshHost.sh腳本中封裝expect的ssh登陸自動填充密碼功能linux

  • 使用expect的自動填充密碼功能+interact交互功能
  • (hostIp, connectionStr)寫入配置文本或者直接在shell腳本做爲字典
  • shell讀取用戶輸入hostIp,匹配出connectionStr,調用expect進行ssh登陸,相關操做完成後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

其中:安全

  • expect部分設置timeout爲3600s強制退出
  • interact 開啓交互模式
  • return $? 返回上一個命令執行結果,0:正常執行,正值:異常
  • declare -a hostInfoDict聲明shell字典
  • ["127"]="127.0.0.1 username passwd" [hostIpNickName]="hostIp userName passWD"
  • $# 獲取輸入參數個數
  • [ $# -ne 1 ] 對於數值比較,要用文本類型描述,如:neeqgt等,對於字符串比較,用符號描述,如:==!=>
  • sshHostIp=$1 獲取第一個參數,即hostIpNickName
  • IFS=" " 設置分隔符,注意保護現場與恢復現場
  • (${hostInfoDict[$sshHostIp]}) shell字典取值使用${}

執行腳本:
ssshHost.sh 127bash

存在的安全性等問題

一、 ssh的用戶名、密碼爲明文,很容易泄露
二、只要經過前臺登陸上堡壘機,都能執行該腳本登陸相關主機
三、若是設置timeout = -1永不過時,若ssh鏈接界面沒有使用ctrl+d,而是直接關閉界面的話,該腳本不會退出,一直停留在後臺
四、ssh登陸到別的主機以後,存在中文亂碼現象。ssh

相關解決方案思考:
一、 將shell腳本加密,或者使用編譯後的C來調用該腳本
二、沒有好方法,若是要進行密碼校驗的話,失去了腳本的基本功能-_-!
三、根據場景設置了3600s強制下線,這個能夠新增一個腳本對當前相似於僵死進程kill
四、在跳板機增長LANG=zh_CN.GBK,默認以GBK登陸
容我再想一想……加密

參考文章

shell expect的簡單用法
shell數組和字典spa

相關文章
相關標籤/搜索