Этот другой ответ обсуждает смысл вашего собственного протокола / установки. Я не буду повторять это. Я предполагаю, что ваше собственное решение - то, что вы хотите.
nc -k
- не лучший инструмент для получения "нескольких файлов из нескольких источников", поскольку он будет прослушивать другое соединение только после завершения текущего. Это означает, что он будет получать несколько файлов, но один за другим, а не параллельно. Ваши "несколько источников" будут блокировать друг друга.
socat
с reuseaddr
и fork
может быть лучше.
В качестве доказательства концепции давайте создадим (быстрым и грязным способом) наш собственный протокол. Файл будет передан в виде потока, который состоит из:
- имя файла или путь для использования на принимающей стороне (без перевода строки);
- одиночная новая строка (
\n
, LF, 0x0a) в качестве разделителя;
- двоичные данные;
- EOF.
Это принимающая команда:
socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && cat >"$f"'
(Изменить) Это универсальная команда приема, которая удаляет завершающий \r
(если есть) из имени файла (полезно для работы с клиентами Windows, не полностью совместимыми с протоколом):
socat TCP-LISTEN:50011,reuseaddr,fork SYSTEM:'read -r f && f="${f%$(printf "\r")}" && cat >"$f"'
(Редактирование заканчивается здесь).
Чтобы отправить файл:
(echo "The new name.foo" && cat "./the file to send.bar") > /dev/tcp/192.168.22.33/50011
Заметки:
50011
- номер порта TCP, вы можете выбрать свой;
192.168.22.33
- адрес сервера, измените его в соответствии с вашими настройками;
- Я использовал
/dev/tcp/…/…
синтаксис, который работает в Bash, по каналу к nc
если вы хотите / нуждаетесь;
- коллизии с именами файлов по-прежнему остаются проблемой, вам нужна некоторая скриптовая логика (вместо простого
cat
) для их разрешения;
SYSTEM
имеет свои ограничения (см. man socat
); вместо того, чтобы передавать ему большое тело скрипта, запишите скрипт в файл и запустите файл; Вы также можете исследовать EXEC
;
- наш протокол (быстрый и грязный) не предоставляет серверу никакого способа сообщать об ошибках (если таковые имеются) или об успехе клиенту.
Я проверял это с получателем Debian и отправителем Ubuntu. В один момент три разных соединения передавали три разных файла с двух разных IP-адресов. После завершения всех передач md5sum
использовался для проверки того, были ли копии (скорее всего) такими же, как и оригиналы; они были.