Me encontré con un problema donde tengo un servidor ncat con el comando ncat -l [port] -k -c "cat > foo; cat > bar"
. Cuando me conecto a este servidor a través de netcat, me permite escribir en el archivo foo
y después de eso, bar
. El problema es que cuando el cliente que se conecta quiere dejar de escribir foo
enviando un ^D
, cierra el cliente en lugar de continuar escribiendo en bar
, por lo que bar
nunca se escribe en él. ¿Cómo puedo evitar esto? ¿Cuál es una alternativa cat
que me permite salir con un comando en lugar de un EOF
?
Respuesta1
Si lo que desea hacer es transferir 2 archivos con solo 1 conexión, de alguna manera tendrá que usar un marcador para separar los archivos en el flujo de datos, ya que el final del archivo es una lectura de longitud 0 que netcat usará para cerrar. la toma.
Control-D
Puede ser lo que puede escribir en una terminal para indicar el final del archivo, pero no genera un carácter, finaliza la lectura con una longitud de 0. No hay ningún carácter Control-D
en el flujo de datos.
Para transferir 2 archivos simplemente, puede usar un comando de empaquetado existente como tar
. Úselo nc -k -l 4458 -v -c 'tar xf - >&2'
como receptor y tar cf - foo bar
como remitente. (Dado que los nombres de los archivos provienen del remitente, debes confiar en el remitente).
Alternativamente, si sus archivos son de texto simple, puede introducir una línea especial para separar los 2 archivos. Por ejemplo, en el remitente cat foo; echo bye; cat bar
y en el receptor algo así como
nc -k -l 4458 -v -c 'awk -v file=foo '\''/^bye$/{ file="bar";next }{print >file}'\'
Este script GNU awk contiene el primer nombre de archivo en variable file
, luego, cuando ve la línea de "adiós", cambia al segundo nombre de archivo.