Connexion TCP, bash seulement

J'ai trouvé cette ligne dans un script. Bien que je comprenne globalement ce qu'il fait-ouvrir une connexion TCP bidirectionnelle -, j'ai besoin d'explications sur la syntaxe. Voici la ligne:

exec 5<>"/dev/tcp/${SERVER}/${PORT}"

Et mes questions:

  1. < et > sont généralement utilisés pour rediriger IOs. Ce qui signifie-t-il là-bas? Est-il utilisable dans un autre contexte? Comment?
  2. Pourquoi ça marche, alors que /dev/tcp n'existe pas?
  3. Pourquoi 5? Peut-il être un autre numéro? Quelles sont les valeurs autorisées?
  4. pourquoi est-ce que exec est nécessaire? (étant donné que rien n'est fait exécuté)

Merci.

27
demandé sur gregseth 2011-10-14 12:31:57

2 réponses

Sont généralement utilisés pour rediriger IOs. Ce qui signifie-t-il là-bas? Est-il utilisable dans un autre contexte? Comment?

C'est la même chose - l'entrée et la sortie sont redirigées vers fd 5.

Pourquoi cela fonctionne-t-il, alors que /dev / tcp n'existe pas?

C'est un fichier spécial: si host est un nom d'hôte ou une adresse internet valide, et port est un numéro de port entier ou un nom de service, bash tente d'ouvrir une connexion TCP au socket correspondant.

Pourquoi 5? Peut-il être un autre numéro? Quelles sont les valeurs autorisées?

Oui, cela peut être n'importe quelle valeur, mais vous devez vous assurer de ne pas utiliser un fd déjà utilisé.

Pourquoi exec est-il nécessaire? (étant donné que rien n'est réellement exécuté)

Exec signifie que la redirection se produit dans le shell actuel, pas dans un sous-shell.

17
répondu trojanfoe 2012-11-05 12:08:47

Je ne peux répondre que pour la partie exec:

Exec sans une commande donnée peut être utilisé pour modifier les redirections d'E/S. dans ce cas signifie ouvert pour lecture + écriture. 5 est le numéro de canal (ou descripteur de fichier). Cela a du sens si d'autres commandes envoient leur sortie / lisent leur entrée depuis le canal 5.

Pour "/ dev / tcp / ${SERVER} / ${PORT} " Je ne sais pas si c'est une fonctionnalité d'une version Linux spécifique ou si c'est une fonctionnalité bash (je suppose que ce dernier).

-- EDIT: à partir du manuel bash page: --

 Bash handles several filenames specially when they are  used
 in redirections, as described in the following table:

      /dev/fd/fd
           If fd is a valid integer, file  descriptor  fd  is
           duplicated.
      /dev/stdin
           File descriptor 0 is duplicated.
      /dev/stdout
           File descriptor 1 is duplicated.
      /dev/stderr
           File descriptor 2 is duplicated.
      /dev/tcp/host/port
           If host is a valid hostname or  Internet  address,
           and  port  is  an  integer  port number or service
           name, bash attempts to open a  TCP  connection  to
           the corresponding socket.
      /dev/udp/host/port
           If host is a valid hostname or  Internet  address,
           and  port  is  an  integer  port number or service
           name, bash attempts to open a  UDP  connection  to
           the corresponding socket.
3
répondu ktf 2011-10-14 08:55:56