在实际生产环境中有很多地方需要用到免密登录,例如GFS分布式文件系统,ansible等。如果需要免密登录的主机数量不多,那么可用通过使用命令的方式,去对每个主机设备免密登录;如果有大量的主机需要去免密登录,那么对每个主机都设置免密登录就很烦了,这时就需要一个脚本来实现批量的免密登录
ssh免密登录原理简介
假设 PC1 想要ssh免密登录 PC2, 那么 PC1 首先需要创建密钥对(ssh-keygen -t rsa
),然后将公钥拷贝到 PC2(ssh-copy-id root@PC2IP地址
)
这时候我们就可以使用ls -lA
在家目录下查看隐藏文件
进入.ssh
目录下查看
假设设备15想要免密登录设备16,那么设备15里的id_rsa.pub
和设备16里的authorized_keys
内容是相同的
ssh免密登录脚本
[root@15 ~]# vim ssh_patch.sh
#!/bin/bash
#ssh批量免密登录
#你需要新建一个host_ip.txt的文件,用于存放IP地址
#你需要修改下面的密码
password=123456
#判断有没有安装expect,没有则安装
if ! rpm -q expect > /dev/null
then
echo "###expect 未安装,现在安装###"
yum install -y expect &>/dev/null
if [ $? -ne 0 ]
then
echo "###expect 安装失败###"
exit 1
fi
fi
#生成ssh密钥对
/usr/bin/expect <<-EOF
spawn ssh-keygen -t rsa
expect "(/root/.ssh/id_rsa)" {send "\r"}
expect "(empty for no passphrase)" {send "\r"}
expect "again" {send "\r"}
expect eof
EOF
#从host_ip.txt文件中获取主机IP地址信息
for IP in $(more host_ip.txt)
do
if [ -n $IP ]
then
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$IP
expect "yes/no" {send "yes\r"}
expect "password" {send "$password\r"}
expect eof
EOF
else
echo "The IP is NULL !!!"
fi
done
将需要免密登录的主机IP输入到host_ip.txt
里面,格式为每行一个IP地址
[root@15 ~]# vi host_ip.txt
20.0.0.26
20.0.0.27
执行脚本有两种方式,一种是信息显示出来,一种信息不显示出来,如果主机很多可以使用第二种
① 直接执行脚本,执行信息显示出来,有大量信息,可以看到报错信息
. ssh_patch.sh
② 重定向输出到 /dev/null,没有信息显示
. ssh_patch.sh &> /dev/null
查看成功免密登录的主机