/ dev / tcp ascolta invece di nc ascolta


39

Con un ascoltatore netcat come:

nc -l <port> < ~/.bashrc

Posso prendere il mio .bashrc su una nuova macchina (non ha nco LDAP) con:

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

La mia domanda è: c'è un modo per imitare le capacità di nc -l <port>nella mia prima riga con / dev / tcp anziché nc?

Le macchine su cui sto lavorando sono un ambiente lab / sandbox estremamente rinforzato RHEL (no ssh, no nc, no LDAP, no yum, non riesco a installare un nuovo software e non sono connessi a Internet)


A parte scrivere uno script Python per tenere aperto il socket, c'è un modo semplice per farlo?
h3rrmiller,

Risposte:


23

Se Perl è installato (come sarà su una macchina 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

funzionerebbe, a meno che un firewall locale non consenta connessioni in entrata al 1234.

Se socat è installato:

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

Se è installato 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

L'ultimo ztcp -c 4comando non dovrebbe leggere 3? Altrimenti grandi informazioni, ottimo consiglio.
dezza,

@dezza, vedi modifica. Il socket su fd 3 non veniva effettivamente chiuso (anche se lo sarebbe stato quando lo script termina). Dobbiamo chiudere il socket su fd 4 in modo che l'altra estremità ottenga un EOF.
Stéphane Chazelas,

42

Purtroppo è impossibile avere a che fare solo con bash. /dev/tcp/<ip>/<port>i file virtuali sono implementati nel modo in cui bash tenta di connettersi alla funzione <ip>:<port>usando specificata connect(2). Per creare un socket di ascolto, dovrebbe chiamare la bind(2)funzione.

Puoi verificarlo scaricando le bashfonti e guardandolo. È implementato in lib/sh/netopen.cfile in _netopen4funzione (o _netopen6, che supporta anche IPv6). Questa funzione viene utilizzata dalla funzione wrapper netopendallo stesso file, che a sua volta viene utilizzata direttamente nel file redir.c( redir_special_openfunzione) per implementare questo reindirizzamento virtuale.

Devi trovare qualche altra applicazione in grado di creare una presa di ascolto sul tuo computer.


+1 il bash permette di creare il socket del client ma il socket del server è possibile utilizzare nc o può essere implementato con perl o c, infatti il ​​processo del server accetterà in loop le connessioni e genererà i processi o la creazione di thread o può accettare solo una connessione per una
Nahuel Fouilleul,

2
@NahuelFouilleul: non è del tutto corretto. Puoi elaborare molti client con un solo thread / processo usando la cosiddetta programmazione di rete "asincrona" o "event driven" (prova a cercare su google la funzione select () e come può essere utilizzata nella programmazione di rete). In molti casi è un modo molto migliore (più veloce) di accettare molti clienti.
Krzysztof Adamski,

Grazie non avevo pensato a questa soluzione
Nahuel Fouilleul,

4
Ecco a cosa serve xinetd. Fa l'ascolto e genera il tuo processo / script arbitrario per qualsiasi connessione in arrivo. Con esso, qualsiasi cosa può diventare un server TCP / IP.
Evi1M4chine,

0

Non c'è modo di ascoltare perché l'ascolto non è in crisi come ha sottolineato Adamski.

Ma non è necessario ascoltare sul client, quindi non è necessario netcat sul client per trasferire file, ad esempio:

## 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

-3

puoi farlo come hai detto, chiedendo / dev / tcp, con bash:

</dev/tcp/host/port

se viene eseguito immediatamente, è in ascolto, in entrambi i casi scade


4
No. Non l'hai assolutamente provato e se lo facessi non devi capire i risultati. Il tuo suggerimento aprirà il socket (non ascolterà) e reindirizzerà in qualunque comando tu abbia eseguito. È già stata trovata una risposta corretta (quasi 6 anni fa ...), quindi non sono sicuro del motivo per cui hai scelto di annullare questa domanda.
h3rrmiller
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.