Jak mogę skopiować wiele plików za pomocą SCP w jednym poleceniu?

20

Muszę przetransportować wiele plików z jednego komputera na drugi (oba Linux). Chciałbym do tego użyć scp, ale scppozwala na przesyłanie tylko jednego pliku na raz.

W jaki sposób mogę to zrobić?

mam

  • Brak możliwości użycia rsync lub jakiegokolwiek innego protokołu
  • Brak możliwości użycia certyfikatów wolnych od hasła (ale posiadanie certyfikatu z hasłem)
  • Lista plików do przesłania i lista ze ścieżką docelową plików na drugim serwerze
  • Pliki są rozłożone na wiele katalogów, a nie na wszystkie pliki w katalogach, które chcę skopiować

Jeśli to możliwe, chciałbym transparentnie rozpakować i rozpakować, aby zaoszczędzić przepustowość!

czy to możliwe?

Peter Smit
źródło

Odpowiedzi:

31

Użyj tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
akira
źródło
2
Oto format pliku: „W trybie c tar odczyta nazwy, które mają zostać zarchiwizowane z nazwy pliku. Nazwa specjalna -C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C '”.
Kousha,
14

Chciałbym do tego użyć scp, ale scp pozwala na przesyłanie tylko jednego pliku na raz.

Jestem prawie pewien, że to nieprawda, przynajmniej nie dla scppolecenia dostarczonego przez OpenSSH zawartego w większości dystrybucji Linuksa.

Używam scp file1 file2 ... fileN user@host:/destination/directory/dość często.

W przypadku przezroczystej kompresji protokół SSH ma tę wbudowaną funkcję i scpmoże jej używać, jeśli podasz -Copcję w wierszu polecenia. W przypadku wielu podobnych małych plików znajdziesz opcję tar + gz sugerowaną przez akira, która zyskuje lepszą kompresję, ponieważ może korzystać z podobieństwa między takimi plikami, w których scpkażdy plik jest oddzielny. Generalnie wolę używać scp, ponieważ łatwiej jest wznowić częściowe przeniesienie (lub, chociaż wiem, że w tej sytuacji pytający nie ma takiej opcji), rsyncponieważ jest to nawet łatwiejsze do wznowienia i udostępnia całą opcję tar + gz przewaga kompresji strumienia.

David Spillett
źródło
To właściwa odpowiedź, ale tak naprawdę przenosi tylko jeden plik na raz. Niemniej jednak w pełni wykorzysta dostępną przepustowość i powinien działać tak szybko, jak to możliwe.
Benjamin Bannier
4

Nie scp -r yourdir otherhost:/otherdirdziała?

Spróbuj tego następnie:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

zFLAG do smoły robi kompresji. Lub możesz użyć -C do ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"
Jimmy Hedman
źródło
Co ma -Czrobić?
Nathan Fellman,
1
Problem polega na tym, że mam listę plików. Pliki są rozmieszczone w wielu katalogach, a nie wszystkie pliki w katalogach, które chcę skopiować
Peter Smit
2
@Nathan: -C pozwala kompresji ssh.
Jimmy Hedman
1

Na RHEL5 jest to jedyny znany mi sposób na bezpieczne skopiowanie listy plików zawierających znaki specjalne (np. Spację). Utwórz skrypt powłoki i dołącz następujące elementy:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE
Brian Thomas
źródło
0

Można to zrobić bez większych problemów.

Po prostu tworzę listę plików z nazwą hosta obok każdego pliku, a scp wydaje się, że parsuje to dobrze. to znaczy.

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp wydaje się działać dobrze z tą składnią. Podczas próby bez nazwy hosta obok każdego pliku nie powiodło się po pierwszym pliku. Wydaje mi się, że pamiętam inną składnię, której użyłem wcześniej i opublikuję ją, gdy ją zlokalizuję.

Ernie M.
źródło
To działa, ale jest dość powolne - wydaje się, że nawiązuje połączenie dla każdego pliku ... (Przyszedłem tutaj, szukając rozwiązania dla powolnej kopii ...) ~/można w większości pominąć - SCP działa względem katalogu domowego. .. Jeśli masz listę z innych miejsc w $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(To spowoduje uszkodzenie nazw plików ze spacjami)
Gert van den Berg