Envío de archivos a través de netcat

23

Estoy usando algo como esto para enviar archivos de una computadora a otra:

Para servir el archivo (en la computadora A):

cat something.zip | nc -l -p 1234

Para recibir el archivo (en la computadora B):

netcat server.ip.here. 1234 > something.zip

Mi pregunta es ... ¿puedo hacer lo contrario? Digamos que tengo un archivo en la computadora B y quiero enviarlo a A, pero no de la manera que escribí arriba, pero al hacer que la computadora que se supone que recibe el archivo (A) sea un servidor 'escucha' y conecte la computadora que está 'enviando' el archivo ( B) al servidor y enviar el archivo? ¿Es posible? Creo que podría ser, pero no estoy seguro de cómo hacerlo.

En caso de que mi explicación anterior esté en mal estado: ¿cómo envío el archivo al 'servidor' en lugar de servir el archivo en el servidor y luego sacarlo de él (como lo hice anteriormente)?

Phil
fuente
Nota: Si está utilizando ncporque scpes demasiado lento y no es necesario el cifrado, es posible que desee cambiar a udpcast: superuser.com/questions/692294/...
unhammer

Respuestas:

38

En su servidor (A):

nc -l -p 1234 -q 1> something.zip </ dev / null
En su "cliente remitente" (B):
gato algo.zip | netcat server.ip.here 1234

martinwguy
fuente
Sí, pensé que tendría que cambiar de lado de alguna manera, pero no estaba seguro de cómo :). Gracias, funciona!
Phil
Ese es un lindo truco de netcat.
DaveParillo
2
¿Por qué la < /dev/nullparte?
törzsmókus
77
Debido a que netcat lee stdin y escribe stdout simultáneamente, envía todo lo leído desde stdin a la red e imprime todo lo recibido de la red en stdout. El </ dev / null asegura que, cuando el archivo recibido se ha completado, netcat no se queda allí indefinidamente esperando la entrada de la consola (¡lo cual no debería estar leyendo de todos modos!) Y también asegura que no se engulle cualquier entrada que pueda estar disponible desde el terminal, como escribir el siguiente comando que desea ejecutar.
martinwguy
44
si es así pv, sugeriría operar el "cliente del servidor" pv soemthing.zip | ..., ya que eso mostrará el progreso de la lectura del archivo que entra en la tubería.
ThorSummoner
6

Como nota, si desea conservar también los permisos de archivo, la propiedad y las marcas de tiempo, utilizamos tar con netcat para realizar transferencias de directorios y archivos.

En el sistema receptor:

nc -l -p 12345 -q 1 | tar xz -C /path/to/root/of/tree

Desde el sistema de envío:

tar czf - ./directory_tree_to_xfer | nc <host name or IP address of receiving system> 12345 

Espero que ayude.

B.Kaatz
fuente
1
Buena adición a la respuesta, pero déjelo como un comentario y no como una respuesta por separado.
2015
2
No se pudo agregar un comentario arriba debido a la falta de puntos de Representación en este sub-tablero, así que tuve que ofrecerlo como respuesta, aunque aparentemente, se le permite comentar sus propias respuestas.
B.Kaatz
3

Computadora A: nc -l -p 1234 > filename.txt

Computadora B: nc server.com 1234 < filename.txt

También debería funcionar;)

marca
fuente
0

Inicie otra instancia de netcat en la computadora B. Simplemente haga lo que hizo en la computadora A, pero sírvala desde B. Dele al nuevo servidor un nuevo puerto.

DaveParillo
fuente
No quiero hacer lo mismo, quiero cambiar los comandos a otra cosa (no estoy seguro de si es posible) ... mira el texto en negrita en mi pregunta. Lo que quiero decir es que yo no quiero servir de B. Quiero A sea de escucha del servidor de entrada ... y luego quiero enviar el contenido del archivo de no escuchar a escuchar B A.
Phil
Así no es como funciona netcat.
DaveParillo
1
Como puede ver en la respuesta aceptada, sí, así es como netcat también puede funcionar.
Phil
Tienes razón. ¡Aprendo algo nuevo cada día!
DaveParillo