使用sshpass批量实现基于SSH-key的认证

admin 2022年09月16日 505次浏览

如果有大量主机需要使用如 ansible 等工具来做批量管理时,就需要给对应的客户主机导入 SSH key,但是如果每一台都单独生成 key 然后再逐台导入,那么将花费大量时间,因此可以使用批量的方式来创建并导入远程主机

1、添加客户机白名单

第一次通过 SSH 访问客户机时,需要将该主机的指纹信息添加到管理主机的 “.ssh/known_hosts” 文件中,然后才能正常访问,否则无法通过 SSH 访问客户机

因为被管理的主机数量较多,因此可以使用 ansible 来获取并导入客户机的指纹信息

  • 在 ansible 配置文件 “/etc/ansible/ansible.cfg” 中,将 “host_key_checking = False” 前面的注释去掉

  • 在 “/etc/ansible/hosts” 文件中添加被管理主机的 IP 地址,其格式可以是以下的任意一种

    [host_group1]
    192.168.1.[2:5]
    
    # 与 [host_group1] 效果相同
    [host_group2]
    192.168.1.2
    192.168.1.3
    192.168.1.4
    192.168.1.5
    
    [webserver]
    192.168.1.2
    192.168.10.5
    192.168.50.33
    
    [dbserver]
    192.168.1.9
    192.168.10.18
    192.168.50.3
    
  • 执行 ansible all -m ping 或者 ansible webserver -m ping 即可将上面配置文件中所有或指定主机的指纹自动添加到 “.ssh/known_hosts” 文件中

2、生成并导入key

使用 sshpass 批量生成并导入 key (注意:使用该方法,需要所有被管理主机的用户登录密码相同)

ssh-keygen -f /root/.ssh/id_rsa -P ''
NET=192.168.1
# 指定被管理主机的登录密码
export SSHPASS='passwd'
for IP in {11..13};do
	sshpass -e ssh-copy-id $NET.$IP
done

返回结果

  • 添加失败

    一般是因为第一次登录,没有在 .ssh/known_hosts 中添加目标主机

    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    
  • 添加成功

    ... (前面省略)...
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh '192.168.1.x'"
    and check to make sure that only the key(s) you wanted were added.
    ... (其他主机省略)...
    

经过以上操作后,就可以通过 SSH key 实现免密登录远程主机了,也就可以使用 ansible 等工具批量管理远程主机了