Podczas próby połączenia /dev/tcp/www.google.com/80
, wpisując
/dev/tcp/www.google.com/80
Mówi Bash no such file or directory
. Podczas przeglądania kodu innych osób w Internecie używają składni, takiej jak
3<>/dev/tcp/www.google.com/80
Zauważyłem, że to również działa:
</dev/tcp/www.google.com/80
Dlaczego te symbole są wymagane do wywoływania pewnych rzeczy w bash?
linux
bash
io-redirection
devices
nieznany z nazwiska
źródło
źródło
Odpowiedzi:
Ponieważ jest to cecha powłoki (ksh, skopiowanej przez bash) i tylko powłoki.
/dev/tcp/...
nie są plikami rzeczywistymi, powłoka przechwytuje próby przekierowania do/dev/tcp/...
pliku, a następnie wykonujesocket(...);connect(...)
(nawiązuje połączenie TCP) zamiastopen("/dev/tcp/..."...)
(otwiera ten plik) w takim przypadku.Zauważ, że musi być tak napisane.
cat < /dev/./tcp/...
lub///dev/tcp/...
nie będzie działać, a zamiast tego spróbuje otworzyć te pliki (które w większości systemów nie istnieją i wystąpi błąd).Kierunek przekierowania również nie ma znaczenia. Czy używasz
3< /dev/tcp/...
lub3> /dev/tcp/...
lub3<> /dev/tcp/...
lub nawet3>> /dev/tcp/...
nie będzie żadnej różnicy, będziesz mógł czytać i pisać do / z tego deskryptora pliku do odbierania / wysyłania danych przez tego gniazda TCP.Kiedy to zrobisz
cat /dev/tcp/...
, to nie działa, ponieważcat
nie implementuje tej samej specjalnej obsługi, działaopen("/dev/tcp/...")
podobnie dla każdego pliku (oprócz-
), działa tylko powłoka (ksh, tylko bash) i tylko dla celu przekierowań.To
cat -
kolejny przykład specjalnie obsługiwanej ścieżki do pliku. Zamiast robić aopen("-")
, odczytuje bezpośrednio z deskryptora pliku 0 (stdin).cat
i wiele narzędzi tekstowych to robi, powłoka nie obsługuje przekierowań. Aby odczytać zawartość-
pliku, potrzebujeszcat ./-
lubcat < -
(lubcat - < -
). W systemach, które nie mają/dev/stdin
,bash
zrobi jednak coś podobnego dla przekierowań z tego (wirtualnego) pliku. GNUawk
robi to samo/dev/stdin
,/dev/stdout
,/dev/stderr
nawet na systemach, które mają takie pliki, które mogą powodować pewne niespodzianki na systemach takich jak Linux, gdzie te pliki zachowują się inaczej.zsh
ma także obsługę gniazd TCP (i strumienia domeny Unix), ale odbywa się to za pomocą wbudowanychztcp
(izsocket
), więc jest mniej ograniczone niż podejście ksh / bash. W szczególności może również działać jako serwer, którego ksh / bash nie może zrobić. Jednak wciąż jest znacznie bardziej ograniczony niż to, co można zrobić w prawdziwym języku programowania.źródło
Wygląda na to, że mylisz pomysły lub czytasz plik i wykonujesz polecenie. Różnica między danymi a instrukcją.
Strona główna Googles nie jest programem wykonywalnym. A gdyby tak było, uruchomienie go nie byłoby bezpieczne.
Znaki przekierowania (w tym
<
i>
) służą do kierowania danych do polecenia.Możemy to zrobić.
cat < /dev/tcp/towel.blinkenlights.nl/23
Jednak to nie zadziała,/dev/tcp/www.google.com/80
ponieważ ten port nie będzie odpowiadał, dopóki nie wyślemyGET / HTTP/1.0\r\n\r\n
Więc spróbuj
źródło