Por que es . no en la ruta por defecto?

62

En sistemas similares a UNIX a lo largo de los años (lo más relevante para mí, Linux), he notado que .(directorio actual) nunca está en el estado $PATHpredeterminado. ¿Por qué es esto?

Recuerdo haber leído hace años que era un problema de seguridad, pero el artículo que leí no explicaba exactamente cuál era el problema. ¿Es porque alguien podría dejar una versión maliciosa lso cpen un directorio, y terminaría ejecutándola sin darme cuenta de que estaba allí?

lado de tierra
fuente
66
No es tanto para la protección interactiva del usuario como para otros programas (y scripts) que ejecutan otros programas. Incluso a algunos usuarios inteligentes les gusta saber que cuando están en un directorio aleatorio eso lsserá /usr/bin/lsy ./lsno lo será. También existe el obstáculo de que si sabe cómo agregar .al final de su camino, probablemente tenga alguna idea de lo que está haciendo. root nunca debería tener .en el camino, muchos sistemas ya ni siquiera permiten que root inicie sesión.
msw

Respuestas:

41

Respondiste correctamente tu propia pregunta, esa es exactamente la razón por la cual el punto no está en el camino:
para protegerte contra virus infantiles o errores honestos.

Por supuesto, esta es una medida de antivirus muy poco convincente e inútil, y nada le impide agregar puntos a la ruta usted mismo.

harrymc
fuente
13
Sin embargo, es curioso que estés protegido de esto, pero no de un archivo solitario -rfen el directorio (hace rm *interesante) ;-)
Joey
La respuesta de Unix: ¿por qué nombraste un archivo -rfen primer lugar? ;)
msw
2
@msw: Otra respuesta de Unix es que normalmente el punto en la ruta está mal visto por las cuentas de administrador, pero está bien para los que no son administradores.
harrymc
¿se reduciría en gran medida el riesgo si la ruta actual fuera la última ruta, de modo que todos los lugares normales para los programas se verificaran primero ?
Jon z
1
@ Jonz: En realidad no. Pero el riesgo es bastante pequeño si su computadora está libre de virus. Y si la computadora está infectada, entonces, con los virus modernos, el camino es la menor de sus preocupaciones.
harrymc
4

Sí. Si pones el "." en la ruta, terminaría enviando muchas llamadas de comando a los archivos en su directorio actual.

Incluso si fue el último, todavía hay un error piloto. Por ejemplo, Solaris 10 carece de "top". Escribo "top" en mi sistema todo el día, porque creo que estoy en un sistema que tiene "top".

benc
fuente
1

Lo siento, me gustaría preguntar esto en forma de un comentario a la respuesta seleccionada, pero todavía no tengo ningún representante en superusuario.

La respuesta de seguridad tiene sentido, pero si pones "." en su RUTA como la última cosa, ¿no debería mirar el shell en el directorio actual al buscar ejecutables, y así reducir el riesgo de seguridad? Si buscara $ PATH en orden, encontraría / bin / ls antes de encontrar ./ls.

Entonces, qué inseguro es para mí poner "." al final de mi variable de entorno $ PATH?

Funciona como sugiero. Así es como lo probé:

Primero, agregue "." al final de su variable de entorno PATH.

Luego, coloque el siguiente archivo en algún directorio, como ~ / dir1 / dir2 / test_which.rb:

#!/your/path/to/ruby

puts "this file is from the current directory"

Y ponga este archivo en /usr/bin/test_which.rb

#!/your/path/to/ruby

puts "this file is at /usr/bin/test_which.rb"

Asegúrese de chmod + x los archivos para que sean ejecutables.

Ahora, si cambia el directorio a ~ / dir1 / dir2 y ejecuta test_which.rb, obtendrá el resultado

this file is at /usr/bin/test_which.rb

De hecho, si ejecuta "which test_which.rb" desde cualquier lugar, debería informar

/usr/bin/test_which.rb

Todavía puede ejecutar el archivo en el directorio actual escribiendo:

./test_which.rb
Tyler Collier
fuente
77
Nadie jamás se ha hecho un error tipográfico, tales como dco sl, o sduoen una cáscara, y fue salvado por el "comando no encontrado". Siempre.
Daniel Beck
1
De acuerdo con Daniel: podría tener un script malicioso con el nombre de un comando mal escrito. Ver también esta respuesta .
ignis
@DanielBeck, deberías intentar usar alias para errores de escritura. Tengo mi configuración preferida de ls(salida de color y más) con alias lque prescinde completamente de errores tipográficos.
Karl Damgaard Asmussen
1
@KarlDamgaardAsmussen kl
deworde
Yo personalmente no agrego '.' a mi camino No es tan difícil escribir ./run o lo que quiera hacer en el directorio local. Me ha salvado algunas veces de recoger cosas inesperadas. Tomate Tomahto.
Michael Mathews
1

Más que un riesgo de seguridad, tener '.' en la RUTA hacen casi imposible asegurarse de que la ejecución de cualquier comando actúe según lo previsto. Piense en ejecutar un comando como 'zip' en un directorio enorme que contiene miles de archivos con nombres aleatorios. La posibilidad de que uno de ellos se llame realmente 'zip' no es insignificante y provocaría un error que es muy difícil de entender (en realidad, el archivo debe ser ejecutable, lo que, sin embargo, podría suceder).

En particular, esto es cierto cuando se escriben scripts que mantienen la variable PATH del usuario. Un buen guión escrito debe tratar con todos los casos de esquina (como nombres de archivo con espacios en ellos o comenzando con '-'). Pero no es práctico evitar que se ejecute un archivo en el directorio actual en lugar de un comando del sistema ...

Emanuele Paolini
fuente