170. 【Linux】ssh-keyscan-解决“离线环境”多节点互信任问题

文章介绍了在没有外网的离线环境中,如何使用ssh-keygen和ssh-copy-id命令的原理来实现多台Linux服务器之间的互相信任,避免ssh登录和远程执行脚本时需要密码。此外,还提供了一个shell脚本来自动化处理公钥的传输和known_hosts文件的更新,以实现完全自动化的过程。

昨天写了篇 169. 《Linux 命令行与 shell 脚本编程大全》收官,只顾着自己开心了,今天写篇“离线环境”下基于ssh-keyscan的多个 Linux 服务器节点的互信任解决方案。

做 Linux 运维的同学基本都知道先使用ssh-keygen命令再使用ssh-copy-id命令可以实现两台服务器互相信任,ssh 登录将无需密码,ssh 远程执行脚本也将无需输入密码,省去人工交互的步骤(这步很重要,毕竟加上人工就不算完全的自动化,因为没解放人工劳动力)。

这里“离线环境”指的是不能连入外网安装expect工具,非离线环境下可以安装expect工具在脚本中实现互信任,能解决问题,具体方案可自行百度。但是缺点是安装了新的依赖,而且离线安装有点麻烦。

一、ssh-copy-id 原理

这里先简单说明一下ssh-copy-id的原理,看看它做了什么事。
比如执行,

ssh-copy-id root@192.168.2.7
  1. 在远程服务器(192.168.2.7)上,生成了公钥;
  2. 在远程服务器(192.168.2.7)上,将生成的公钥拷贝到~/.ssh目录下的 authorized_keys 文件中;
  3. 在远程服务器(192.168.2.7)上,将 ~/.ssh目录的权限设置成700,将~/.ssh/authorized_keys文件权限设置成600

二、开始跳过 ssh-copy-id 实现 ssh-copy-id 第 2 不,并且更新 known_hosts 文件。

说明:
known_hosts 文件也是自动化的关键,如果只是重复了ssh-copy-id 的功能,将导致第一次使用 ssh 互连时,弹出确认选项,这个也是应该避免的。
known_hosts 导致的确认选项

测试环境要求:

  • 一台客户端服务器,用于远程执行命令
  • 两台待互相信任的服务器,并且都建立了需要互相信任的用户(脚本的是:test 用户),并且在各自的 ~/.ssh目录下都生成了 id_rsa 密钥。
    直接上脚本,

for node in ${env_nodes}  #  开始迭代, env_nodes 是一个包含多个节点服务器 IP 的可迭代序列
do

    node_index=0  #  各个服务器都设置了 hostname(命名格式是 hostname + 数字),这里的 node_index 是为了构造 hostname
    for node_trust in ${env_nodes}  #  开始内部迭代
    do

        #  去远程服务器(node_trust),将```id_rsa.pub```公钥复制到客户端服务器下
        ssh test@${node_trust} "cat /home/test/.ssh/id_rsa.pub" > /tmp/id_rsa2.pub
        #  将公钥发送到远程服务器(node)
        scp -r /tmp/id_rsa2.pub test@${node}:/tmp/id_rsa2.pub
        #  去远程服务器(node)将公钥追加到 authorized_keys文件
        ssh test@${node} "cat /tmp/id_rsa2.pub >> /home/test/.ssh/authorized_keys"

        #  for known_hosts
        #  通过 ssh-keyscan -H 命令对 known_hosts 文件进行散列计算。这将把文件中的所有主机名/ip地址替换为相应的散列值。 
        #  原来文件的内容将会添加一个”.old”后缀后保存。这些散列值只能被 ssh 和 sshd 使用。 
        #  这个选项不会修改已经经过散列的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用。 
        ssh test@${node} "ssh-keyscan -H test${node_index},${node_trust} >> ~/.ssh/known_hosts && ssh-keyscan -H ${node_trust} >> ~/.ssh/known_hosts && ssh-keyscan -H test${node_index} >> ~/.ssh/known_hosts"

        echo "[$( date +'%Y-%m-%d %T' )] ${node} <-> ${node_trust} :ok"
        node_index=$[ ${node_index} + 1 ]

    done


done

三、

基本就到这了,不明白的可以互相交流。

编程新手可以找找现成的代码,copy、copy 用用,很多时候都能解决问题,也很快乐。

但学编程久了,一定不要脱离手敲代码这一步,编程基础的构建需要足够的练习。

<think>好的,用户遇到了“ssh-keyscan命令未找到”的问题,需要解决。首先,我应该回忆一下这个命令通常属于哪个软件包。根据经验,ssh-keyscan是OpenSSH工具套件的一部分,所以在Linux系统中,如果找不到这个命令,可能是因为没有安装OpenSSH客户端。 接下来,我需要确认不同Linux发行版的安装方法。比如,Ubuntu或Debian系统使用apt,而CentOS或Fedora使用yum或dnf。用户可能需要根据他们的系统类型选择合适的包管理器来安装openssh-client。另外,有些系统可能默认没有安装完整的OpenSSH套件,特别是最小化安装的情况下。 然后,安装完成后,用户需要验证是否安装成功,可以通过which或者直接运行ssh-keyscan命令来检查。如果安装后依然找不到,可能需要检查环境变量PATH是否包含安装路径,不过通常包管理器会处理好这些。 另外,用户可能是在Windows系统下遇到这个问题。这时候需要确认他们是否在使用WSL或者Cygwin,或者是否安装了Git Bash,因为原生的Windows命令提示符可能不支持ssh-keyscan。如果用户使用的是Windows,建议他们安装Git for Windows,其中包含OpenSSH工具。 还要考虑用户是否拼写错误,或者是否有权限问题,但可能性较低,因为错误提示是“未找到命令”,更多是安装问题。最后,应该提醒用户安装后再次尝试命令,并确认是否需要其他帮助,比如生成或管理密钥。</think>### 分步解决方案:解决"ssh-keyscan 未找到"问题 #### 1. 确认系统环境 首先检查您的操作系统类型: - **Linux发行版**(Ubuntu/Debian/CentOS等) - **Windows系统** - **macOS系统** 不同系统解决方案不同,以下为各平台具体操作: --- #### 2. Linux系统解决方案 **步骤1:安装OpenSSH客户端包** ```bash # Ubuntu/Debian 系系统 sudo apt-get update sudo apt-get install openssh-client # CentOS/RHEL/Fedora 系系统 sudo yum install openssh-clients # 或 sudo dnf install openssh-clients ``` **步骤2:验证安装** ```bash which ssh-keyscan # 应显示路径:/usr/bin/ssh-keyscan ssh-keyscan -V # 查看版本信息(注意参数大小写) ``` --- #### 3. Windows系统解决方案 **方案1:通过Git Bash安装** 1. 下载安装 [Git for Windows](https://git-scm.com/download/win) 2. 在Git Bash终端中直接使用`ssh-keyscan`命令 **方案2:安装Windows OpenSSH组件** 1. Win10/11系统设置 → 应用 → 可选功能 → 添加功能 2. 勾选"OpenSSH客户端"进行安装[^3] --- #### 4. macOS系统解决方案 **步骤1:安装Xcode工具包** ```bash xcode-select --install ``` **步骤2:验证默认安装** ```bash which ssh-keyscan # macOS默认已包含ssh-keyscan ``` --- #### 5. 环境验证(通用) 安装完成后执行测试命令: ```bash ssh-keyscan github.com # 尝试获取GitHub的公钥 ``` --- #### 6. 路径配置(特殊场景) 若安装后仍提示找不到命令,手动添加路径: ```bash # Linux/macOS示例 export PATH="/usr/bin:$PATH" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值