使用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路径还被改过,在这躺了一下坑就很无奈
然后这样执行会引发一个恶心的后果
- 前面提到由于A节点之前没有链接过所有节点,所以代码执行过程中你要不断地输入y(这还算好了)
- 你得输入n次节点密码......(n = 节点数量)
- 怀疑人生
此刻我只想说我怎么这么蠢???