生產中使用ssh-copy-id複製公鑰到多臺服務器

在系統運維的時候,可能免密碼經過ssh方式登陸到遠程主機,這時就首先須要將本機的公鑰複製到遠程主機,用 ssh-copy-id 命令能夠輕鬆作到。bash

對於單臺遠程主機,直接使用命令就能夠了運維

#  生成密鑰
ssh-keygen -t rsa

# 複製公鑰到遠程主機
ssh-copy-id username@host

而在生產中,通常咱們擁有不少臺主機,若是在一臺一臺的重複執行 ssh-copy-id username@host 的話,效率就極其低下,如下是結合 pssh 命令,在咱們生產中使用的批量分發公鑰到多臺機器 ,但願能作到拋磚引玉ssh

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
相關文章
相關標籤/搜索