web-dev-qa-db-fra.com

Pourquoi est-ce . pas dans le chemin par défaut?

Au fil des années, sur les systèmes de type UNIX (principalement pour Linux), j'ai remarqué que . (répertoire actuel) ne figure jamais dans le $PATH par défaut. Pourquoi est-ce?

Je me souviens avoir lu il y a des années qu'il s'agissait d'un problème de sécurité, mais l'article que j'ai lu n'expliquait pas exactement le problème. Est-ce parce que quelqu'un pourrait laisser une version malveillante de ls ou cp dans un répertoire et que je finirais par l'exécuter sans se rendre compte qu'elle existait déjà?

62
dirtside

Vous avez répondu correctement à votre propre question, c'est pourquoi le point n'est pas dans le chemin:
Pour se protéger contre les virus enfantins et les erreurs de bonne foi.

Bien sûr, il s’agit d’une mesure anti-virus très boiteuse et inutile, et rien ne vous empêche d’ajouter vous-même un point au chemin.

41
harrymc

Oui. Si vous mettez le "." dans le chemin, vous finirez par envoyer de nombreux appels de commande aux fichiers de votre répertoire actuel.

Même si c'était la dernière fois, il y a toujours une erreur du pilote. Par exemple, Solaris 10 manque de "top". Je tape "top" sur mon système toute la journée, car je pense que je suis sur un système qui a "top".

4
benc

Plus qu'un risque de sécurité, avoir '.' dans PATH, il est presque impossible de s’assurer que l’exécution d’une commande agit comme prévu. Pensez à exécuter une commande comme "Zip" dans un énorme répertoire contenant des milliers de fichiers avec des noms aléatoires. La possibilité que l'un d'entre eux s'appelle réellement "Zip" n'est pas négligeable et entraînerait une erreur très difficile à comprendre (en réalité, le fichier doit être exécutable, ce qui peut toutefois arriver).

Ceci est particulièrement vrai lors de l'écriture de scripts qui conservent la variable PATH de l'utilisateur. Un bon script écrit doit traiter de tous les cas de figure (comme les noms de fichiers contenant des espaces ou commençant par '-'). Mais il n’est pas pratique d’empêcher l’exécution d’un fichier du répertoire en cours au lieu d’une commande système ...

1
Emanuele Paolini

Désolé, j'aimerais poser cette question sous la forme d'un commentaire à la réponse choisie, mais je n'ai pas encore de représentant sur le superutilisateur.

La réponse de sécurité est logique, mais si vous mettez "." En dernier lieu, dans votre CHEMIN, le shell ne devrait-il pas regarder dans le répertoire en cours en dernier lorsqu'il cherche des exécutables, et réduire ainsi le risque de sécurité? Si elle cherchait $ PATH dans l'ordre, elle trouverait/bin/ls avant de trouver ./ls.

Alors, à quel point est-il dangereux pour moi de mettre "." À la fin de ma variable d’environnement $ PATH?

Cela fonctionne comme je le suggère. Voici comment j'ai testé:

Tout d'abord, ajoutez "." à la fin de votre variable d'environnement PATH.

Ensuite, placez le fichier suivant dans un répertoire, tel que ~/dir1/dir2/test_which.rb:

#!/your/path/to/Ruby

puts "this file is from the current directory"

Et mettez ce fichier à /usr/bin/test_which.rb

#!/your/path/to/Ruby

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

Assurez-vous de chmod + x les fichiers pour qu’ils soient exécutables.

Maintenant, si vous changez de répertoire en ~/dir1/dir2 et exécutez test_which.rb, vous obtiendrez le résultat

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

En effet, si vous exécutez "quel test_which.rb" de n'importe où, il devrait signaler

/usr/bin/test_which.rb

Vous pouvez toujours exécuter le fichier dans le répertoire actuel en tapant:

./test_which.rb
1
Tyler Collier