基于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号
浙公网安备 33010602011771号