GNU/Linux >> Znalost Linux >  >> Linux

Proč jsou < nebo > vyžadovány pro použití /dev/tcp

Protože to je vlastnost shellu (ksh, zkopírovaného bashem) a pouze shellu.

/dev/tcp/... nejsou skutečné soubory, shell zachytí pokusy o přesměrování na /dev/tcp/... soubor a poté provede socket(...);connect(...) (vytváří TCP spojení) místo open("/dev/tcp/..."...) (otevření tohoto souboru) v takovém případě.

Všimněte si, že to tak musí být napsáno. cat < /dev/./tcp/... nebo ///dev/tcp/... nebude fungovat a místo toho se pokusí otevřít tyto soubory (které na většině systémů neexistují a zobrazí se chyba).

Na směru přesměrování také nezáleží. Ať už používáte 3< /dev/tcp/... nebo 3> /dev/tcp/... nebo 3<> /dev/tcp/... nebo dokonce 3>> /dev/tcp/... nebude žádný rozdíl, budete moci číst i zapisovat z/do tohoto deskriptoru souboru a přijímat/odesílat data přes daný TCP soket.

Když uděláte cat /dev/tcp/... , to nefunguje, protože cat neimplementuje stejné speciální zpracování, ale open("/dev/tcp/...") jako u každého souboru (kromě - ), pouze shell (pouze ksh, bash) a pouze pro cíl přesměrování.

To cat - je dalším příkladem speciálně zpracované cesty k souboru. Místo provedení open("-") , čte přímo z deskriptoru souboru 0 (stdin). cat a mnoho textových utilit to dělá, shell ne pro svá přesměrování. Čtení obsahu - potřebujete cat ./- nebo cat < - (nebo cat - < - ). Na systémech, které nemají /dev/stdin , bash nicméně udělá něco podobného pro přesměrování z tohoto (virtuálního) souboru. GNU awk dělá totéž pro /dev/stdin , /dev/stdout , /dev/stderr dokonce i na systémech, které takové soubory mají, což může způsobit určitá překvapení na systémech, jako je Linux, kde se tyto soubory chovají odlišně.

zsh má také podporu soketu TCP (a Unix domain stream), ale to se provádí pomocí ztcp (a zsocket ) vestavěné, takže je to méně omezené než přístup ksh/bash. Zejména může také fungovat jako server, který ksh/bash neumí. Je to však stále mnohem omezenější než to, co můžete dělat ve skutečném programovacím jazyce.


Zdá se, že si pletete nápady nebo čtete soubor a provádíte příkaz. Rozdíl mezi daty a instrukcemi.

Titulní stránka Google není spustitelný program. A pokud ano, nebylo by bezpečné jej spustit.

Znaky pro přesměrování (včetně < a > ), se používají k nasměrování dat do příkazu.

Mohli bychom udělat cat < /dev/tcp/towel.blinkenlights.nl/23 Toto však nebude fungovat pro /dev/tcp/www.google.com/80 protože tento port nebude reagovat, dokud nepošleme GET / HTTP/1.0\r\n\r\n

Tak zkuste

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80

Linux
  1. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  2. Co jsou soubory /dev/zero a /dev/null v Linuxu

  3. jádro:deaktivace /dev/kmem a /dev/mem

  1. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  2. Je špatné propojit /dev/random s /dev/urandom v Linuxu?

  3. Proč se na některých systémech Linux kořenový souborový systém zobrazuje jako /dev/root místo /dev/<uzel skutečného zařízení>v mtab?

  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Kdy použít /dev/random vs /dev/urandom?