/ 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)


czy nie napisać skryptu w Pythonie, aby utrzymać gniazdo otwarte, czy istnieje prosty sposób na osiągnięcie tego?
— h3rrmiller

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

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.


+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

-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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.