C/C++教程

生产中使用ssh-copy-id复制公钥到多台服务器

本文主要是介绍生产中使用ssh-copy-id复制公钥到多台服务器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在系统运维的时候,可能免密码通过ssh方式登录到远程主机,这时就首先需要将本机的公钥复制到远程主机,用 ssh-copy-id 命令可以轻松做到。

对于单台远程主机,直接使用命令就可以了

#  生成密钥
ssh-keygen -t rsa

# 复制公钥到远程主机
ssh-copy-id username@host

而在生产中,一般我们拥有很多台主机,如果在一台一台的重复执行 ssh-copy-id username@host 的话,效率就极其低下,以下是结合 pssh 命令,在我们生产中使用的批量分发公钥到多台机器 ,希望能做到抛砖引玉

1. 新建hosts文件

[@bjyf_50_20 ansible]# cat host_test
10.160.9.162
10.160.24.163
[@bjyf_50_20 ansible]#

2. 分发公钥脚本

[@bjyf_50_20 ansible]# cat key.sh
#!/bin/bash
#
passwd=(
"123456"
"567890"
)
 
PWD_IDX=$((${#passwd[@]}-1))
 
function usage(){
    echo -e "\t\033[31m You entered an incorrent parameter \033[0m"
    echo -e "\t\033[31m Such as: $(basename $0) iplist\033[0m"
    exit 1
}
 
function exec_ip(){
    sort -g ${INPUT_IP_FILE} > not_check_ip
    for i in $(seq 0 $PWD_IDX)
    do
        if [ ! -s not_check_ip ];then
          continue
        fi
        sshpass -p"${passwd[$i]}" pssh -iAh not_check_ip -l root -p 100 -O StrictHostKeyChecking=no -t 5 "whoami" \
        |grep SUCCESS \
        |awk '{print $NF}' \
        |sort -g>ip.$i
        grep -vFf ip.$i not_check_ip |sort -g > not_check_ip.tmp
        mv not_check_ip.tmp not_check_ip
    done
}
 
function exec_key(){
    for i in $(seq 0 ${PWD_IDX})
    do
        if [ ! -e ip.$i ];then
            break
        fi
        if [ -e ip.$i -a $(wc -l ip.$i|awk '{print $1}') -gt 0 ];then
            echo "---------------------------------------------------"
            for ip in $(cat ip.$i)
            do
                arg="ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip"
                echo "sshpass -p${passwd[$i]} ${arg}"
                sshpass -p${passwd[$i]} ${arg}
            done
        fi
    done
}
if [ $# -lt 1 ];then
    usage
fi
INPUT_IP_FILE=$1
exec_ip
exec_key
rm -f ip.*
[@bjyf_50_20 ansible]#

3. 执行脚本

[@bjyf_50_20 ansible]#sh -x key.sh host_test
这篇关于生产中使用ssh-copy-id复制公钥到多台服务器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!