/ dev / tcp escuchar en lugar de nc escuchar

39

Con un oyente netcat como:

nc -l <port> < ~/.bashrc

Puedo tomar mi .bashrc en una nueva máquina (no tiene nco LDAP) con:

cat < /dev/tcp/<ip>/<port> > ~/.bashrc

Mi pregunta es: ¿hay alguna manera de imitar las capacidades de nc -l <port>mi primera línea con / dev / tcp en lugar de nc?

Las máquinas en las que estoy trabajando son un entorno de laboratorio / caja de arena extremadamente resistente RHEL (sin ssh, sin nc, sin LDAP, sin mmm, no puedo instalar un nuevo software y no están conectados a Internet)

h3rrmiller
fuente
antes de escribir un script de Python para mantener el socket abierto, ¿hay alguna manera fácil de lograr esto?
h3rrmiller
stackoverflow
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

23

Si Perl está instalado (como lo estará en una máquina RHEL):

perl -MIO::Socket::INET -ne 'BEGIN{$l=IO::Socket::INET->new(
  LocalPort=>1234,Proto=>"tcp",Listen=>5,ReuseAddr=>1);
  $l=$l->accept}print $l $_' < ~/.bashrc

funcionaría, a menos que un firewall local no permita conexiones entrantes a 1234.

Si se instala socat:

socat -u - tcp-listen:1234,reuseaddr < ~/.bashrc

Si está instalado zsh:

zmodload zsh/net/tcp
ztcp -ld3 1234 && # start listening socket on fd 3
  ztcp -ad4 3 && # accept connection on fd 4
  ztcp -c 3 && # close the listening socket that is no longer needed
  cat < ~/.bashrc >&4 && # send the data
  ztcp -c 4 # close the communication socket to tell the other end we're finished
Stéphane Chazelas
fuente
¿No debería el último ztcp -c 4comando leer 3? De lo contrario, excelente información, excelente consejo.
dezza
@dezza, ver edición. El zócalo en fd 3 no se estaba cerrando (aunque lo habría sido cuando el script termina). Necesitamos cerrar el socket en fd 4 para que el otro extremo obtenga un EOF.
Stéphane Chazelas
42

Desafortunadamente, es imposible hacerlo con solo bash. /dev/tcp/<ip>/<port>los archivos virtuales se implementan de la forma en que bash intenta conectarse a la función de <ip>:<port>uso especificada connect(2). Para crear un socket de escucha, tendría que llamar a la bind(2)función.

Puede verificar esto descargando bashfuentes y mirándolo. Se implementa en el lib/sh/netopen.carchivo en _netopen4función (o _netopen6, que también es compatible con IPv6). Esta función es utilizada por la función contenedora netopendel mismo archivo, que a su vez se usa directamente en el archivo redir.c( redir_special_openfunción) para implementar esta redirección virtual.

Debe encontrar alguna otra aplicación que pueda crear un socket de escucha en su máquina.

Krzysztof Adamski
fuente
+1 el bash permite crear el socket del cliente, pero el socket del servidor puede usar nc o puede implementarse con perl o c, de hecho, el proceso del servidor realizará un bucle para aceptar conexiones y generar procesos o crear hilos o puede aceptar solo una conexión por una
Nahuel Fouilleul
2
@NahuelFouilleul: Eso no es del todo correcto. Puede procesar muchos clientes con un solo subproceso / proceso utilizando la denominada programación de red "asincrónica" o "controlada por eventos" (intente buscar en Google la función select () y cómo se puede usar en la programación de red). En muchos casos es una forma mucho mejor (más rápida) de aceptar muchos clientes.
Krzysztof Adamski
Gracias, no pensé en esta solución
Nahuel Fouilleul
44
Para eso es xinetd. Escucha y genera su proceso / script arbitrario para cualquier conexión entrante. Con él, cualquier cosa puede convertirse en un servidor TCP / IP.
Evi1M4chine el
0

No hay una manera de escuchar porque escuchar no es una fiesta como Adamski señaló.

Pero no necesita escuchar en el cliente, por lo que no necesita netcat en el cliente para transferir archivos, por ejemplo:

## To send a file to the locked down computer: 
 ## Local server where you do have netcat 
cat ~/.bashrc | nc -l -q 1 -p 8998

 ## Remote locked down computer without netcat
cat < /dev/tcp/local.server.ip.addr/8998 > latest.bashrc 

## To grab a file from the locked down computer: 
 ## First - on the local server run 
nc -l -p 8998 -q 1 > remote.bashrc < /dev/null 

 ## Then on the locked down computer run: 
cat ~/.bashrc > /dev/tcp/local.server.ip.addr/8998 0<&1 2>&1
A.Danischewski
fuente
-3

puedes hacer eso como dijiste, preguntando / dev / tcp, con bash:

</dev/tcp/host/port

si se ejecuta de inmediato, está escuchando, de cualquier manera se agota el tiempo de espera

serpiko
fuente
44
No. Definitivamente no probaste esto y si lo hiciste no debes entender los resultados. Su sugerencia abriría el socket (no escucha) y redirigiría a cualquier comando que ejecute. Ya se ha encontrado una respuesta correcta (hace casi 6 años ...), así que no estoy seguro de por qué elegiste rechazar esta pregunta.
h3rrmiller