Quale sistema simile a Unix fornisce davvero il file speciale / dev / tcp?


9

So che /dev/tcp/<host>/<port>è un percorso magico gestito in modo specifico da alcuni gusci nei reindirizzamenti. Ma secondo man bash:

Se il sistema operativo su cui è in esecuzione bash fornisce questi file speciali, bash li utilizzerà; altrimenti li emulerà internamente [...]

Sulla scatola di Linux che sto usando in questo momento, il /dev/tcpfile speciale non è presente, quindi Bash lo emulerà . Ma esiste davvero un sistema simile a Unix che fornisce al /dev/tcpfile speciale lo stesso semantico di quello supportato da Bash?


Richiederebbe una directory emulata. Creare directory emulate è possibile solo con filesystem specifici, ad esempio procfs o sysfs possono farlo. /devè un tmpfs su Linux attuali, ed era sulla partizione di root in quelli più vecchi. Ecco perché al momento è impossibile. Potrebbe essere reso possibile facilmente con un'estensione sysfs o procfs (entrambi i fs sono molto flessibili e simili (in realtà probabilmente nessuno sa perché non sono gli stessi)), nessuno lo fa oggi, ma potrebbe essere realizzato in circa 100 righe di codice.
Peter - Ripristina Monica il

Ma c'è qualche altro sistema operativo che lo fa già? Ad un certo punto, ho pensato che il piano 9 lo avesse fatto, ma mi sbagliavo.
Sylvain Leroux,

1
Non lo so, probabilmente no (per quanto ne so, è un'invenzione bash). Ho votato a favore della tua domanda, perché la risposta è interessante anche per me. Per quanto ne so, nessun popolare sistema operativo unix x86 può farlo.
Peter - Ripristina Monica il

Risposte:


8

Penso che la documentazione di Bash sia in qualche modo fuorviante su questo argomento. Guardando il codice, anche tornando alla versione 2.04 in cui sono stati introdotti i reindirizzamenti di rete, /dev/tcpe /dev/udpfunziona come segue:

  • al momento della compilazione, lo configurescript verifica se sono supportate varie funzionalità di rete; in tal caso, se i reindirizzamenti di rete sono abilitati (come nel caso predefinito), viene incorporato il codice di rete interno;
  • in fase di esecuzione, se il codice di rete interno è incorporato /dev/tcpe /dev/udp(nel formato corretto) viene gestito internamente; in caso contrario, viene generato un avviso (“/ dev / (tcp | udp) / host / port non supportato senza rete”) e Bash tenta di aprire il percorso specificato sul sistema;
  • se i reindirizzamenti di rete sono configurati, non viene fatto nulla di speciale.

Ciò si riduce a:

  • se il reindirizzamento di rete è abilitato:
    • se la rete è supportata sulla piattaforma di destinazione /dev/tcpe /dev/udpsarà sempre gestita internamente;
    • in caso contrario, Bash avviserà e tenterà di aprire il file "alla cieca"; se il sistema in qualche modo supporta /dev/(tcp|udp)/host/port, verrà utilizzato, altrimenti con ogni probabilità il reindirizzamento fallirà;
  • se il reindirizzamento della rete è disabilitato, non viene eseguita alcuna gestione speciale; come sopra, se il sistema in qualche modo supporta /dev/(tcp|udp)/host/port, verrà utilizzato, altrimenti con ogni probabilità il reindirizzamento fallirà.

/dev/tcpesiste su alcuni sistemi, ma per quanto ne so nessuno supporta la stessa astrazione di Bash. Su Solaris, /dev/tcpviene utilizzato con lo nddstrumento per eseguire query e modificare la configurazione di rete. In XTI (vedi anche Open Group se sei un membro), la t_openfunzione può essere usata con /dev/tcpper aprire una connessione TCP, ma non usa un'impostazione basata sul percorso, c'è una struttura di dati separata per specificare l'host di destinazione e porta (e altri parametri).


La funzione stessa viene da ksh93. / dev / tcp su sistemi SysV sarebbe un handle sul modulo tcp STREAMS .
Stéphane Chazelas,
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.