scp satu file ke beberapa lokasi


28

Bisakah Anda scpfile ke beberapa lokasi dalam perintah yang sama?

Sebagai contoh:

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

Atau akan lebih praktis untuk membuat skrip bash yang sudah memiliki semua host di dalamnya dan itu hanya akan mengambil file sebagai argumen?

Jawaban:


24

Katakanlah Anda memiliki file ( destfile.txt) dengan user@host-nilai, satu di setiap baris. Maka Anda bisa melakukan ini:

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

Ini bekerja! Masih sedikit untuk mengetik. Mungkin ada cara untuk menyederhanakannya.
Andrew

2
@Andrew, jika Anda mengubah for-loop menjadi while read dest; do, itu akan membaca dari input standar. Masukkan ke dalam skrip dan masukkan destfile.txtke dalamnya (misalnya, ./thescript.sh <destfile.txt).
Kusalananda

Saya melakukan yang pertama, tetapi dengan rsync dan beberapa node saya tidak memperbarui. Ada yang tahu kenapa?
Soubriquet

7

Tampak seperti pekerjaan untuk parallel-scp (n) (t) - ini mengimplementasikan seperangkat perintah yang memungkinkan perintah scp dijalankan di banyak sistem sekaligus. Ini akan memungkinkan untuk menyalin file secara paralel ke satu set mesin.


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

Alternatif lain (dan satu-liner) adalah sebagai gantinya menggunakan pdsh untuk terhubung ke setiap node target dan memicu get dari sana:

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

Ini tentu saja memerlukan satu informasi lagi (host lokal) dan hak pengguna yang berbeda, tetapi Anda menghindari perulangan di bash dan menggunakan tipuan untuk membaca file.


0

Berikut opsi lain, dengan skrip shell satu baris.

cscp.sh 20337.patch < hosts.txt

Ia menggunakan dua file, satu untuk loop, dan satu untuk daftar host server. Bunyinya $1untuk parameter pertama dari CLI sebagai nama file ke SCP

cscp.sh

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

hosts.txt

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

Pemakaian

Salin file ke beberapa host:

cscp.sh file < hosts

0

Jika Anda memiliki konvensi penamaan yang konsisten untuk beberapa server, Anda dapat melakukan sesuatu yang rapi seperti:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.