2011-10-14 18 views
26

Encontré esta línea en un script. Si bien entiendo globalmente lo que hace (abrir una conexión TCP bidireccional), necesito algunas explicaciones sobre la sintaxis. Aquí está la línea:Conexión TCP, solo bash

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

Y mis preguntas:

  1. < y > se utilizan generalmente para redirigir OI. ¿Qué significa eso? ¿Es utilizable en otro contexto? ¿Cómo?
  2. ¿Por qué funciona, mientras que /dev/tcp no existe?
  3. ¿Por qué 5? ¿Puede ser otro número? ¿Cuáles son los valores permitidos?
  4. ¿Por qué es necesario exec? (dado que nada es en realidad ejecutado)

Gracias.

Respuesta

17

< y> se utilizan generalmente para redirigir los IO. ¿Qué significa eso? ¿Es utilizable en otro contexto? ¿Cómo?

Es lo mismo - de entrada y salida se desvía a fd 5.

¿Por qué funciona, mientras que no existe/dev/tcp?

Es un archivo especial: Si el host es un nombre de host o de Internet válida, y el puerto es un número de puerto entero o nombre de servicio, golpe del intenta abrir una conexión TCP a la toma correspondiente.

¿Por 5? ¿Puede ser otro número? ¿Cuáles son los valores permitidos?

Sí, puede ser de algún valor, pero debe asegurarse de no utilizar un fd ya en uso.

¿Por qué es necesario ejecutivo? (dado que nada se ejecuta realmente)

exec significa que la redirección ocurre en el shell actual, no dentro de una subcadena.

+6

Hay una advertencia importante en esta respuesta.Bash solo cumplirá con "/ dev/tcp" * si * la compatibilidad está habilitada cuando bash se genera. En particular, Red Hat construye bash con él habilitado, mientras que Debian no (o al menos no lo hicieron la última vez que lo verifiqué, que fue hace años). No esperes que esto funcione en todas las conchas, ni en todo. –

+0

@WilliamPursell ¡De acuerdo! – trojanfoe

3

sólo puedo responder por la parte Exec:

ejecutivo sin una orden dada puede usarse para cambiar las redirecciones de E/S. <> en este caso significa abierto para lectura + escritura. 5 es el número de canal (o el descriptor de archivo). Esto tiene sentido si otros comandos envían su salida/leen su entrada del canal 5.

Para "/ dev/tcp/$ {SERVER}/$ {PORT}" No sé si es una característica de un específico Versión de Linux o si es una función de bash (supongo que el último).

- EDIT: desde la página de manual de bash: -

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. 
+5

Se trata de extensiones que deben habilitarse al compilar bash (--enable-net-redirections). No todas las distribuciones de Linux compilan bash de esa manera. Debian y Ubuntu, por ejemplo, no lo habilitan. –

+0

¡Buen punto! Realmente aprecio las advertencias sobre la compatibilidad. – ktf

Cuestiones relacionadas