La variable de entorno PATH
La variable de entorno PATH indica el conjunto de directorios al que buscar un cierto binario. Vamos a ver como funciona.
Podemos ver el contenido de la variable PATH con el comando echo:
# echo $PATH /sbin:/bin:/usr/sbin:/usr/bin
Evidentemente dependiendo del sistema suele variar.
Podemos apreciar como se trata de un listado separado por dos puntos (:) la cual la shell recorre secuencialmente hasta encontrar el binario que indicamos o darnos el error de “command not found“:
$ dsa -bash: dsa: command not found
En el caso que queramos indicar que busque también en el directorio actual podemos añadir al PATH una entrada nula (dos veces dos puntos);
export PATH="/sbin:/bin:/usr/sbin:/usr/bin::"
Esto hará que sea cual sea el directorio actual buscará allí también el binario. Podemos apreciarlo en el siguiente ejemplo. Suponiendo el fichero de ejemplo siguiente:
#!/bin/bash id
Lo creamos en nuestra home, le damos permisos y probamos de ejecutarlo, veremos que no podemos:
# ejemplo -bash: ejemplo: command not found
Añadimos el directorio actual en el PATH mediante un export:
# export PATH=$PATH::
Veremos que a continuación ya podemos ejecutarlo correctamente:
# ejemplo uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
La opción de añadir en el PATH el directorio actual existe, pero es muy poco recomendable ya que se puede usar para engañar al sistema para que ejecute lo que no debe. Un ejemplo lo podemos ver en el nivel 4 del wargame IO de smash the stack.
A continuación veremos con strace como se comprueba la lista del PATH hasta encontrar el binario:
# PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" strace -fF -e stat64 ~/ejemplo
stat64("/root", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
stat64(".", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
stat64(".", {st_mode=S_IFDIR|0550, st_size=4096, ...}) = 0
stat64("/usr/local/sbin/id", 0xbfe6de30) = -1 ENOENT (No such file or directory)
stat64("/usr/local/bin/id", 0xbfe6de30) = -1 ENOENT (No such file or directory)
stat64("/sbin/id", 0xbfe6de30) = -1 ENOENT (No such file or directory)
stat64("/bin/id", 0xbfe6de30) = -1 ENOENT (No such file or directory)
stat64("/usr/sbin/id", 0xbfe6de30) = -1 ENOENT (No such file or directory)
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
stat64("/usr/bin/id", {st_mode=S_IFREG|0755, st_size=30032, ...}) = 0
Process 29254 attached
Process 29253 suspended
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
Process 29253 resumed
Process 29254 detached
--- SIGCHLD (Child exited) @ 0 (0) ---
Relacionados
Imprimir
Deja un comentario: