Отправитель и получатель для передачи файлов через SSH по запросу? - PullRequest
10 голосов
/ 05 февраля 2009

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

scp <file> user@host:<remotefile>

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

Мне было интересно, не существует ли решения, в котором я поддерживаю один процесс, поддерживающий соединение, и могу ли я отправлять ему «запросы» на копирование отдельных файлов.

В идеале я ищу комбинацию некоторой программы отправителя и получателя, чтобы я мог запустить один процесс (1) в начале:

ssh user@host receiverprogram

И для каждого файла я вызываю команду (2):

senderprogram <file> <remotefile>

и передать вывод (2) на вход (1), и это приведет к передаче файла. В конце я могу просто послать процессу (1) сигнал для завершения.

Предпочтительно программы отправителя и получателя являются программами C с открытым исходным кодом для Unix. Они могут общаться, используя сокет вместо трубы или любое другое творческое решение.

Однако важное ограничение заключается в том, что каждый файл передается в момент, когда я выполняю итерацию по нему: недопустимо собирать список файлов и затем вызывать один экземпляр scp для передачи все файлы сразу в конце. Кроме того, у меня есть только простой доступ к оболочке для принимающего хоста.

Обновление: Я нашел решение проблемы издержек соединения, используя функции мультиплексирования ssh, см. Мой собственный ответ ниже. Тем не менее, я начинаю вознаграждение, потому что мне любопытно узнать, существует ли программа отправителя / получателя, как я здесь описываю. Кажется, должно быть что-то, что можно использовать, например, Xmodem / YMODEM / Zmodem?

Ответы [ 14 ]

1 голос
/ 11 февраля 2009

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

Новая версия GNOME использовала GVFS через GIO для выполнения всех видов ввода-вывода через разные бэкэнды. Пакет Ubuntu gvfs-bin предоставляет различные утилиты командной строки, которые позволяют вам манипулировать бэкэндами из командной строки.

Сначала вам нужно смонтировать папку SSH:

gvfs-mount sftp: // пользователь @ хост /

И затем вы можете использовать gvfs-copy для копирования ваших файлов. Я думаю, что все передачи файлов будут выполняться через один процесс SSH. Вы даже можете использовать ps, чтобы увидеть, какой процесс используется.

Если вы чувствуете себя более предприимчивым, вы даже можете написать свою собственную программу на C или на другом языке высокого уровня, который предоставляет API для GIO.

1 голос
/ 05 февраля 2009

Похоже на работу для смолы? Передайте его вывод в ssh, а с другой стороны направьте вывод ssh обратно в tar.

0 голосов
/ 12 февраля 2009

Проще говоря, напишите небольшой скрипт-обертку, который делает что-то вроде этого.

  1. tar файлы
  2. отправить tar-файл
  3. Унтар на другой стороне

Примерно так:

  1. tar -cvzf test.tgz файлы ....
  2. scp test.tgz user@other.site.com:.
  3. ssh user@other.site.com tar -xzvf test.tgz

/ Йохан

0 голосов
/ 12 февраля 2009
rsync -avlzp user@remotemachine:/path/to/files /path/to/this/folder

Это будет использовать SSH для передачи файлов, не медленным способом

...