Câu trả lời:
Giả sử bạn có một tệp ( destfile.txt
) có giá user@host
trị, mỗi tệp trên mỗi dòng. Sau đó, bạn có thể làm như thế này:
while IFS= read -r dest; do
scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
for
-loop thành while read dest; do
, nó sẽ đọc từ đầu vào tiêu chuẩn. Đặt nó trong một tập lệnh và đưa dữ liệu destfile.txt
vào đó (ví dụ ./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") \
>( ... )
Một cách khác (và một lớp lót) sẽ thay vào đó là sử dụng pdsh để kết nối với từng nút mục tiêu và kích hoạt một get từ đó:
pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile
Điều này tất nhiên đòi hỏi thêm một thông tin (máy chủ lưu trữ cục bộ) và các quyền người dùng khác nhau, nhưng bạn tránh vòng lặp trong bash và sử dụng cảm ứng để đọc tệp.
Đây là một tùy chọn khác, với tập lệnh shell một dòng.
cscp.sh 20337.patch < hosts.txt
Nó sử dụng hai tệp, một cho vòng lặp và một cho danh sách máy chủ lưu trữ. Nó đọc $1
tham số đầu tiên từ CLI làm tên tệp cho SCP
cscp.sh
#!/bin/bash
while read host; do
scp $1 ${host}:
done
hosts.txt
project-prod-web1
project-prod-web2
project-prod-web3
Sử dụng
Sao chép tập tin vào nhiều máy chủ:
cscp.sh file < hosts
Nếu bạn có một quy ước đặt tên nhất quán đang diễn ra cho nhiều máy chủ, bạn có thể làm một cái gì đó gọn gàng như:
for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done