/ dev / tcp Listen zamiast NC Listen

39

Z detektorem netcat takim jak:

nc -l <port> < ~/.bashrc

Mogę pobrać mój .bashrc na nowym komputerze (nie ma nclub LDAP) za pomocą:

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

Moje pytanie brzmi: czy istnieje sposób naśladowania możliwości nc -l <port>w mojej pierwszej linii za pomocą / dev / tcp zamiast nc?

Maszyny, nad którymi pracuję, to wyjątkowo zahartowane środowisko laboratoryjne / piaskownicy RHEL (bez ssh, bez nc, bez LDAP, bez mniam, nie mogę zainstalować nowego oprogramowania i nie mają połączenia z Internetem)

h3rrmiller
źródło
czy nie napisać skryptu w Pythonie, aby utrzymać gniazdo otwarte, czy istnieje prosty sposób na osiągnięcie tego?
h3rrmiller
powiązane stackoverflow.com/questions/4739196/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

23

Jeśli Perl jest zainstalowany (tak jak będzie na maszynie 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

działałoby, chyba że lokalna zapora sieciowa nie zezwala na połączenia przychodzące do 1234.

Jeśli socat jest zainstalowany:

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

Jeśli zsh jest zainstalowany:

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
źródło
Czy ostatnie ztcp -c 4polecenie nie powinno brzmieć 3? W przeciwnym razie świetna informacja, świetna wskazówka.
dezza
@dezza, patrz edycja. Gniazdo na fd 3 nie było tak naprawdę zamknięte (choć byłoby tak, gdy skrypt się kończy). Musimy zamknąć gniazdo na fd 4, aby drugi koniec otrzymał EOF.
Stéphane Chazelas,
42

Niestety, nie można tego zrobić tylko po prostu bash. /dev/tcp/<ip>/<port>Pliki wirtualne są realizowane w sposób, który próbuje bash do łączenia się z określonym <ip>:<port>przy użyciu connect(2)funkcji. Aby utworzyć gniazdo nasłuchiwania, musiałby wywołać bind(2)funkcję.

Możesz to sprawdzić, pobierając bashźródła i przeglądając je. Jest zaimplementowany w lib/sh/netopen.cpliku w _netopen4funkcji (lub _netopen6, który obsługuje również IPv6). Ta funkcja jest używana przez funkcję otoki netopenz tego samego pliku, która z kolei jest bezpośrednio używana w pliku redir.c( redir_special_openfunkcji) do implementacji tego wirtualnego przekierowania.

Musisz znaleźć inną aplikację, która może utworzyć gniazdo nasłuchiwania na twoim komputerze.

Krzysztof Adamski
źródło
+1 bash pozwala utworzyć gniazdo klienta, ale gniazdo serwera, którego możesz użyć nc lub może być zaimplementowane w perl lub c, w rzeczywistości proces serwera zapętla przyjmowanie połączeń i procesy spawnowania lub tworzenie wątków lub może akceptować tylko jedno połączenie przez jedno
Nahuel Fouilleul
2
@NahuelFouilleul: To nie do końca poprawne. Możesz przetwarzać wielu klientów za pomocą tylko jednego wątku / procesu, używając tak zwanego programowania sieciowego „asynchronicznego” lub „sterowanego zdarzeniami” (spróbuj googlingu dla funkcji select () i tego, jak można jej użyć w programowaniu sieciowym). W wielu przypadkach jest to znacznie lepszy (szybszy) sposób przyjmowania dużej liczby klientów.
Krzysztof Adamski
Dzięki, że nie pomyślałem o tym rozwiązaniu
Nahuel Fouilleul
4
Po to jest xinetd. Słucha i odradza twój dowolny proces / skrypt dla wszelkich połączeń przychodzących. Dzięki niemu wszystko może stać się serwerem TCP / IP.
Evi1M4chine
0

Nie ma sposobu na słuchanie, ponieważ słuchanie nie jest zawstydzone, jak zauważył Adamski.

Ale nie musisz nasłuchiwać na kliencie, więc nie potrzebujesz netcata na kliencie do przesyłania plików, na przykład:

## 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
źródło
-3

możesz to zrobić tak jak powiedziałeś, pytając / dev / tcp, używając bash:

</dev/tcp/host/port

jeśli uruchomi się natychmiast, nasłuchuje, tak czy inaczej, przekroczy limit czasu

serpiko
źródło
4
Nie. Zdecydowanie tego nie przetestowałeś, a jeśli tak, nie możesz zrozumieć wyników. Twoja sugestia otworzy gniazdo (nie słucha) i przekieruje na dowolne polecenie, które uruchomiłeś. Prawidłowa odpowiedź została już znaleziona (prawie 6 lat temu ...), więc nie jestem pewien, dlaczego zdecydowałeś się na nekrologię tego pytania.
h3rrmiller