Encontrei um problema em que tenho um servidor ncat com o comando ncat -l [port] -k -c "cat > foo; cat > bar"
. Quando me conecto a este servidor através do netcat, ele me permite gravar no arquivo foo
e, depois disso, bar
. O problema é que quando o cliente que está se conectando deseja parar de escrever foo
enviando um ^D
, ele fecha o cliente em vez de passar a escrever para bar
, portanto bar
nunca é gravado. Como posso contornar isso? Qual é a alternativa cat
que me permite sair com um comando em vez de um EOF
?
Responder1
Se o que você deseja fazer é transferir 2 arquivos com apenas 1 conexão, você terá que usar de alguma forma um marcador para separar os arquivos no fluxo de dados, pois o fim do arquivo é uma leitura de comprimento 0 que o netcat usará para fechar a tomada.
Control-D
pode ser o que você pode digitar em um terminal para indicar o fim do arquivo, mas não gera um caractere, termina a leitura com comprimento 0. Não há nenhum Control-D
no fluxo de dados.
Para transferir 2 arquivos de forma simples, você pode usar um comando de empacotamento existente como tar
. Use nc -k -l 4458 -v -c 'tar xf - >&2'
como seu receptor e tar cf - foo bar
como seu remetente. (Como os nomes dos arquivos vêm do remetente, você deve confiar no remetente).
Alternativamente, se seus arquivos forem de texto simples, você poderá introduzir uma linha especial para separar os 2 arquivos. Por exemplo, no remetente cat foo; echo bye; cat bar
e no destinatário, algo como
nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'
Este script GNU awk contém o primeiro nome de arquivo na variável file
e, quando vê a linha "tchau", ele muda para o segundo nome de arquivo.