Как я могу скопировать несколько файлов через scp в одной команде?

20

Я должен перенести много файлов с одного компьютера на другой (оба Linux). Я хотел бы использовать scpдля этого, но scpпозволяет передавать только один файл за раз.

Как я могу это сделать?

у меня есть

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

Если возможно, я бы хотел прозрачно распаковать и распаковать, чтобы сэкономить пропускную способность!

Это возможно?

Питер Смит
источник

Ответы:

31

Используйте tar:

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
Акира
источник
2
Вот формат файла: "В режиме c tar прочитает имена, которые будут заархивированы из имени файла. Специальное имя -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
@ Натан: -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(Это будет сломано для имен файлов с пробелами, хотя)
Герт ван ден Берг
-1

Я бы порекомендовал частям использовать такую ​​команду, чтобы создать архив из списка файлов.

tar -cvf allfiles.tar -L mylist.txt

Затем используйте scp для загрузки архива.

scp user @ remotehost: ~ / allfiles.tar

/programming/8033857/tar-archiving-that-takes-input-from-a-list-of-files

Джастин Кубичек
источник