scp ไฟล์เดียวไปยังหลาย ๆ ที่


28

คุณสามารถscpส่งไฟล์ไปยังหลาย ๆ ตำแหน่งในคำสั่งเดียวกันได้หรือไม่?

ตัวอย่างเช่น:

scp file.txt user@ip-1.com:, user@ip2.com:

หรือมันจะเป็นประโยชน์มากกว่าในการสร้าง bash script ที่มีโฮสต์ทั้งหมดที่มีอยู่แล้วและมันจะใช้ไฟล์เป็นอาร์กิวเมนต์?

คำตอบ:


24

สมมติว่าคุณมีไฟล์ ( destfile.txt) ที่มีuser@host- ค่าหนึ่งอันต่อหนึ่งบรรทัด จากนั้นคุณสามารถทำสิ่งนี้:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt

มันใช้งานได้! ยังไม่กี่พิมพ์แม้ว่า อาจจะมีวิธีที่จะทำให้มันง่ายขึ้น
แอนดรู

2
@Andrew ถ้าคุณเปลี่ยนfor-loop เป็นwhile read dest; doมันจะอ่านจากอินพุตมาตรฐาน วางไว้ในสคริปต์และป้อนdestfile.txtเข้าไป (เช่น./thescript.sh <destfile.txt)
Kusalananda

ฉันเคยทำมาก่อน แต่ด้วย rsync และบางโหนดของฉันไม่ได้รับการปรับปรุง มีความคิดอะไรไหม
Soubriquet

7

ดูเหมือนว่างานสำหรับ parallel-scp (n) (t) - ใช้ชุดคำสั่งที่อนุญาตให้คำสั่ง scp รันบนหลายระบบพร้อมกัน มันจะช่วยให้การคัดลอกไฟล์ในแบบคู่ขนานกับชุดของเครื่อง


4
cat file.txt | tee >(ssh user@ip1.com "cat > file.txt") \
                   >(ssh user@ip2.com "cat > file.txt")

tar cz file1 file2 file3 | tee >(ssh user@ip1.com "tar xz") \
                               >( ... )

0

อีกทางเลือกหนึ่ง (และหนึ่งซับ) จะใช้ pdsh แทนเพื่อเชื่อมต่อกับแต่ละโหนดเป้าหมายและทริกเกอร์รับจากที่นั่น:

pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile

หลักสูตรนี้ต้องการข้อมูลเพิ่มเติมหนึ่งรายการ (โฮสต์ท้องถิ่น) และสิทธิ์ผู้ใช้ที่แตกต่างกัน แต่คุณหลีกเลี่ยงการวนซ้ำในการทุบตีและการใช้ทางอ้อมเพื่ออ่านไฟล์


0

นี่คืออีกหนึ่งตัวเลือกโดยมีเชลล์สคริปต์หนึ่งบรรทัด

cscp.sh 20337.patch < hosts.txt

มันใช้สองไฟล์หนึ่งสำหรับลูปและหนึ่งไฟล์สำหรับรายการโฮสต์เซิร์ฟเวอร์ มันอ่าน$1ค่าพารามิเตอร์แรกจาก CLI เป็นชื่อไฟล์ไปยัง SCP

cscp.sh

#!/bin/bash
while read host; do
  scp $1 ${host}:
done

hosts.txt

project-prod-web1
project-prod-web2
project-prod-web3

การใช้

คัดลอกไฟล์ไปยังหลายโฮสต์:

cscp.sh file < hosts

0

หากคุณมีระเบียบการตั้งชื่อที่สอดคล้องกันเกิดขึ้นสำหรับเซิร์ฟเวอร์หลายเครื่องคุณสามารถทำสิ่งที่เรียบร้อยเช่น:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.