Недавно мне потребовалось передать по локальной сети репозиторий 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 комментариев:
rsync и ssh тоже умеют поджимать. особенно rsync. не думаю что им бы было медленнее.
Способ хорош, но недостаточно безопасен в сетях общего пользования. Я обычно делаю так:
tar czf - /path/to/dir | ssh user@host tar -C /another/path/to/dir -x
Правда, при этом sshd должен быть запущен и желательно, чтобы ключи с первой машины были прописаны на второй. Зато секурно :)
SSH рулит по-любому:
- безопасно
- быстро
- практически всегда есть (если не в запущенном состоянии, так в установленном
2bappoy: ключи необязательно, но тогда пароль вводить надо.
Когда нужна безопасность - не вопрос, лучше всего использовать ssh. У нас (на работе, где я это делал) на машинах далеко не везде висит sshd, поэтому мне данный способ очень даже кстати.
По локалу, в пределах одного сегмента - вполне подходит, в агрессивной среде _весьма_ желательно траффик шифровать, так что лучше использовать scp либо tar|cpio|what_else в пайп ssh.
Кроме того sshd ИМХО должен быть запущен на каждой системе - иначе как ей безопастно рулить удалённо? :)
rsync не открывает новое соединение на каждый файл - он пользуется одним соединением.
Его главный плюс по сравнению с tar через ssh, tar через naetcat, scp или sftp - умная докачка: умеет определять по контрольным суммам не только недокачанные или пропущеные файлы, но и пропущенные при скачивании блоки!
просто где-то слышал о нем
не тут случаем? :-))
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.
Отправить комментарий