Как можно выполнить EOF `cat` через `netcat`, не закрывая соединение?

Как можно выполнить EOF `cat` через `netcat`, не закрывая соединение?

Я столкнулся с проблемой, когда у меня есть сервер ncat с командой ncat -l [port] -k -c "cat > foo; cat > bar". Когда я подключаюсь к этому серверу через netcat, он позволяет мне записывать в файл foo, а после этого bar. Проблема в том, что когда подключающийся клиент хочет остановить запись foo, отправив ^D, он закрывает клиент вместо того, чтобы перейти к записи в bar, поэтому barв никогда не записывается. Как мне обойти это? Какая альтернатива catпозволяет мне выйти с помощью команды вместо EOF?

решение1

Если вы хотите передать 2 файла с помощью всего одного соединения, вам придется каким-то образом использовать маркер для разделения файлов в потоке данных, поскольку конец файла — это считывание длины 0, которое netcat будет использовать для закрытия сокета.

Control-DControl-Dможет быть тем, что вы можете ввести в терминале для обозначения конца файла, но это не генерирует символ, а завершает чтение с длиной 0. В потоке данных нет .

Чтобы просто передать 2 файла, вы можете использовать существующую команду упаковки, например tar. Используйте nc -k -l 4458 -v -c 'tar xf - >&2'в качестве получателя и tar cf - foo barотправителя. (Поскольку имена файлов исходят от отправителя, вы должны доверять отправителю).

В качестве альтернативы, если ваши файлы представляют собой простой текст, вы можете ввести специальную строку для разделения двух файлов. Например, у отправителя cat foo; echo bye; cat barи у получателя что-то вроде

nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'

Этот скрипт GNU awk хранит первое имя файла в переменной file, а когда он видит строку «bye», он меняет его на второе имя файла.

Связанный контент