Я создал программу, которая выполняет итерацию над кучей файлов и вызывает некоторые из них:
scp <file> [email protected]:<remotefile>
Однако в моем случае могут быть тысячи небольших файлов, которые необходимо перенести, а scp открывает новое ssh-соединение для каждого из них, что имеет довольно определенные накладные расходы.
Мне было интересно, нет ли решения, в котором я поддерживаю один процесс, поддерживающий соединение, и я могу отправить его "запросы" для копирования по отдельным файлам.
В идеале, я ищу комбинацию некоторой программы-отправителя и получателя, так что я могу начать один процесс (1) в начале:
ssh [email protected] receiverprogram
И для каждого файла я вызываю команду (2):
senderprogram <file> <remotefile>
и вывести вывод (2) на вход (1), и это приведет к передаче файла. В конце концов, я могу просто отправить процесс (1) на какой-либо сигнал для завершения.
Предпочтительно программы отправителя и получателя представляют собой программы с открытым кодом C для Unix. Они могут связываться с использованием сокета вместо канала или любого другого творческого решения.
Тем не менее, это важное ограничение, что каждый файл передается в момент, когда я перебираю его: недопустимо собирать список файлов, а затем вызывать один экземпляр scp
для передайте все файлы сразу в конце. Кроме того, у меня есть только простой доступ оболочки к принимающему хосту.
Обновление: Я нашел решение проблемы с накладными данными соединения с использованием функций мультиплексирования ssh, см. мой собственный ответ ниже. Тем не менее, я начинаю щедрость, потому что мне интересно узнать, существует ли программа отправителя/получателя, как я описываю здесь. Кажется, что должно существовать что-то, что можно использовать, например. Xmodem/YMODEM/Zmodem?