61

На UNIX-подобных системах за эти годы (наиболее актуально для меня, Linux) я это заметил . (текущий каталог) по умолчанию никогда не $PATH . Почему это?

Я помню, как много лет назад читал, что это была проблема безопасности, но в статье, которую я читал, не было объяснения, в чем именно заключалась проблема. Это потому, что кто-то мог оставить в каталоге вредоносную версию ls или cp , и я бы запустил ее, даже не подозревая, что она там есть?

4 ответа4

40

Вы правильно ответили на свой вопрос, именно поэтому точка не находится на пути:
Для защиты от детских вирусов или честных ошибок.

Конечно, это очень бесполезная и бесполезная антивирусная мера, и ничто не мешает вам самим добавлять точки в путь.

4

Да. Если вы поставите «.» в пути вы бы отправили много командных вызовов файлам в вашем текущем каталоге.

Даже если это было последним, все еще есть ошибка пилота. Например, в Solaris 10 отсутствует "верх". Я набираю "top" в моей системе весь день, потому что я думаю, что я нахожусь в системе, которая имеет "top".

1

Больше чем угроза безопасности, имея «.» в PATH сделать практически невозможным, чтобы убедиться, что выполнение любой команды действует как задумано. Подумайте о запуске такой команды, как 'zip', в огромной директории, содержащей тысячи файлов со случайными именами. Возможность того, что один из них на самом деле называется zip, не является ничтожной и может привести к ошибке, которую очень трудно понять (на самом деле файл должен быть исполняемым, что, однако, может произойти).

В частности, это верно при написании скриптов, которые хранят переменную PATH пользователя. Хороший письменный сценарий должен иметь дело со всеми угловыми случаями (например, имена файлов с пробелами в них или начинающиеся с '-'). Но нецелесообразно предотвращать выполнение файла в текущем каталоге вместо системной команды ...

1

Извините, я хотел бы спросить об этом в виде комментария к выбранному ответу, но у меня пока нет ни одного представителя в superuser.

Ответ безопасности имеет смысл, но если вы поставите "." в вашей переменной PATH, как последняя вещь, разве оболочка не должна выглядеть последней в текущем каталоге при поиске исполняемых файлов и, таким образом, снизить угрозу безопасности? Если бы он выполнял поиск в $ PATH по порядку, он бы нашел /bin /ls, прежде чем найдет ./ls.

Итак, насколько небезопасно для меня ставить "." в конце моей переменной среды $ PATH?

Это работает, как я предлагаю. Вот как я тестировал:

Сначала добавьте "." в конец вашей переменной среды PATH.

Затем поместите следующий файл в какой-то каталог, например ~/dir1/dir2/test_which.rb:

#!/your/path/to/ruby

puts "this file is from the current directory"

И поместите этот файл в /usr/bin/test_which.rb

#!/your/path/to/ruby

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

Не забудьте chmod +x файлы, чтобы они были исполняемыми.

Теперь, если вы измените каталог на ~/dir1/dir2 и выполните test_which.rb, вы получите вывод

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

Действительно, если вы запустите «which test_which.rb» из любого места, он должен сообщить

/usr/bin/test_which.rb

Вы все еще можете выполнить файл в текущем каталоге, набрав:

./test_which.rb

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .