Para muchos intérpretes de línea de comandos ("shell") de los sistemas operativos Unix , los separadores de campos de entrada o separadores de campos internos o la variable de shell $IFS contienen caracteres que se utilizan para separar el texto en tokens.
El valor de IFS (en el intérprete de comandos bash) normalmente incluye los caracteres de espacio , tabulación y salto de línea por defecto. Estos caracteres de espacio en blanco se pueden visualizar mediante el comando "declare" en el intérprete de comandos bash o imprimiendo IFS con comandos como o ( estos dos últimos comandos solo están disponibles en algunos intérpretes de comandos y en algunos sistemas).printf %s "$IFS" | od -cprintf "%q\n" "$IFS"printf %s "$IFS" | cat -A
De la página del manual de Bash , versión 4 :
El intérprete de comandos trata cada carácter de $IFS como un delimitador y divide los resultados de las demás expansiones en palabras según estos caracteres. Si IFS no está definido, o su valor es exactamente <espacio> <tabulador> < salto de línea > , el valor predeterminado, entonces las secuencias de <espacio> , <tabulador> y < salto de línea > al principio y al final de los resultados de las expansiones anteriores se ignoran, y cualquier secuencia de caracteres IFS que no esté al principio o al final sirve para delimitar palabras. Si IFS tiene un valor distinto del predeterminado, entonces las secuencias de los caracteres de espacio en blanco espacio y tabulador se ignoran al principio y al final de la palabra, siempre que el carácter de espacio en blanco esté en el valor de IFS (un carácter de espacio en blanco IFS ). Cualquier carácter en IFS que no sea un espacio en blanco IFS , junto con cualquier carácter de espacio en blanco IFS adyacente , delimita un campo. Una secuencia de caracteres de espacio en blanco IFS también se trata como un delimitador. Si el valor de IFS es nulo, no se produce ninguna división de palabras.
Abreviatura de IFS
Según las especificaciones básicas de Open Group, IFS es una abreviatura de "separadores de campos de entrada". [ 1 ] Una versión más reciente de esta especificación menciona que "este nombre es engañoso, ya que los caracteres IFS se utilizan en realidad como terminadores de campo". [ 2 ] Sin embargo, a menudo se hace referencia a IFS como "separadores de campos internos".
Explosiones
IFS se podía usar como exploit en algunas versiones de Unix. Un programa con permisos de root podía ser engañado para ejecutar código proporcionado por el usuario si se ejecutaba (por ejemplo) system("/bin/mail")y se llamaba con $IFS establecido en "/" , en cuyo caso ejecutaría el programa " bin " (en el directorio actual y, por lo tanto, escribible por el usuario) con permisos de root. [ 3 ] Esto se ha solucionado haciendo que los shells no hereden la variable IFS.
Referencias
- Unix
- esbozos de informática