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

二、核心方法解析

  1. 环境变量传递密码

    • 通过export SSHPASS="Choir@3423\$sf434"定义目标主机的登录密码。
    • 特殊字符(如$)需用反斜杠\转义,避免Shell解析错误。
    • 使用sshpass -e调用环境变量中的密码,避免密码明文暴露在命令行历史中。
  2. 自动化公钥推送

    • 通过ssh-copy-id命令将本地公钥(~/.ssh/id_rsa.pub)推送至目标主机的~/.ssh/authorized_keys文件。
    • 参数-p 28022指定目标主机的SSH端口(非默认22端口时必填)。 
  3. 跳过主机验证

    • -o StrictHostKeyChecking=no忽略首次连接的RSA指纹验证提示,避免交互中断脚本。 
  4. 批量处理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公钥推送实现免密登录,适用于临时性或测试环境的密钥分发,但需注意密码安全风险。

 

posted @ 2025-03-28 14:14  Noleaf  阅读(60)  评论(0)    收藏  举报