Я столкнулся с проблемой, когда у меня есть сервер ncat с командой ncat -l [port] -k -c "cat > foo; cat > bar"
. Когда я подключаюсь к этому серверу через netcat, он позволяет мне записывать в файл foo
, а после этого bar
. Проблема в том, что когда подключающийся клиент хочет остановить запись foo
, отправив ^D
, он закрывает клиент вместо того, чтобы перейти к записи в bar
, поэтому bar
в никогда не записывается. Как мне обойти это? Какая альтернатива cat
позволяет мне выйти с помощью команды вместо EOF
?
решение1
Если вы хотите передать 2 файла с помощью всего одного соединения, вам придется каким-то образом использовать маркер для разделения файлов в потоке данных, поскольку конец файла — это считывание длины 0, которое netcat будет использовать для закрытия сокета.
Control-D
Control-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», он меняет его на второе имя файла.