集群内SSH免密登录及批处理

news/2025/1/20 4:15:30/

集群内SSH免密登录及批处理

  • 一、背景
  • 二、操作步骤(默认在主节点操作)
    • 1. 为 `root` 用户设置密码并允许SSH登录(在**每台主机**上操作)
    • 2. 在主节点安装 `pdsh`,用于批量执行命令
    • 3. 创建集群主机列表
    • 4. 编写自动生成SSH密钥的Expect脚本
    • 5. 编写自动化的 `ssh-copy-id` Expect脚本
    • 6. 编写批处理脚本并执行
    • 7.验证免密是否成功
    • 8. 使用 `pdsh` 批量获取主机的运行时间
    • 9. 使用 `pdsh` 批量获取主机的IP地址
  • 三、总结

一、背景

在集群环境中,我们希望能够在多台主机上批量安装软件、获取信息等操作。为了提高效率,需要实现集群内的SSH免密登录和批处理任务执行。

二、操作步骤(默认在主节点操作)

1. 为 root 用户设置密码并允许SSH登录(在每台主机上操作)

⚠️ 注意:出于安全考虑,直接允许 root 用户通过SSH登录存在风险。建议创建具有sudo权限的普通用户进行操作,或确保网络环境的安全性。

# 修改SSH配置文件,允许`root`登录并禁用主机密钥检查
sed -i 's/^.*PermitRootLogin.*$/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/^.*StrictModes.*$/StrictModes no/g' /etc/ssh/sshd_config
sed -i 's/^.*Port.*$/Port 22/g' /etc/ssh/sshd_config# 设置`root`用户密码(请使用强密码)
export passwd=Hello123 && printf "${passwd}\n${passwd}\n"  | passwd root# 重启SSH服务使配置生效
systemctl restart ssh# 清空`root`用户的SSH密钥目录
rm -rf /root/.ssh/*

注释:

  • sed 命令用于修改SSH配置文件,启用root登录并禁用主机密钥检查。
  • 使用 passwd 命令设置 root 用户密码,请确保密码强度。
  • 重启SSH服务以应用新的配置。
  • 删除 .ssh 目录下的所有文件,确保后续密钥生成过程的干净环境。

2. 在主节点安装 pdsh,用于批量执行命令

# 更新包列表并安装编译工具
apt update
apt install -y gcc make# 下载并解压`pdsh`源码
wget https://github.com/grondo/pdsh/archive/pdsh-2.31.tar.gz
tar -xf pdsh-2.31.tar.gz
cd pdsh-pdsh-2.31# 配置并安装`pdsh`
./configure \--prefix=/usr/local/pdsh \--with-ssh \--with-machines=/usr/local/pdsh/machines \--with-dshgroups=/usr/local/pdsh/group \--with-rcmd-rank-list=ssh \--with-execmake && make install# 将`pdsh`添加到环境变量
echo 'export PATH=/usr/local/pdsh/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

注释:

  • pdsh 是一个并行远程执行命令的工具,可以用于在多台主机上同时执行命令。
  • 安装过程中需要编译,因此需要先安装 gccmake
  • 配置参数中,指定了使用SSH方式进行远程连接。

3. 创建集群主机列表

# 创建机器列表文件
cat > /usr/local/pdsh/machines <<EOF
192.168.122.140
192.168.122.141
192.168.122.142
EOF

注释:

  • 将集群中所有需要管理的主机IP地址添加到 /usr/local/pdsh/machines 文件中,每行一个IP。
  • 该文件将被 pdsh 读取,用于批量操作。

4. 编写自动生成SSH密钥的Expect脚本

# 安装Expect工具
apt install -y expect# 创建自动化的SSH密钥生成脚本
cat > sshkeygen.auto <<'EOF'
#!/usr/bin/expect -f
set timeout 60
spawn ssh-keygen
expect {".ssh/id_rsa" {send "\r"exp_continue}"Overwrite (y/n)?" {exit}"Enter passphrase*" {send "\r"exp_continue}"Enter same passphrase again:" {send "\r"}
}
expect eof
EOF# 赋予执行权限
chmod +x sshkeygen.auto

注释:

  • 使用Expect脚本可以自动化交互式命令,避免手动输入。
  • 该脚本用于自动生成SSH密钥对。

sshcopyid_Expect_132">5. 编写自动化的 ssh-copy-id Expect脚本

# 创建自动化的ssh-copy-id脚本
cat > sshcopy.auto <<'EOF'
#!/usr/bin/expect -f
set ip [lindex $argv 0]
set port [lindex $argv 1]
set user [lindex $argv 2]
set pw [lindex $argv 3]
set timeout 60
spawn ssh-copy-id -p $port $user@$ip
expect {"*yes/no" {send "yes\r"exp_continue}"password:" {send "$pw\r"}
}
expect eof
EOF# 赋予执行权限
chmod +x sshcopy.auto

注释:

  • 该Expect脚本用于自动将本地主机的公钥复制到远程主机,实现免密码登录。
  • 脚本接受四个参数:目标IP、SSH端口、用户名和密码。

6. 编写批处理脚本并执行

# 创建批处理脚本
cat > autorun.sh <<'EOF'
#!/bin/bash# 设置参数
PASSWORD='Hello123'
USER='root'
PORT='22'# 生成本地SSH密钥
./sshkeygen.auto# 初始化authorized_keys文件
rm -f authorized_keys# 遍历主机列表
for IP in $(cat /usr/local/pdsh/machines); do# 将本地公钥复制到远程主机./sshcopy.auto $IP $PORT $USER $PASSWORD# 将自动化密钥生成脚本复制到远程主机scp -P $PORT sshkeygen.auto $USER@$IP:~/# 在远程主机上安装Expect并生成SSH密钥ssh -p $PORT $USER@$IP "apt update && apt install -y expect && ./sshkeygen.auto"# 收集远程主机的公钥ssh -p $PORT $USER@$IP "cat ~/.ssh/id_rsa.pub" >> authorized_keys
done# 将本地主机的公钥添加到authorized_keys中
cat ~/.ssh/id_rsa.pub >> authorized_keys# 将完整的authorized_keys文件分发到所有主机
for IP in $(cat /usr/local/pdsh/machines); doscp -P $PORT authorized_keys $USER@$IP:~/.ssh/authorized_keys
doneEOF# 赋予执行权限并运行脚本
chmod +x autorun.sh
./autorun.sh

注释:

  • autorun.sh 脚本完成以下任务:
    • 在本地主机生成SSH密钥对。
    • 将本地主机的公钥复制到远程主机,实现本地到远程的免密登录。
    • 在远程主机上生成各自的SSH密钥对。
    • 收集所有远程主机的公钥,汇总到 authorized_keys 文件。
    • 将完整的 authorized_keys 文件分发到所有主机,实现集群内所有主机之间的免密登录。
  • 确保所有脚本具有执行权限。

7.验证免密是否成功

ssh -o 'StrictHostKeyChecking no' root@192.168.122.140

8. 使用 pdsh 批量获取主机的运行时间

# 执行命令获取所有主机的运行时间
/usr/local/pdsh/bin/pdsh -a uptime

输出示例:

192.168.122.140:  10:15:27 up 1 day,  3:44,  2 users,  load average: 0.17, 0.19, 0.16
192.168.122.141:  10:15:27 up 1 day,  3:47,  1 user,  load average: 0.10, 0.09, 0.06
192.168.122.142:  10:15:27 up 1 day,  3:46,  2 users,  load average: 0.03, 0.09, 0.06

注释:

  • pdsh-a 参数表示对所有主机执行命令。
  • uptime 命令显示系统的运行时间、登陆用户数和平均负载。

9. 使用 pdsh 批量获取主机的IP地址

# 执行命令获取所有主机的IP地址
/usr/local/pdsh/bin/pdsh -a "hostname -I | awk '{print $1}'"

输出示例:

192.168.122.140: 192.168.122.140 172.17.0.1 10.244.0.0
192.168.122.141: 192.168.122.141 172.17.0.1 10.244.2.0 10.244.2.1
192.168.122.142: 192.168.122.142 172.17.0.1 10.244.1.0 10.244.1.1

注释:

  • hostname -I 命令获取主机的所有IP地址,使用 awk 提取第一个(主)IP地址。
  • 可以根据实际网络接口名称使用 ifconfigip addr 命令获取更加详细的信息。

三、总结

通过上述步骤,我们实现了集群内各主机之间的SSH免密登录,并可以使用 pdsh 工具对各主机进行批量操作,大大提高了运维效率。


安全提示:

  • 避免使用弱密码。在生产环境中,一定要使用强密码,并确保密码的安全存储。
  • 限制 root 登录。出于安全考虑,建议禁止 root 用户通过SSH登录,改为使用具有sudo权限的普通用户。
  • 加强SSH安全配置。可以考虑使用防火墙限制SSH访问、使用非标准端口、禁用密码登录只允许密钥登录等方式提高安全性。

拓展阅读:

  • SSH安全最佳实践
  • pdsh官方文档

http://www.ppmy.cn/news/1564578.html

相关文章

深度学习学习笔记(第30周)

一、摘要 本周报的目的在于汇报第30周的学习成果&#xff0c;本周主要聚焦于基于深度学习的图像分割领域的常用模型U-net。   U-net是最常用、最简单的一种分割模型&#xff0c;在2015年被提出。UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络…

解决Spring Boot中Druid连接池“discard long time none received connection“警告

在使用Spring Boot结合Druid连接池时&#xff0c;开发者可能会遇到"discard long time none received connection"的警告信息。虽然这通常不会影响应用程序的正常运行&#xff0c;但这些警告信息可能会让人感到困扰。本文将探讨这个问题的原因&#xff0c;并提供几种…

vue 前端优化性能优化方法

1.列表使用唯一 key v-for"item in activeList" :key"item.id"原因是不使用 key 或者列表的 index 作为 key 的时候&#xff0c;每个元素对应的位置关系都是 index&#xff0c;直接导致我们插入的元素到后面的全部元素&#xff0c;对应的位置关系都发生了变…

如何写好ChatGPT的提示词:从入门到专家

在人工智能的飞速发展中&#xff0c;ChatGPT 等语言模型已经成为人们解决问题、生成内容和提升效率的强大工具。然而&#xff0c;要充分发挥这些模型的潜力&#xff0c;关键在于如何设计有效的提示词&#xff08;Prompt&#xff09;。本文将从基础概念到高级技巧&#xff0c;全…

Kotlin函数类型探索:T.()->Unit的扩展函数、无参函数()->Unit与类型参数函数(T)->Unit

在Kotlin编程语言的丰富特性中&#xff0c;函数类型扮演着至关重要的角色。它们不仅定义了代码的行为&#xff0c;还通过灵活的类型系统促进了代码的重用和模块化。本文将深入探讨Kotlin中的三种核心函数类型&#xff1a;T.()->Unit的扩展函数、无参函数()->Unit以及类型…

php-2025面试题准备

一、TCP、UDP、Unix Socket、HTTP、 WebSoct 1、概念 TCP&#xff1a;面向连接可靠的传输协议&#xff0c;会先建立连接&#xff0c;有确认应答、重传机制主要目的是保证数据的顺序性和完整性&#xff0c;常用于文件传输 FTP、电子邮件、网络浏览等大部分应用。 UDP&#xf…

【鸿蒙】0x02-LiteOS-M基于Qemu RISC-V运行

OpenHarmony LiteOS-M基于Qemu RISC-V运行 系列文章目录更新日志OpenHarmony技术架构OH技术架构OH支持系统类型轻量系统&#xff08;mini system&#xff09;小型系统&#xff08;small system&#xff09;标准系统&#xff08;standard system&#xff09; 简介环境准备安装QE…

深入浅出JSON:数据交换的轻量级解决方案

在现代Web开发中&#xff0c;数据交换是前后端通信的核心。JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;因其简洁、易读、易解析的特点&#xff0c;成为了前后端数据交互的首选格式。本文将详细介绍JSON的定义、数据格式、…