基于sshpass的非交互式SSH公鑰免密推送方法🔑
基于sshpass的非交互式SSH公鑰免密推送方法??
在Anolis OS 8操作系統上,因root用戶禁止登錄系統,所以給普通用戶做免密登錄。(root用戶也是如此,替換腳本中的USER變量即可)
[root@localhost ~]# yum install -y sshpass
# 生成公鑰文件
[root@localhost ~]# ssh-keygen -f /root/.ssh/id_rsa -P ''
# 編寫批量推送免密腳本
[root@localhost ~]# vim sshpush.sh
#!/usr/bin/bash
?
set -e
set -x
?
# 定義密碼(目標主機)
export SSHPASS="Choir@3423\$sf434" # 密碼有特殊字符,如"$",需\轉義
# 定義用戶名(目標主機)
export USER="user"
?
for i in $(cat /tmp/iplist) # iplist為目標主機ip列表,提前生成
do
sshpass -e ssh-copy-id -p 28022 -o StrictHostKeyChecking=no $USER@$i
done
二、核心方法解析
-
?環境變量傳遞密碼
- 通過
export SSHPASS="Choir@3423\$sf434"定義目標主機的登錄密碼。 - 特殊字符(如
$)需用反斜杠\轉義,避免Shell解析錯誤。 - 使用
sshpass -e調用環境變量中的密碼,避免密碼明文暴露在命令行歷史中。
- 通過
-
?自動化公鑰推送
- 通過
ssh-copy-id命令將本地公鑰(~/.ssh/id_rsa.pub)推送至目標主機的~/.ssh/authorized_keys文件。 - 參數
-p 28022指定目標主機的SSH端口(非默認22端口時必填)。
- 通過
-
?跳過主機驗證
-o StrictHostKeyChecking=no忽略首次連接的RSA指紋驗證提示,避免交互中斷腳本。
-
?批量處理IP列表
- 循環讀取
/tmp/iplist文件中的IP地址,實現多主機批量操作。
- 循環讀取
三、批量運維??
批量分發
做好免密登錄,就可以批量運維遠程主機了。
批量分發目錄到目標主機
# 這里用test001目錄測試,分發到目標主機的/tmp下。scp命令復制目錄到遠程主機需要 -r 參數,復制文件不需要
[root@localhost ~]# for i in $(/tmp/iplist);do echo $i;scp -P 28022 -r test001 user@$i:/tmp;done
批量分發文件到目標主機
# 這里用file1測試
[root@localhost ~]# for i in $(/tmp/iplist);do echo $i;scp -P 28022 file1 user@$i:/tmp;done
批量啟動、停止程序
# 批量啟動tomcat
[root@localhost ~]# for i in $(cat /tmp/iplist);do echo $i;ssh -p 22022 user@$i " /opt/tomcat/bin/catalina.sh start";done
# 批量停止tomcat
[root@localhost ~]# for i in $(cat /tmp/iplist);do echo $i;ssh -p 22022 user@$i " /opt/tomcat/bin/catalina.sh stop";done
# 查看java進程
[root@localhost ~]# for i in $(cat /tmp/iplist);do echo $i;ssh -p 22022 user@$i " ps -ef | grep java";done
四、總結
此方法通過sshpass自動化傳遞密碼+ssh-copy-id公鑰推送實現免密登錄,適用于臨時性或測試環境的密鑰分發,但需注意密碼安全風險。

浙公網安備 33010602011771號