利用sshpass批量设置SSH免密登录

利用sshpass批量设置SSH免密登录

背景

之前使用vmware vCenter管理虚拟机, 我们在做模版时就将控制节点的公钥放入了虚拟机模版, 因此使用模版新建的虚拟机都可以直接从控制节点免密钥登录的, 能够有效解决虚拟机密码被改了无法登录的问题, 以及通过控制节点来做一些软件安装/配置修改和服务监控等。

最近在OpenStack上新建了100多台机器, 这些机器一开始并没有内置公钥, 机器开机后要对他们进行初始化, 如修改yum源和主机名, 常用工具安装, SELINUX/iptables禁用, vim设置优化等, 逐一手动修改工作量无疑会大到让人奔溃, 在不熟悉Ansible的情况下, 我们要做的第一步就是将控制节点的公钥拷贝到远程虚拟机上, 但是一个个的执行ssh-copy-id 还要输入不同的随机密码,也会累死人的。 现呢? 摸索了一下, 找到了对应的解决办法;


注意:没有提示要求输入yes 进行确认,是我之前就在ssh_config文件中设置了不进行确认:
    vim /etc/ssh/ssh_config
    #Add at the end of file
    StrictHostKeyChecking no
或者

ssh或ssh-copy-id免输yes,ssh首次访问总是提示Are you sure you want to continue connecting (yes/no)

1、ssh -o stricthostkeychecking=no
ssh-copy-id -o stricthostkeychecking=no 验证成功

2、ssh-copy-id -i .ssh/id_rsa.pub root@192.168.0.1 验证搭配使用sshpass不行

3、ssh -J root@192.168.0.222 root@192.168.57.3 没有验证

方法一:详细步骤(简单方法)

step1:修改 /etc/yum/pluginconf.d/license-manager.conf 中的enabled=0
step2:下载repo源——可以忽略这步
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
step3:安装sshpass
yum install -y sshpass
step4:批量执行脚本
#-p指的是主机的passwd
for i in {2..4}; do sshpass -p '111' ssh-copy-id -o stricthostkeychecking=no root@172.18.0.$i ; done
执行结果
[root@3228507c4263 pluginconf.d]# for i in {2..4}; do sshpass -p '111' ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.18.0.$i ; done
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

方法二:详细步骤

  1. 需要的工具
sshpass (添加epel源进行安装)
ssh-copy-id (centos已内置)
  1. 新建文件保存主机名/IP/密码信息

将需要添加公钥的主机名/IP地址/主机密码存入到文本文件node.hosts中,格式如下:


node01 10.0.0.21 9nDvik7w
node02 10.0.0.22 5fDviDEw
node03 10.0.0.23 FiPp2UpR
node04 10.0.0.24 KeMbe57z
node05 10.0.0.25 FElJ3ArM
  1. 使用sshpass实现ssh自动填写密码

使用sshpass将密码传递给ssh-copy-id , 使得当需要输入密码时, 能够自动读取变量进行输入并完成验证.
本脚本在原来的基础上添加了一些附加功能, 包括:

  • 拷贝本机公钥到远程主机
  • 免密钥登录到远程主机设置主机名
  • 在远程主机生成ssh-key并将公钥收集到本机
  • 将主机列表添加到hosts文件并拷贝到远程主机
  • 设置sshd配置文件UseDNS为no以加快ssh连接并拷贝到远程主机
  • 设置ssh配置文件禁用远程scp/ssh时询问并拷贝到远程主机
  • 汇总所有主机的公钥并拷贝到所有节点,使得能互相免密登录(慎用)

脚本copy_ssh_id.sh如下:



<think>好的,用户现在想配置Alluxio多节点环境下的SSH免密登录。我需要先回顾之前的对话和提供的引用内容,看看有没有相关的信息可以借鉴。 首先,用户之前提到了在CentOS 7下部署Alluxio+HDFS集群的经历,并且引用了官方文档和一些配置步骤。其中引用[3]中提到了使用root用户部署Alluxio+GlusterFS集群时,执行了生成SSH密钥并配置authorized_keys的操作,这可能和当前的SSH免密登录需求相关。 用户当前的问题是配置多节点集群的SSH免密登录,这对于Alluxio集群来说非常重要,因为节点之间需要无密码通信来启动和管理服务。根据引用[3]中的步骤,用户可能已经了解基本的SSH密钥生成和配置,但可能需要更详细的指导,特别是针对多节点环境。 接下来,我需要考虑用户可能的实际情况。用户提到官方文档省略了很多细节,导致配置困难。因此,我的回答需要详细、分步骤,并且覆盖可能遇到的常见问题,比如权限设置、节点间的配置文件分发等。 用户可能是在非root用户环境下操作,因为在引用[1]中提到了非root用户部署的情况。因此,步骤中需要区分是否使用root用户,并给出相应的权限设置建议,比如使用sudo或者修改目录权限。 另外,用户可能需要将生成的公钥分发到所有节点,包括自己。这涉及到使用ssh-copy-id命令或者手动追加公钥到authorized_keys文件。同时,需要确保.ssh目录的权限正确,避免因为权限问题导致SSH免密登录失败。 还需要考虑测试SSH连接的步骤,确保配置成功后能够无需密码登录到各个节点。此外,可能存在的常见错误,例如密钥权限过松、authorized_keys文件权限不正确,或者SELinux、防火墙的问题,也需要在回答中提及,帮助用户排查问题。 最后,结合用户之前的问题,他们可能是在搭建Alluxio集群过程中遇到了SSH配置的困难,因此需要明确的步骤和验证方法,确保配置正确无误,避免后续服务启动时出现问题。</think>#### 分步配置指南:Alluxio多节点SSH免密登录 --- ##### **一、核心原理说明** SSH免密登录通过非对称加密实现节点间身份验证,需满足以下条件: 1. **密钥文件权限**:`.ssh`目录权限需为`700`,密钥文件权限为`600` 2. **公钥分发**:所有节点的`authorized_keys`文件中需包含其他节点的公钥 3. **网络连通性**:确保节点间SSH端口(默认22)互通且无防火墙拦截[^1] --- ##### **二、配置流程** ###### **1. 生成密钥对(所有节点执行)** ```bash # 非root用户需确认有~/.ssh目录的写权限 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa # 生成密钥对,无密码保护 chmod 700 ~/.ssh # 目录权限必须为700 chmod 600 ~/.ssh/id_rsa* # 密钥文件权限必须为600 ``` ###### **2. 创建节点列表文件** 在管理节点(如master)创建`hosts.list`文件,格式: ``` node1 node2 node3 ``` ###### **3. 批量分发公钥(管理节点执行)** ```bash # 安装必要工具(非root用户需sudo权限) sudo yum install -y sshpass # CentOS系统 # 自动分发脚本(需提前配置好各节点密码) while read host; do sshpass -p "your_password" ssh-copy-id -o StrictHostKeyChecking=no ${host} done < hosts.list # 包含本机自身(重要!) ssh-copy-id localhost ``` ###### **4. 验证免密登录** ```bash # 测试任意节点间连接 ssh node1 "hostname" # 应直接返回node1的hostname ssh node2 "free -h" # 应直接显示node2内存信息 ``` --- ##### **三、关键配置示例** ###### **1. 多节点authorized_keys合并(特殊场景)** 当节点数量较多时,可使用集中式管理: ```bash # 在管理节点收集所有公钥 cat ~/.ssh/id_rsa.pub > authorized_keys for host in $(cat hosts.list); do ssh ${host} "cat ~/.ssh/id_rsa.pub" >> authorized_keys done # 批量分发合并后的公钥文件 for host in $(cat hosts.list); do scp authorized_keys ${host}:~/.ssh/ done ``` ###### **2. 权限修复脚本** 创建`fix_ssh_permission.sh`: ```bash #!/bin/bash chmod 700 ~/.ssh chmod 600 ~/.ssh/* chmod 644 ~/.ssh/*.pub ``` --- ##### **四、常见故障排查** | 故障现象 | 检查步骤 | 解决方案 | |---------|----------|----------| | `Permission denied` | `ls -ld ~/.ssh` | 修正目录权限为700 | | 密码仍被要求 | `ssh -v node1` 查看调试日志 | 检查`authorized_keys`文件权限应为600 | | 连接超时 | `telnet node1 22` | 开放防火墙端口:`sudo firewall-cmd --add-service=ssh --permanent` | | Host key验证失败 | 删除`~/.ssh/known_hosts`相关条目 | `ssh-keygen -R node1` | --- ##### **五、Alluxio集成验证** 修改`conf/workers`文件后,测试集群启动: ```bash # 测试无密码启动Worker ./bin/alluxio-start.sh workers SudoMount # 预期输出应无密码提示 Starting workers... node1: starting node2: starting ``` --- ### 相关问题 1. 如何通过Ansible自动化部署Alluxio集群的SSH配置? 2. 非对称加密在SSH免密登录中的具体工作流程是怎样的? 3. Alluxio集群部署中如何解决跨节点文件同步问题? 4. SSH证书过期或泄露时如何快速轮换集群密钥? [^1]: SSH端口连通性是分布式系统节点通信的基础前提 [^2]: 密钥文件权限错误是SSH免密登录失败的最常见原因 [^3]: 自包含公钥(本机到本机的免密)是Alluxio单节点模式正常工作的必要条件
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值