Я создал программу, которая перебирает кучу файлов и вызывает некоторые из них:
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?