通过shell脚本批量部署ssh私钥认证
批量管理服务器是个力气活,如果手动一台一台去搞,会很费劲。所有就会有saltstack,ansible,puppet这些批量管理工具
普通方法实现ssh免密登录
在登录机上生成公钥和私钥
$ ssh-keygen -t ras # 一路回车,在/root下生成一个.ssh的目录,这个目录里有id_rsa.pub(公钥文件),id_rsa(私钥文件)
把公钥拷贝到远程服务端
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.1 # 输入密码
$ ssh 192.168.1.1 # 就会发现就不用再输密码了
批量部署ssh私钥的认证脚本
主脚本
首先要查看是否有expect
这个命令,可以用which expect
来确定是否有这个命令,没有的话yum
安装即可
$ yum install expect
$ cat /root/batch_sshkey.sh
#!/bin/bash
cd /root
cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
for i in `cat ip.txt`
do
ip=$(echo "$i"|cut -f1 -d":")
password=$(echo "$i"|cut -f2 -d":")
expect -c "
spawn scp /root/.ssh/authorized_keys /root/remote_operate.sh root@$ip:/tmp/
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$password\r\"; exp_continue}
\"*Password*\" {send \"$password\r\";}
}
"
expect -c "
spawn ssh root@$ip "/tmp/remote_operate.sh"
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"$password\r\"; exp_continue}
\"*Password*\" {send \"$password\r\";}
}
"
done
$ chmod +x /root/batch_sshkey.sh
建立被登录端的IP列表
列表中服务器IP和密码用冒号":" 分割
$ cat ip.txt
192.168.1.1:admin1
192.168.8.220:admin2
建立remote_operate.sh
这个脚本用来查看服务器端的.ssh文件是否存在,同时将私钥拷贝到该目录下
$ cat remote_operate.sh
#!/bin/bash
if [ ! -d /root/.ssh ];then
mkdir /root/.ssh
fi
cat /tmp/authorized_keys > /root/.ssh/authorized_keys
rm -rf /tmp/authorized_keys /tmp/remote_operate.sh
执行脚本测试
$ ./batch_sshkey.ssh
spawn scp /root/.ssh/authorized_keys /root/remote_operate.sh root@192.168.1.1:/tmp/
authorized_keys 100% 396 0.4KB/s 00:00
remote_operate.sh 100% 170 0.2KB/s 00:00
spawn ssh root@192.168.8.220 /tmp/remote_operate.sh
spawn scp /root/.ssh/authorized_keys /root/remote_operate.sh root@192.168.8.220:/tmp/
authorized_keys 100% 396 0.4KB/s 00:00
remote_operate.sh 100% 170 0.2KB/s 00:00
spawn ssh root@192.168.66.13 /tmp/remote_operate.sh
$ ssh 192.168.1.1 # 测试是否能免密登录
$ ssh 192.168.8.220 # 测试是否能免密登录