คุณสามารถscp
ส่งไฟล์ไปยังหลาย ๆ ตำแหน่งในคำสั่งเดียวกันได้หรือไม่?
ตัวอย่างเช่น:
scp file.txt user@ip-1.com:, user@ip2.com:
หรือมันจะเป็นประโยชน์มากกว่าในการสร้าง bash script ที่มีโฮสต์ทั้งหมดที่มีอยู่แล้วและมันจะใช้ไฟล์เป็นอาร์กิวเมนต์?
คุณสามารถscp
ส่งไฟล์ไปยังหลาย ๆ ตำแหน่งในคำสั่งเดียวกันได้หรือไม่?
ตัวอย่างเช่น:
scp file.txt user@ip-1.com:, user@ip2.com:
หรือมันจะเป็นประโยชน์มากกว่าในการสร้าง bash script ที่มีโฮสต์ทั้งหมดที่มีอยู่แล้วและมันจะใช้ไฟล์เป็นอาร์กิวเมนต์?
คำตอบ:
สมมติว่าคุณมีไฟล์ ( destfile.txt
) ที่มีuser@host
- ค่าหนึ่งอันต่อหนึ่งบรรทัด จากนั้นคุณสามารถทำสิ่งนี้:
while IFS= read -r dest; do
scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
for
-loop เป็นwhile read dest; do
มันจะอ่านจากอินพุตมาตรฐาน วางไว้ในสคริปต์และป้อนdestfile.txt
เข้าไป (เช่น./thescript.sh <destfile.txt
)
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") \
>( ... )
อีกทางเลือกหนึ่ง (และหนึ่งซับ) จะใช้ pdsh แทนเพื่อเชื่อมต่อกับแต่ละโหนดเป้าหมายและทริกเกอร์รับจากที่นั่น:
pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile
หลักสูตรนี้ต้องการข้อมูลเพิ่มเติมหนึ่งรายการ (โฮสต์ท้องถิ่น) และสิทธิ์ผู้ใช้ที่แตกต่างกัน แต่คุณหลีกเลี่ยงการวนซ้ำในการทุบตีและการใช้ทางอ้อมเพื่ออ่านไฟล์
นี่คืออีกหนึ่งตัวเลือกโดยมีเชลล์สคริปต์หนึ่งบรรทัด
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
หากคุณมีระเบียบการตั้งชื่อที่สอดคล้องกันเกิดขึ้นสำหรับเซิร์ฟเวอร์หลายเครื่องคุณสามารถทำสิ่งที่เรียบร้อยเช่น:
for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done