運維必備:批量實現(xiàn)Linux機器SSH免密登錄的自動化腳本
在某個大型項目的運維過程中,運維工程師小李需要在數十臺Linux服務器上執(zhí)行一項例行的系統(tǒng)更新任務。為了確保任務的高效完成,他需要在所有目標服務器之間實現(xiàn)SSH免密登錄,這樣可以避免每次登錄都手動輸入密碼,提高工作效率。然而,手動配置每臺服務器的免密登錄不僅耗時,而且容易出錯。
為了解決這個問題,小李決定編寫一個Shell腳本,自動批量地在所有目標服務器之間配置SSH免密登錄。本文將詳細介紹如何通過Shell腳本實現(xiàn)這一目標,幫助運維人員輕松應對類似的批量管理任務。
實現(xiàn)思路
- 首先在本地機器上生成SSH密鑰對,如果尚未生成;
- 接著準備一個包含目標服務器IP地址的文件和一個用于登錄的遠程用戶名和密碼;
- 然后編寫Shell腳本,讀取服務器列表并使用sshpass工具和ssh-copy-id命令將本地公鑰復制到每個遠程服務器的~/.ssh/authorized_keys文件中,以實現(xiàn)免密登錄;
- 最后,通過執(zhí)行該腳本,自動批量配置所有目標服務器的SSH免密登錄,以簡化和自動化運維操作。
腳本編寫
這個Shell腳本用于批量將SSH公鑰分發(fā)到多個目標主機,以實現(xiàn)免密登錄。腳本首先檢查必要的依賴和輸入,然后遍歷目標主機列表,將本地生成的SSH公鑰拷貝到每個目標主機上。
(1) 設置公鑰文件路徑
PUB_KEY_FILE="$HOME/.ssh/id_rsa.pub"
定義本地公鑰文件的路徑,默認路徑為~/.ssh/id_rsa.pub。
(2) 檢查sshpass是否安裝
# 檢查sshpass是否安裝
if ! command -v sshpass &> /dev/null; then
echo "sshpass 未安裝。請先安裝 sshpass,然后再運行此腳本。"
exit 1
fi
使用command -v檢查系統(tǒng)中是否安裝了sshpass工具。如果未安裝,則提示用戶安裝并退出腳本。
(3) 設置目標主機列表文件 ,并檢查文件是否存在
host_list_file="$1"
if [ ! -f "$host_list_file" ]; then
echo "錯誤: 文件 '$host_list_file' 不存在"
exit 1
fi
將第一個命令行參數(目標主機列表文件)賦值給host_list_file變量。
(4) 讀取目標主機列表并分發(fā)公鑰
while IFS= read -r host; do
echo "正在處理 $host..."
......
done < "$host_list_file"
使用while循環(huán)逐行讀取目標主機列表文件,每次讀取一個主機地址并賦值給host變量。
(5) 生成SSH密鑰對
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
fi
檢查本地是否已經存在SSH私鑰文件~/.ssh/id_rsa,如果不存在,則生成一個新的SSH密鑰對。
(6) 使用sshpass和ssh-copy-id將公鑰拷貝到目標主機上
sshpass -p "$password" ssh-copy-id -i ~/.ssh/id_rsa.pub "-p $ssh_port" "$host"
使用sshpass工具提供密碼,通過ssh-copy-id命令將本地公鑰拷貝到目標主機的~/.ssh/authorized_keys文件中。指定SSH端口和目標主機地址。
腳本使用
這邊準備了四臺測試機器,如下圖:
在跳板機上新建一個文件名為 deploy_ssh_keys.sh,并把腳本的內容復制進去,然后,保存退出。如下圖:
然后,為腳本賦予執(zhí)行的權限,執(zhí)行如下命令:
chmod +x deploy_ssh_keys.sh
接著,新建一個名為ip.txt的文件,用于存放ip列表的,內容格式如下:
192.168.31.185
192.168.31.232
192.168.31.210
192.168.31.209
運行如下命令,執(zhí)行腳本文件
./deploy_ssh_keys.sh ip.txt 22 123456
執(zhí)行成功后,會輸出如下信息。
最后,在跳板機上順便找一臺機測試,輸入結果如下:
結論
通過上述步驟和Shell腳本,你可以輕松地在多臺Linux服務器之間實現(xiàn)SSH免密登錄。這種方法適用于需要批量管理和自動化運維的場景,能夠極大提高工作效率。希望這篇教程對你有所幫助!