четверг, 15 января 2009 г.

Интересный способ передачи файлов с одного компьютера на другой

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

Недавно мне потребовалось передать по локальной сети репозиторий Ubuntu 8.10 с одного компьютера на другой. 44000 файлов и папок - это довольно много. Заливать их, к примеру, по FTP - очень долго, т. к. для каждого файла будет открываться новое соединение. scp и rsync тоже, насколько я знаю, довольно медленно работают с большим количеством файлов.

И я уже начал запаковывать его в tar архив, чтобы передать по FTP, как вспомнил, что есть такая вещь как netcat. Раньше я им никогда не пользовался - просто где-то слышал о нем и запомнил о его существовании, т. к. он может очень пригодиться при написании скриптов.

Открыл man, почитал и запустил на одной машине команду
nc -q0 -l -p 6000 | tar -x
а на другой
tar -c Ubuntu.8.10.i386.repository | nc -q0 192.168.0.1 6000

Все! Файлы потекли бурным потоком с одной машины на другую.

Кстати, кроме красоты реализации и скорости работы он также имеет следующие преимущества перед остальными способами (FTP, scp, rsync):
  • Нет необходимости держать постоянно запущенный демон (FTP, SSH);
  • tar и netcat по умолчанию ставятся, наверное, практически во всех дистрибутивах, так что данный метод можно использовать "из коробки";
  • Если вы передаете, например, дерево исходников, которые очень хорошо сжимаются, то можно добавить к опциям tar флаг -z или -j, в результате чего передаваемые данные будут сжиматься на лету (ну ни красота ли? :) ), что может быть актуально, к примеру, при передаче файлов через Интернет.

14 комментариев:

Zed комментирует...

rsync и ssh тоже умеют поджимать. особенно rsync. не думаю что им бы было медленнее.

bappoy комментирует...

Способ хорош, но недостаточно безопасен в сетях общего пользования. Я обычно делаю так:
tar czf - /path/to/dir | ssh user@host tar -C /another/path/to/dir -x

Правда, при этом sshd должен быть запущен и желательно, чтобы ключи с первой машины были прописаны на второй. Зато секурно :)

flycat комментирует...

SSH рулит по-любому:
- безопасно
- быстро
- практически всегда есть (если не в запущенном состоянии, так в установленном

2bappoy: ключи необязательно, но тогда пароль вводить надо.

Конищев Дмитрий комментирует...

Когда нужна безопасность - не вопрос, лучше всего использовать ssh. У нас (на работе, где я это делал) на машинах далеко не везде висит sshd, поэтому мне данный способ очень даже кстати.

Анонимный комментирует...

По локалу, в пределах одного сегмента - вполне подходит, в агрессивной среде _весьма_ желательно траффик шифровать, так что лучше использовать scp либо tar|cpio|what_else в пайп ssh.

Кроме того sshd ИМХО должен быть запущен на каждой системе - иначе как ей безопастно рулить удалённо? :)

morbo комментирует...

rsync не открывает новое соединение на каждый файл - он пользуется одним соединением.

Его главный плюс по сравнению с tar через ssh, tar через naetcat, scp или sftp - умная докачка: умеет определять по контрольным суммам не только недокачанные или пропущеные файлы, но и пропущенные при скачивании блоки!

virens комментирует...

просто где-то слышал о нем
не тут случаем? :-))

Конищев Дмитрий комментирует...

virens, да, скорее всего. =)

Алексей Плутахин комментирует...

В общем-то + 1 за ssh. Особенно актуально, когда по быстрому файлы на виндовую машинку передать надо. Для windows роль scp играет winscp, похожий чем-то на тотал командер.

Алексей Плутахин комментирует...

Но и приведенный способ беспорно интересен )), как-нибудь попробую.

Тарас комментирует...

У меня не работает. Нужна настройка nc?

Тарас комментирует...

taras@taras-desktop:/var/cache/apt$ tar -c archives | nc -q0 10.140.200.147 6000(UNKNOWN) [10.140.200.147] 6000 (x11) : Connection refused

Конищев Дмитрий комментирует...

Тарас, предполагается, что вы сперва запускаете команду
nc -q0 -l -p 6000 | tar -x
Она открывает порт, на который и коннектится
tar -c Ubuntu.8.10.i386.repository | nc -q0 192.168.0.1 6000
о чем вам netcat и сообщил: 'Connection refused' - т. е. порт на другом компьютере в данный момент не открыт.

Дмитрий комментирует...

пакет sshfs рекомендую. просто монтируете директорию на удаленном компе директории на локальном и работаете как со своей папкой при помощи mc. файлы туда-сюда ходят по ssh.