Separadores de Campos de Entrada - Enciclopedia

Para muchos intérpretes de línea de comandos ("shell") de los sistemas operativos Unix, los separadores de campo de entrada o los separadores internos de campo o la variable de shell $IFS contienen caracteres utilizados para separar texto en tokens.

El valor de IFS, (en el shell bash) típicamente incluye el espacio, la tabulación y los caracteres de nueva línea por defecto. Estos caracteres de espacio en blanco pueden visualizarse mediante la ejecución del comando "declare" en el shell bash o impresionando IFS con comandos como printf %s "$IFS" | od -c, printf "%q\n" "$IFS" o printf %s "$IFS" | cat -A (los dos últimos comandos están disponibles solo en algunos shells y en algunos sistemas).

Desde la página de manual de Bash, versión 4:

El shell trata cada carácter de $IFS como un delimitador y divide los resultados de las otras expansiones en palabras en estos caracteres.

Si IFS no está configurado o su valor es exactamente <espacio><tab><nueva línea>, el valor predeterminado, entonces las secuencias de <espacio>, <tab> y <nueva línea> al principio y al final de los resultados de las expansiones anteriores se ignoran, y cualquier secuencia de caracteres IFS no situada al principio o al final sirve para delimitar palabras.

Si IFS tiene un valor diferente al predeterminado, entonces las secuencias de caracteres de espacio en blanco, espacio y tabulación se ignoran al principio y al final de la palabra, siempre y cuando el carácter de espacio en blanco esté en el valor de IFS (un carácter de espacio en blanco de IFS).

Cualquier carácter en IFS que no sea un carácter de espacio en blanco de IFS, junto con cualquier carácter de espacio en blanco adyacente de IFS, delimita un campo. Una secuencia de caracteres de espacio en blanco de IFS también se trata como un delimitador. Si el valor de IFS es nulo, no se realiza ningún división de palabras.


Abreviatura IFS
De acuerdo con las Especificaciones Básicas del Grupo Open, IFS es una abreviatura de "input field separators" (separadores de campo de entrada). Una versión más nueva de esta especificación menciona que "este nombre es engañoso ya que los caracteres de IFS realmente se utilizan como terminadores de campo". Sin embargo, IFS a menudo se refiere como "internal field separators" (separadores internos de campo).


Exploits
IFS se podía utilizar como un exploit en algunas versiones de Unix. Un programa con permisos de root podía engañarse para ejecutar código proporcionado por el usuario si se ejecutaba (por ejemplo) system("/bin/mail") y se llamaba con $IFS configurado a "/", en cuyo caso ejecutaría el programa "bin" (en el directorio actual y, por lo tanto, accesible por el usuario) con permisos de root. Esto se ha solucionado haciendo que los shells no hereden la variable IFS.


Referencias