[toc]
Linux互信一鍵配置腳本-多功能版
應廣大網友要求,更新一篇多功能版本的互信腳本。
Linux互信(SSH互信)是通過 SSH密鑰認證實現兩台或多台Linux服務器之間的無密碼登錄,主要用於自動化部署、集羣管理和系統維護等場景。
新加功能
- 由於服務器賬號密碼可能不統一,腳本添加區分賬號密碼功能。
- 支持從文件讀取服務器信息,如果服務器數量過多可使用此功能。
#!/bin/bash
echo -e "\e[31m友情提示:此腳本共用私鑰,存在安全風險,生產環境勿用!!!\e[0m"
OS=`awk -F'"' '/PRETTY_NAME/{print $2}' /etc/os-release|tr ' ' '-'`
# 配置統一密碼(改為自己的服務器密碼)
export SSHPASS=waluna
# 服務器密碼文件名
SVR_FILE="svr_info.txt"
# 注意:IPLIST 和 SVR_LIST 只能填寫一處,建議註釋或刪掉!!!
# 記得填寫本機IP!!!
# IP列表
#IPLIST="10.0.0.9
#10.0.0.19
#10.0.0.29"
# 服務器信息(格式:IP 用户 密碼)
SVR_LIST="10.0.0.9 root waluna
10.0.0.19 luna waluna01
10.0.0.29 admin admin123
10.0.0.39 ubuntu admin"
# 安裝sshpass
if [[ $OS == CentOS* ]];then
rpm -q sshpass || {
if yum install sshpass -y; then
echo -e "\e[32;1m sshpass已經安裝\e[0m"
else
echo -e "\e[31;1m sshpass安裝失敗,請檢查網絡或源配置\e[0m"
exit 7
fi
}
elif [[ $OS == Ubuntu* ]];then
dpkg -s sshpass || {
if apt install sshpass -y; then
echo -e "\e[32;1m sshpass已經安裝\e[0m"
else
echo -e "\e[31;1m sshpass安裝失敗,請檢查網絡或源配置\e[0m"
exit 7
fi
}
else
echo -e "\e[31m不支持此係統\e[0m"
exit 7
fi
# 生成本機密鑰
if [ ! -f ~/.ssh/id_rsa ]; then
ssh-keygen -f ~/.ssh/id_rsa -P ''
fi
# 用户密碼統一
loop_for() {
# 配置互信並拷貝密鑰
for IP in $1; do
sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $IP
scp -o StrictHostKeyChecking=no ~/.ssh/id_rsa $IP:~/.ssh/
if [ $? -eq 0 ]; then
echo -e "\e[32;1m $IP 互信配置完成!\e[0m"
else
echo -e "\e[31m 請檢查腳本配置\e[0m"
fi
done
}
# 用户密碼不統一
loop_while() {
echo "$1" | while read -r IP USER PASS; do
sshpass -p "$PASS" ssh-copy-id -o StrictHostKeyChecking=no "$USER"@"$IP"
scp -o StrictHostKeyChecking=no ~/.ssh/id_rsa "$USER"@"$IP":~/.ssh/
if [ $? -eq 0 ]; then
echo -e "\e[32;1m $IP 互信配置完成!\e[0m"
else
echo -e "\e[31m 請檢查腳本配置\e[0m"
fi
done
}
# 判讀採用變量還是文件
if [ ! -f $SVR_FILE ]; then
if [ -n "$IPLIST" ] && [ -z "$SVR_LIST" ]; then
loop_for "$IPLIST"
elif [ -n "$SVR_LIST" ] && [ -z "$IPLIST" ]; then
loop_while "$SVR_LIST"
else
echo -e "\e[31m請按要求填寫,IPLIST 和 SVR_LIST 只能填寫一出\e[0m"
exit 7
fi
else
NUM=$(head -1 "$SVR_FILE" | awk '{print NF}')
if [ $NUM -eq 1 ]; then
loop_for "$(cat "$SVR_FILE")"
elif [ $NUM -eq 3 ]; then
loop_while "$(cat "$SVR_FILE")"
else
echo -e "\e[31m請檢查服務器信息\e[0m"
exit 7
fi
fi
友情提示:此腳本共用私鑰,存在安全風險,生產環境勿用!
此腳本實現方式是在本機生成一個密鑰對,將公鑰分發至各服務器,再將私鑰拷貝到各服務器,以此實現各個服務器實現的相互通信。
如果不想使用sshpass也可以使用expect,但是expect不支持一些特殊符號,有侷限性,大家可以自行選擇。
關於我
全網可搜《阿賢Linux》
CSDN、知乎、嗶哩嗶哩、博客園、51CTO、掘金、思否、阿里雲、騰訊雲、華為雲、今日頭條、百家號、GitHub、個人博客
公眾號:阿賢Linux
個人博客:blog.waluna.top
https://blog.waluna.top/
原文鏈接: Linux互信一鍵配置腳本-多功能版.