批量添加密钥

关于公司连接服务器这块儿做的比较严谨,每次登录都需要指定私钥文件连接
ssh -i "aws2lin27.pem" ubuntu@ec2-34-216-139-32.us-west-2.compute.amazonaws.com
这样连接,登录起来非常麻烦 ,后来就想到做免密认证后期使用ansible批量部署就非常简单
下面是写的脚本,大概逻辑是先需要把所有需要认证的服务器pem 私钥文件拷贝到本机想做免密的服务器,然后批量把自己的私钥拷贝到对方指定用户里,这样就实现不输入密码登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost pem]# cat fix_pem.sh 
#/bin/bash
ec_num=`cat aws.list ' wc -l`
for i in `seq 1 $ec_num`;
do
key_path=`cat aws.list ' awk '{print $2}' 'sed -n "$i"p`
aws_ip=`cat aws.list ' awk '{print $1}' 'sed -n "$i"p`

timeout -s 2 5 /usr/bin/scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i $key_path /home/hongtao.yang/aws/pem/add_pub_key.sh ubuntu@$aws_ip:/home/ubuntu/add_pub_key.sh
if [ $? -ne 0 ];then
echo $aws_ip >>/home/hongtao.yang/aws/pem/AWS_no.log
continue
fi
/usr/bin/ssh -o "StrictHostKeyChecking no" -o "LogLevel=quiet" -i $key_path ubuntu@$aws_ip "sudo /bin/bash /home/ubuntu/add_pub_key.sh"
echo $aws_ip >>/home/hongtao.yang/aws/pem/AWS_yes.log
done

这个时候需要在写一个引用脚本,把主机把本机的私钥传输进对方的.ssh/authorized_keys这个文件

1
2
3
4
5
6
7
8
9
[root@localhost pem]# cat add_pub_key.sh 
# /root/add_pub_key.sh
#/bin/bash
sudo -s << EOF
echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsHbvdNQlt/VCtQ+pa0I21Foc13EbdQqh2Fqf3orJIJV8dbWPhUBYsCoRu4ymTzJrtGiEYKmFVbmL9BxHBf7js/mQM08t4ySzU6agplzxQ/ae1bmwyjPrUVuSCnG5KEolhosKuAo/SmA0lrFu7IjiPU6ZfD/KndP5H/S9q7hWJ4TgRJGbft6zzD/oU5IIZ/hlrB77A7eN7Znr3Izwy11uM8I2aWZacAjaKACS6AkeY+mQsGuDBtRshE1PWIO/PRB+6ZyLXO6blloDfsdz1DHbeSvfnnlfCZxQ2Tu9jQ0Hm7KhaTPSnCTORgvTBCpW0XdTj/kJAXfwzq7uXHvopQ/YHt==" >>/root/.ssh/authorized_keys
sed -i 's/PermitRootLogin no/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
service ssh restart
EOF

本机路径一定要正确,以及先用ssh连接一下是否可以连接,脚本会对其进行判断 ,如果超过5秒就自动把无法连接的IP放在AWS_no.log这个文件里去 ,会把私钥拷贝成功的主机IP放在AWS_yes.log这个文件当中

这个文件需要提前自己手动完成,因为每个主机对应的私钥文件都不相同
[root@localhost pem]# cat aws.list 
54.200.50.103   /home/hongtao.yang/aws/pem/aws2lin69.pem
54.191.200.178  /home/hongtao.yang/aws/pem/aws2lin89.pem
52.89.78.38     /home/hongtao.yang/aws/pem/aws2lin92.pem
52.40.194.165   /home/hongtao.yang/aws/pem/aws2lin90.pem
52.35.93.17     /home/hongtao.yang/aws/pem/aws2lin70.pem
52.13.97.21     /home/hongtao.yang/aws/pem/aws2lin49.pem
44.236.240.155  /home/hongtao.yang/aws/pem/aws2lin91.pem
44.235.22.84    /home/hongtao.yang/aws/pem/aws2lin75.pem
44.231.47.122   /home/hongtao.yang/aws/pem/aws2lin79.pem

做完免密遇到的坑

- 方案一

由于之前我对私钥设置了密码,所以就算免密成功之后也需要手动输入私钥密码才能连接,所以找到以下两种方案
1、借助第三方工具Keychain

wget https://github.com/funtoo/keychain/archive/refs/heads/master.zip
unzip master.zip
cd keychain-master/
cp keychain /usr/bin/
[root@localhost pem]# vim /root/.bash_profile  把下面几行添加环境变量
PATH=$PATH:$HOME/bin
export PATH
keychain ~/.ssh/id_rsa
. ~/.keychain/$HOSTNAME-sh
source /root/.bash_profile
[root@localhost pem]# ssh-add -l   这个时候就可以看到他把秘钥写入了缓存然后就可以ssh了
2048 SHA256:RlCuwRVp5yzao9e/IapSJAWfHZNU8axzV/H3g3qA1Co /root/.ssh/id_rsa (RSA)

- 方案2

之前在Ubuntu下用SSH给私钥添加了一个密码,后来用着很麻烦。想去掉,网上查看本身就有这个功能,方法如下:
1 、在终端下输入ssh-keygen -p
2 、系统会提醒选择修改的私钥,默认是/home/username/.ssh/id_rsa
3 、选择好文件之后按回车,会提示输入旧密码。
4 、输入好之后会提示输入新的密码。
5 、直接回车,在提示输入新密码依然回车,此时私钥密码就会被清除。