使用bash+ssh+sudo伪批量修改节点authorized keys文件

来自三线的随记

#输入密码输入到怀疑人生


场景简述

拿到一批linux节点,给的user是非root的有sudo权限的user

现在需要在A节点上面配置能够直接登陆全部节点


由于A节点之前没有链接过所有节点,所以直接用ansible -k 通过密码登陆的话会提示Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to manage this host. 错误

注意其实这个错误其实是可以避免的,用ssh-keyscan 之类的行为将节点的host key 批量添加到 known_hosts 或者索性配置ansible host_key_checking=false 就好了

因为前面没有意识到这个问题,所以产生了本文这个恶心人的操作


回到正题

由于以为ansible行不通,遂只能自己写bash实现追加key到集群所有节点root下面的authorized_keys文件了

(root user 的authorized_keys文件有内容,不能直接覆盖)

然后又不知道root用户的密码

只能通过sudo配合ssh去完成这个操作。。。

首先得把全部节点以数组的形式load到ssh环境变量中,量大的话可以用for命令配合快速load

servers=(192.168.1.10 192.168.1.11 192.168.1.13)

然后

for node in ${servers[@]};do ssh users@${node} -t "sudo sed -i '\$assh-rsa keys-content' /home/root/.ssh/authorized_keys";done

大概就是这样

注意(躺坑)1 不能使用sudo 和 echo >> 以通过重定向流的形式写入文件

sudo echo 123 >> /root/123

不然会提示Permission denied(毕竟重定向流这个行为不在sudo参数内,或许需要sudo的option配合进行)


注意(躺坑)2 这里root user的home路径还被改过,在这躺了一下坑就很无奈

然后这样执行会引发一个恶心的后果

  1. 前面提到由于A节点之前没有链接过所有节点,所以代码执行过程中你要不断地输入y(这还算好了)
  2. 你得输入n次节点密码......(n = 节点数量)
  3. 怀疑人生



此刻我只想说我怎么这么蠢???