แทนที่จะพิมพ์รหัสผ่านของคุณหลายครั้งคุณสามารถใช้pssh
และ-A
สวิตช์เพื่อแจ้งรหัสผ่านครั้งเดียวแล้วป้อนรหัสผ่านไปยังเซิร์ฟเวอร์ทั้งหมดในรายการ
หมายเหตุ:ใช้วิธีนี้ไม่ได้ช่วยให้คุณใช้ssh-copy-id
แต่เพื่อให้คุณจะต้องม้วนวิธีการของคุณเองสำหรับการผนวก SSH ไฟล์คีย์ผับของคุณกับบัญชีระยะไกลของ~/.ssh/authorized_keys
ไฟล์
ตัวอย่าง
นี่คือตัวอย่างที่ทำงาน:
$ cat ~/.ssh/my_id_rsa.pub \
| pssh -h ips.txt -l remoteuser -A -I -i \
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7
สคริปต์ข้างต้นมีโครงสร้างโดยทั่วไปเช่น:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
รายละเอียดระดับสูง
cat <pubkey>
เอาต์พุตไฟล์พับลิกคีย์ไปที่ pssh
pssh
ใช้-I
สวิตช์เพื่อนำเข้าข้อมูลผ่าน STDIN
-l <remote user>
คือบัญชีของเซิร์ฟเวอร์ระยะไกล (เราสมมติว่าคุณมีชื่อผู้ใช้เดียวกันทั่วเซิร์ฟเวอร์ในไฟล์ IP)
-A
บอกpssh
ให้ถามรหัสผ่านของคุณแล้วนำมาใช้ใหม่สำหรับเซิร์ฟเวอร์ทั้งหมดที่เชื่อมต่อด้วย
-i
บอกpssh
ให้ส่งเอาต์พุตใด ๆ ไปยัง STDOUT แทนที่จะเก็บไว้ในไฟล์ (พฤติกรรมเริ่มต้น)
'...cmds to add pubkey...'
- นี่คือส่วนที่ยากที่สุดของสิ่งที่เกิดขึ้นดังนั้นฉันจะทำลายมันด้วยตัวเอง(ดูด้านล่าง)
คำสั่งถูกเรียกใช้บนเซิร์ฟเวอร์ระยะไกล
นี่คือคำสั่งที่pssh
จะทำงานบนเซิร์ฟเวอร์แต่ละเครื่อง:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
ในการสั่งซื้อ:
ตั้งค่า umask ของผู้ใช้ระยะไกลเป็น 077 นี่คือเพื่อให้ไดเรกทอรีหรือไฟล์ใด ๆ ที่เรากำลังจะสร้างจะมีการตั้งค่าการอนุญาตตามที่ต้องการ:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser 771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
สร้างไดเรกทอรี~/.ssh
และไม่สนใจเตือนเราหากมีอยู่แล้ว
- ตั้งค่าตัวแปรโดย
$afile
มีพา ธ ไปยังไฟล์ authorized_keys
cat - >> $afile
- รับอินพุตจาก STDIN และผนวกเข้ากับไฟล์ authorized_keys
sort -u $afile -o $afile
- จัดเรียงไฟล์ที่ได้รับอนุญาตไม่ซ้ำกันและบันทึกไว้
หมายเหตุ:บิตสุดท้ายนั้นคือการจัดการเคสที่คุณรันหลาย ๆ ครั้งด้านบนเทียบกับเซิร์ฟเวอร์เดียวกัน วิธีนี้จะกำจัด pubkey ของคุณจากการผนวกหลาย ๆ ครั้ง
สังเกตุเห็บเดียว!
ยังให้ความสนใจเป็นพิเศษกับความจริงที่ว่าคำสั่งเหล่านี้ทั้งหมดจะซ้อนอยู่ในเครื่องหมายคำพูดเดี่ยว นั่นเป็นสิ่งสำคัญเนื่องจากเราไม่ต้องการ$afile
รับการประเมินจนกว่าจะดำเนินการบนเซิร์ฟเวอร์ระยะไกล
' \
..cmds... \
'
ฉันได้ขยายด้านบนเพื่อให้ง่ายต่อการอ่านที่นี่ แต่โดยทั่วไปฉันจะเรียกใช้ทั้งหมดในบรรทัดเดียวเช่น:
$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'
วัสดุโบนัส
เมื่อใช้pssh
คุณสามารถสร้างไฟล์และให้เนื้อหาแบบไดนามิกโดยใช้-h <(...some command...)
หรือคุณสามารถสร้างรายการ IP โดยใช้pssh
สวิตช์-H "ip1 ip2 ip3"
อื่น
ตัวอย่างเช่น:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
ด้านบนสามารถใช้เพื่อดึงรายการ IP จาก~/.ssh/config
ไฟล์ของฉัน แน่นอนคุณสามารถใช้printf
เพื่อสร้างเนื้อหาแบบไดนามิกเช่นกัน:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
ตัวอย่างเช่น:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
คุณยังสามารถใช้seq
เพื่อสร้างลำดับตัวเลขที่จัดรูปแบบด้วย!
การอ้างอิงและเครื่องมือที่คล้ายกัน pssh
หากคุณไม่ต้องการใช้pssh
เพราะฉันได้ทำไปแล้วมีตัวเลือกอื่นให้เลือก