首頁 > 軟體

Shell自動化設定SSH免密登入和取消SSH免密設定指令碼

2022-07-28 14:01:38

1. 前文

搭建了一套有多臺主機的區域網環境,不完全考慮安全性的情況下,為方便管理區域網內主機,設定SSH免密登入,因主機較多,前陣子針對設定ssh免密和取消ssh免密功能單獨寫了指令碼來自動化批次部署,現把兩個功能封裝在一起做成互動式程式

2.實現程式碼

#!/bin/bash
#Author:cosann
#Version:0.2
#date:2022/7/27
#description:批次部署SSH免密登入指令碼

E_ERROR=65

#傳參檢測
if [ $# -ne 1 ]
then 
    echo -e "Usage:$0 ip_list_file "
    exit E_ERROR
fi

#檔案檢測
if [ ! -f "$1" ]
then
    echo -e "IP_List_File $1檔案異常,請檢查內容"
    exit E_ERROR
fi 

#初始化
ip_list_file=$1
#從文字讀取值初始化變數
ip_address=(`awk '{print $1}' $ip_list_file`)
username=(`awk '{print $2}' $ip_list_file`)
password=(`awk '{print $3}' $ip_list_file`)

#安裝軟體檢測及部署環境設定
echo -e "》》》開始檢測依賴的必須元件是否安裝》》》n"
if [ `rpm -qa | grep "expect" &> /dev/null;echo $?` -ne 0 ]
then
    echo -e "未安裝必須元件Expect,開始執行安裝,請稍等..."
    ( yum install -y expect &> /dev/null && echo -e ">Expect安裝完成!" ) || ( echo -e "部署必須元件Expect失敗,請檢查Yum設定" && exit E_ERROR )
elif [ `rpm -qa | grep "openssl" &> /dev/null;echo $?` -ne 0 ]
then
    ( yum install -y openssh &> /dev/null && echo -e ">Openssh安裝完成!" ) || ( echo -e "部署必須元件Openssh失敗,請檢查Yum設定" && exit E_ERROR )
elif [ `rpm -qa | grep "openssh-clients" &> /dev/null;echo $?` -ne 0 ]
then
    ( yum install -y openssh-clients &> /dev/null && echo -e ">Openssh-clients安裝完成!" ) || ( echo -e "部署必須元件Openssh-clients失敗,請檢查Yum設定" && exit E_ERROR )
else
    echo -e ">必須元件Expect已安裝"
    echo -e ">必須元件Openssh已安裝"
    echo -e ">必須元件Openssh-clients已安裝"
fi


#列印選單
echo -e "n===============================================" 
echo -e "該指令碼可以實現批次部署和刪除SSH免密設定"   
echo -e "Author:Cosann"
echo -e "Create time:2022/07/27"
echo -e "===============================================" 
    while :
    do
    echo -e ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 
    echo -e "1. 設定SHH免密登入"
    echo -e "2. 取消SHH免密設定"
    echo -e "3. 退出程式"
    
    #功能控制及實現
    read -p "請輸入序號>>> " nu
    if [[ "$nu" == "3" ]]
    then
        #退出程式
        echo -e "n###!!!感謝使用,再見!!!###"

        exit 0
    elif [[ "$nu" == "1" ]]
    then    
        echo "開始推播"
        #檢測公鑰檔案是否存在,不存在則生成
        if [ ! -e "$HOME/.ssh/id_rsa.pub" ];then
            ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa
        else
            echo -e "》》》已建立公鑰檔案,開始向遠端伺服器推播公鑰》》》"
        fi

        #迴圈控制
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
            #echo -e "${ip_address[$i]}t${username[$i]}t${password[$i]}"
            #自動化互動實現推播ssh公鑰
            /usr/bin/expect<<-EOF
            spawn ssh-copy-id -i $HOME/.ssh/id_rsa.pub ${username[$i]}@${ip_address[$i]}
            expect {
            "*yes/no"    { send "yesr";exp_continue }
            "*password"  { send "${password[$i]}r" }
        }
        expect eof
EOF
        done
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "###推播完成,嘗試免密登入###"
        #推播公鑰成功免密結果通知
        for (( i=0;i<$count;i++ ))
        do
            /usr/bin/expect<<-EOF
            spawn ssh ${username[$i]}@${ip_address[$i]}
            expect "*]#"
            send "echo "##登入成功##"r"
            expect "*]#"
            send "exitr"
EOF
        done
        echo -e "-------------------------------------------"
        echo -e "已完成SHH免密設定,請嘗試SHH登入遠端主機確認"

    elif [[ "$nu" == "2" ]]
    then
        #自動化互動實現刪除設定免密的遠端主機上的authorized_keys
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
        /usr/bin/expect<<-EOF
        spawn ssh ${username[$i]}@${ip_address[$i]}
        expect "*]#"    
        send "rm -f /root/.ssh/authorized_keys 2> /dev/nullr"
        expect "*]#"
        send "exitr"
EOF
        done 
        echo -e "-------------------------------------------"
        echo -e "已取消SHH免密設定,請嘗試SHH登入遠端主機確認"

    else
        echo -e "33[41;37m 非法輸入,請檢查輸入!!! 33[0m"
    fi
done

3. 使用方法

3.1 使用前準備將程式碼複製到指令碼檔案,賦予執行許可權提前準備好IP地址使用者密碼檔案

3.2 IP地址使用者密碼檔案格式(注意!!!)

3.3 執行指令碼

#指令碼名 IP地址使用者密碼檔案
#舉例
./ssh.sh host.txt	#指令碼會判斷呼叫指令碼是否有指定IP地址使用者密碼檔案,沒有的情況下會執行指令碼失敗並提示

4. 使用注意

4.1 IP地址使用者密碼檔案格式請按照以上圖示標準填寫,內容不正確時會出現等待ssh登入或者重試的結果,這時候需要檢查組態檔的使用者名稱或者密碼是否錯誤

4.2 未在設定ssh免密的情況使用指令碼,需要多次ctrl+c強制退出指令碼

到此這篇關於Shell自動化設定SSH免密登入和取消SSH免密設定指令碼 的文章就介紹到這了,更多相關Shell SSH免密登入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com