基于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号