Як я можу скопіювати кілька файлів через scp в одній команді?


20

Мені доводиться переносити багато файлів з одного ПК на інший (обидва Linux). Я хотів би використовувати scpдля цього, але scpдозволяє лише передавати один файл за один раз.

Як я можу це зробити?

Я маю

  • Немає можливості використовувати rsync або будь-який інший протокол
  • Немає можливості використовувати сертифікати без пароля (але мати сертифікат із парольною фразою)
  • Список файлів для передачі та список із призначенням шляху до файлів на іншому сервері
  • Файли розповсюджені в багатьох каталогах, і не всі файли в каталогах, які я хочу скопіювати

Якщо можливо, я б хотів прозоро gzip та ungzip, щоб зберегти пропускну здатність!

Чи можливо це?

Відповіді:


31

Використання tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

2
Тут є формат файлу: "У режимі c тар буде читати імена, що архівуються з імені файлу. Спеціальне ім'я -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 ''."
Куша

14

Я хотів би використовувати scp для цього, але scp дозволяє переносити лише один файл за один раз.

Я впевнений, що це неправда, принаймні, не для scpкоманди, наданої OpenSSH, що входить до більшості дистрибутивів Linux.

Я використовую scp file1 file2 ... fileN user@host:/destination/directory/досить часто.

Для прозорого стиснення протокол SSH вбудований і scpможе використовувати його, якщо ви надаєте -Cпараметр у командному рядку. Для безлічі подібних невеликих файлів ви знайдете варіант tar + gz, запропонований akira, покращує стиснення, оскільки він може використовувати подібність між такими файлами, коли scpстискає кожен файл як окрему сутність. Я, як правило, вважаю за краще використовувати scp, хоча так простіше відновити часткову передачу (або, хоча я знаю, що у цій ситуації запитувач не має можливості), rsyncоскільки це ще простіше відновити і ділиться цілою опцією tar + gz цілою -перевага переваги стиснення.


Це правильна відповідь, але вона дійсно передає лише один файл за один раз. Тим не менш, він буде повною мірою використовувати наявну пропускну здатність і повинен працювати якомога швидше.
Бенджамін Баньє

4

Не scp -r yourdir otherhost:/otherdirпрацює?

Спробуйте потім:

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

z-flag дьоготь робить стиснення. Або ви можете використовувати -C для ssh:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

що робить -C?
Натан Фелман

1
Проблема в тому, що у мене є список файлів. Файли розповсюджені в багатьох каталогах, і не всі файли в каталогах, які я хочу скопіювати
Peter Smit

2
@Nathan: -C - це дозволити ssh робити стиснення.
Джиммі Гедман

1

На RHEL5 ось єдиний можливий спосіб, який я знаю, щоб захистити копію списку файлів, що містять спеціальні символи (наприклад, пробіл). Складіть скрипт оболонки та додайте наступне:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

Це може бути зроблено без особливих проблем.

Я просто створюю список файлів з ім'ям хосту поруч із кожним файлом, і scp, здається, добре розбирає його. тобто.

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

Scp, здається, добре працює з цим синтаксисом. Оскільки я спробував це без імені хоста поруч із кожним файлом, він не вдався після першого файлу. Здається, я згадую інший синтаксис, який я раніше використовував для цього, і опублікував його, коли я знайду його.


Це працює, але досить повільно - здається, що для кожного файлу починається з'єднання ... (я прийшов сюди шукати рішення для повільної копії ...), ~/здебільшого можна залишати поза увагою - SCP працює відносно домашнього каталогу. .. Якщо у вас є список з інших місць в $list: scp $(echo "$list"|sed "s/^/$srchost:/") local_destination(Це порушиться для назви файлів з пробілами)
Герт ван ден Берг

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.