Quel système de type Unix fournit vraiment le fichier spécial / dev / tcp?

9

Je sais que /dev/tcp/<host>/<port>c'est un chemin magique géré spécifiquement par certains obus dans les redirections. Mais selon man bash:

Si le système d'exploitation sur lequel bash s'exécute fournit ces fichiers spéciaux, bash les utilisera; sinon il les imitera en interne [...]

Sur la boîte Linux que j'utilise en ce moment, le /dev/tcpfichier spécial n'est pas présent, donc le Bash va l' émuler . Mais, existe-t-il en fait un système de type Unix qui fournit au /dev/tcpfichier spécial la même sémantique que celui pris en charge par Bash?

Sylvain Leroux
la source
Il faudrait un répertoire émulé. La création de répertoires émulés n'est possible qu'avec des systèmes de fichiers spécifiques, par exemple procfs ou sysfs peuvent le faire. /devest un tmpfs sur les linux actuels, et il était sur la partition racine dans les plus anciens. C'est pourquoi c'est impossible actuellement. Cela pourrait être rendu possible facilement avec une extension sysfs ou procfs (les deux f sont très flexibles et similaires (en fait, personne ne sait pourquoi ils ne sont pas les mêmes)), personne ne le fait aujourd'hui, mais cela pourrait être fait dans environ 100 lignes de code.
peterh
Mais existe-t-il un autre système d'exploitation qui le fait déjà? À un moment donné, je pensais que le Plan 9 l'avait fait, mais j'avais tort.
Sylvain Leroux
1
Je ne sais pas, probablement pas (pour autant que je sache, c'est une invention bash). J'ai voté pour votre question, car la réponse m'intéresse aussi. Pour autant que je sache, aucun système d'exploitation Unix compatible x86 ne peut le faire.
peterh

Réponses:

8

Je pense que la documentation de Bash est quelque peu trompeuse sur ce sujet. En regardant le code, même en revenant à la version 2.04 où les redirections réseau ont été introduites, /dev/tcpet /dev/udpfonctionne comme suit:

  • au moment de la construction, le configurescript vérifie si diverses fonctionnalités de mise en réseau sont prises en charge; si c'est le cas, si les redirections réseau sont activées (ce qui est le cas par défaut), le code de réseau interne est intégré;
  • au moment de l'exécution, si le code de réseau interne est intégré /dev/tcpet /dev/udp(au bon format) est géré en interne; sinon, un avertissement est généré («/ dev / (tcp | udp) / host / port non pris en charge sans réseau») et Bash tente d'ouvrir le chemin donné sur le système;
  • si les redirections réseau sont configurées, rien de spécial n'est fait.

Cela se résume à:

  • si la redirection réseau est activée:
    • si la mise en réseau est prise en charge sur la plate-forme cible /dev/tcpet /dev/udpsera toujours gérée en interne;
    • sinon, Bash avertira et tentera d'ouvrir le fichier «à l'aveugle»; si le système prend en charge d'une manière ou d'une autre /dev/(tcp|udp)/host/port, cela sera utilisé, sinon, selon toute probabilité, la redirection échouera;
  • si la redirection du réseau est désactivée, aucune manipulation spéciale n'est effectuée; comme ci-dessus, si le système prend en charge d'une manière ou d'une autre /dev/(tcp|udp)/host/port, cela sera utilisé, sinon, selon toute probabilité, la redirection échouera.

/dev/tcpexiste sur certains systèmes, mais pour autant que je sache, aucun ne prend en charge la même abstraction que Bash. Sous Solaris, /dev/tcpest utilisé avec l' nddoutil pour interroger et modifier la configuration du réseau. Dans XTI (voir aussi Open Group si vous êtes membre), la t_openfonction peut être utilisée avec /dev/tcppour ouvrir une connexion TCP, mais elle n'utilise pas de configuration basée sur le chemin, il existe une structure de données distincte pour spécifier l'hôte cible et port (et autres paramètres).

Stephen Kitt
la source
La fonctionnalité elle-même provient de ksh93. / dev / tcp sur les systèmes SysV serait une poignée sur le module tcp STREAMS .
Stéphane Chazelas du