คัดลอกกุญแจสาธารณะ ssh ไปยังโฮสต์ Linux หลายตัว


14

ฉันพยายามคัดลอก. ssh / id_rsa.pub จากเซิร์ฟเวอร์กลางของเราไปยังเซิร์ฟเวอร์หลายเครื่อง ฉันมีสคริปต์ต่อไปนี้ซึ่งฉันมักจะใช้เพื่อผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์ที่แตกต่างกัน

#!/bin/bash


for ip in $(<IPs); do
    # Tell the remote server to start bash, but since its
    # standard input is not a TTY it will start bash in
    # noninteractive mode.
    ssh -q "$ip" bash <<-'EOF'



EOF

done

แต่ในกรณีนี้ฉันต้องกำหนดคีย์สาธารณะบนเซิร์ฟเวอร์ภายในแล้วเพิ่มไปยังเซิร์ฟเวอร์หลายเครื่อง มีวิธีโดยใช้สคริปต์เอกสารข้างต้นที่นี่เพื่อดำเนินการดังต่อไปนี้

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'

เหตุใดคุณจึงต้องสนใจกับโลคอลเนื่องจากคุณคัดลอกจากที่ตั้งศูนย์กลางไปยังรีโมต
klerk

ฉันจำเป็นต้องเพิ่มกุญแจสาธารณะของเซิร์ฟเวอร์กลางดังนั้นเซิร์ฟเวอร์ภายใน ขอโทษสำหรับความสับสน.
user67186

คำตอบ:


20

ด้วยลูปแบบง่ายนี้คุณสามารถทำให้เป็นอัตโนมัติและกระจายไปยังเซิร์ฟเวอร์ระยะไกลทั้งหมด

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done

สวัสดีฉันยอมรับคำตอบของคุณและมันใช้ได้ดี ขอบคุณ
user67186

+1 ฉันเป็นแฟนตัวยงของสไตล์สคริปต์ที่ง่ายมากที่จะทำงานให้เสร็จ!
Laith Leo Alobaidy

4

นี่คือสคริปต์ง่าย ๆ ของฉันเพื่อคัดลอก ssh-keygen ไปยังเซิร์ฟเวอร์หลายเครื่องโดยไม่ต้องขอรหัสผ่านทุกครั้ง

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done

3

คำตอบที่ได้รับการยอมรับจะไม่ทำงานหากจำเป็นต้องใส่กุญแจสาธารณะของคนอื่นในหลาย ๆ เครื่อง ดังนั้นฉันจึงคิดวิธีแก้ปัญหาต่อไปนี้:

cat add-vassal-tc-agents.sh

#!/bin/bash
set -x # enable bash debug mode
if [ -s vassal-public-key.pub ]; then # if file exists and not empty
    for ip in `cat tc-agents-list.txt`; do # for each line from the file
        # add EOL to the end of the file and echo it into ssh, where it is added to the authorized_keys
        sed -e '$s/$/\n/' -s vassal-public-key.pub | ssh $ip 'cat >> ~/.ssh/authorized_keys'
    done
else
    echo "Put new vassal public key into ./vassal-public-key.pub to add it to tc-agents-list.txt hosts"
fi

สคริปต์นี้เพิ่มคีย์ใหม่ให้กับผู้ใช้ในรายการเครื่องโดยมีเงื่อนไขว่าสภาพแวดล้อมที่รันอยู่มีการเข้าถึง

ตัวอย่างของtc-agents-list.txt:

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4

2

สำหรับการคัดลอกกุญแจสาธารณะของคุณคุณมีบางอย่างในตัว openssh เอง ดังนั้นแทนที่จะcatและsshใช้นี้: -

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST

ฉันต้องการที่จะดำเนินการคำสั่งคัดลอกสาธารณะของเซิร์ฟเวอร์กลางไปยังเซิร์ฟเวอร์ระยะไกลที่มีอยู่ในไฟล์ IP สคริปต์วนซ้ำผ่านพวกเขา ตัวอย่างของคุณอาจไม่มีประโยชน์ที่นี่ ขอบคุณ
user67186

ไม่จำเป็นต้องใช้ตัวเลือก -i หากคุณใช้ตำแหน่งเริ่มต้นของรหัสสาธารณะ
Laith Leo Alobaidy

0

คุณสามารถทำได้ด้วยรายการ while-loop และเซิร์ฟเวอร์แบบฝังที่เรียบง่ายเช่นนี้:

while read SERVER
do
    ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF

การมีรายการภายในสคริปต์นั้นทำได้โดยใช้ไฟล์ข้อมูลแยกต่างหากซึ่งอาจหายไปได้


ssh-copy-idได้รับการแนะนำแล้วในคำตอบอื่น ๆ
RalfFriedl

0

สมมติว่าคุณมีไฟล์ที่มีรายการ IP ของเซิร์ฟเวอร์ชื่อ SERVER และมีเพียงที่อยู่ IP ของเซิร์ฟเวอร์ที่กำหนดไว้

นี้สำหรับวงจะทำงานได้ดี

for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
        ssh-copy-id -f -i id_rsa_k2.pub $user
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.