一、前言

本文主要介绍编写Shell脚本实现一键创建密钥对及分发密钥对。

二、脚本

2.1 编写脚本

[root@harbor01 ~]# cat   /scripts/fenfakey.sh
#!/bin/bash
# author: zq
# desc: 一键创建密钥对及分发密钥对
# version: v1.0

# 0、变量
passwd="123456"
ips="192.168.1.37 192.168.1.66"
. /etc/init.d/functions

# 1、判断是否联网
ping -c 1 8.8.8.8 > /dev/null 2>&1
if [ $? -eq 0 ]; then
   action "目前环境可以联网" /bin/true
else
   action "目前环境不可以联网" /bin/false
fi

# 2、判断是否存在sshpass命令
if command -v sshpass > /dev/null 2>&1; then
    action "sshpass 已经安装." /bin/true
else
    action "sshpass 未安装,尝试安装..." /bin/false

    # 使用适合你系统的包管理器进行安装
    if command -v apt-get > /dev/null 2>&1; then
        sudo apt-get install -y sshpass
    elif command -v yum > /dev/null 2>&1; then
        sudo yum install -y sshpass
    elif command -v pacman > /dev/null 2>&1; then
        sudo pacman -S --noconfirm sshpass
    else
        action "无法确定系统的包管理器,请手动安装 sshpass." /bin/false
        exit 1
    fi

    # 再次检查是否安装成功
    if command -v sshpass > /dev/null 2>&1; then
        action "sshpass 安装成功." /bin/true
    else
        action "无法安装 sshpass,请手动安装." /bin/false
        exit 1
    fi
fi

# 3、创建密钥对
if [ -f ~/.ssh/id_rsa ]; then
   echo "已经创建密钥对"
else
   echo "正在创建密钥对..."
   ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' &>/dev/null
   if [ $? -eq 0 ]; then
      action "密钥创建成功" /bin/true
   else
      action "密钥创建失败" /bin/false
   fi
fi

# 4、通过循环发送公钥
for ip in $ips
do
  sshpass -p "${passwd}" ssh-copy-id  -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no $ip &>/dev/null
  if [ $? -eq 0 ]; then
     action "$ip 公钥分发 成功" /bin/true
  else
     action "$ip 公钥分发 失败" /bin/false
  fi
done

2.2 执行脚本

[root@harbor01 ~]# bash   /scripts/fenfakey.sh
目前环境可以联网                                           [  OK  ]
sshpass 已经安装.                                         [  OK  ]
正在创建密钥对...
密钥创建成功                                               [  OK  ]
192.168.1.37 公钥分发 成功                                 [  OK  ]
192.168.1.66 公钥分发 成功                                 [  OK  ]