Linux批量实现复制公钥到远程主机

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
ssh服务有两种验证用户登录的方式,一种是基于密码口令的认证,一种是基于密钥的认证,本文主要是实现基于密钥的认证。ssh基于密钥认证过程:
Linux批量实现复制公钥到远程主机_第1张图片
ssh工具不仅仅提供了远程登录的功能,他还自带了一些命令工具,能够生成ssh会话密钥,并且能够将生成密钥对的公钥复制到远程主机;
不过这里我们会发现,我们在给每台主机复制公钥的时候一台一台操作过程很慢,几台主机做免秘钥还行,几百台以上机器难道我们还一台一台去操作吗?并且还要需要手动输入密码,为解决这么low的操作,我们可以使用shell脚本编程中的expect语法,它能代替我们输入登录密码:

vim /data/scripts/keys.sh
#!/bin/bash
# 生成ssh key
rm -rf /root/.ssh/id_rsa*
if [[ ! -f "/root/.ssh/id_rsa" ]];then
  echo "gen ssh key"
  ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa
fi
# 检测是否安装了 expect
if ! expect -v &>/dev/null;then
  echo "install expect"
  yum install expect -y
fi
# 循环文件中的ip
for p in $(cat ip.txt);do
  ip=$(echo "$p"|cut -f1 -d":")       # 取出当前IP
  password=$(echo "$p"|cut -f2 -d":") # 取出当前密码
  port=$(echo "$p"|cut -f3 -d":") #取出当前端口
  # expect 交互过程
  expect -c "
spawn ssh-copy-id -p$port -i /root/.ssh/id_rsa.pub root@$ip
        expect {
                \"*yes/no*\" {send \"yes\r\"; exp_continue}
                \"*password*\" {send \"$password\r\"; exp_continue}
                \"*Password*\" {send \"$password\r\";}
        }
"
done

:ip.txt 文本需跟执行脚本放同一目录下
ip.txt中内容如下:
在这里插入图片描述
参考文章:https://blog.csdn.net/catoop/article/details/48301251
https://blog.51cto.com/oldboy/1205715

你可能感兴趣的:(shell)