Чому це . за замовчуванням не йде шлях?


63

У системах, схожих на UNIX, протягом багатьох років (найбільш важливо для мене, Linux), я помітив, що .(поточний dir) ніколи не знаходиться $PATHза замовчуванням. Чому це?

Я пам'ятаю, як читав роки тому, що це проблема безпеки, але прочитана стаття не пояснила, в чому саме полягає проблема. Це тому, що хтось може залишити шкідливу версію lsабо cpв каталозі, і я в кінцевому підсумку запустив його, не розуміючи, що він там є?


6
Це не стільки для інтерактивного захисту користувачів, скільки для інших програм (і скриптів), які запускають інші програми. Навіть деяким кмітливим користувачам подобається знати, що вони потрапляють у випадковий каталог, який lsбуде /usr/bin/lsі ./lsне є. Існує також перешкода, якщо ви знаєте, як додати .до кінця свого шляху, ви, мабуть, маєте уявлення про те, що робите. корінь ніколи не повинен мати .шлях, багато систем навіть не дозволяють кореням увійти.
msw

Відповіді:


41

Ви правильно відповіли на власне запитання, саме тому крапка не стоїть на шляху:
Захистити від дитячих вірусів чи чесних помилок.

Звичайно, це дуже кульгавий і марний антивірусний захід, і ніщо не заважає вам самостійно додавати крапки в шлях.


13
Дуже смішно, що ви захищені від цього, але не від самотнього файлу -rfв каталозі (це rm *цікаво) ;-)
Joey

Відповідь Unix: чому ви назвали файл -rfв першу чергу? ;)
msw

2
@msw: Ще одна відповідь Unix полягає в тому, що звичайно крапка на шляху спохмурнена для облікових записів адміністратора, але це нормально для не-адміністратора.
harrymc

ризик був би сильно зменшений, якби поточний шлях був останнім шляхом, щоб спочатку перевірили всі звичайні місця для програм ?
Jon z

1
@Jonz: Не дуже. Але ризик досить невеликий, якщо ваш комп'ютер чистий від вірусів. А якщо комп'ютер заражений, то із сучасними вірусами шлях - це найменше ваших турбот.
harrymc

4

Так. Якщо ви поставите "." на шляху ви в кінцевому підсумку надішлете безліч командних викликів файлам у вашому поточному каталозі.

Навіть якщо вона була останньою, все ще є пілотна помилка. Наприклад, Solaris 10 не вистачає "вершини". Я набираю "top" у своїй системі цілий день, тому що я думаю, що я в системі, яка має "top".


1

Вибачте, я хотів би задати це у вигляді коментаря до вибраної відповіді, але у мене ще немає жодного представника щодо суперпользователя.

Відповідь безпеки має сенс, але якщо ви поставите "". у вашому 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

Дійсно, якщо ви запустите "what test_which.rb" з будь-якого місця, він повинен звітувати

/usr/bin/test_which.rb

Ви можете виконати файл у поточному каталозі, ввівши:

./test_which.rb

8
Ніхто ніколи не зробив помилку, наприклад, dcабо slчи sduoв оболонці, і був врятований «команда не знайдена». Колись.
Даніель Бек

1
Погодьтеся з Даніелем: у вас може виникнути шкідливий скрипт, названий після команди, написаної неправильно. Дивіться також цю відповідь .
ignis

@DanielBeck вам слід спробувати використовувати псевдонім для викривлення. У мене є краща конфігурація ls(кольоровий вихід і багато іншого), псевдонім, lякий повністю не відповідає друку.
Карл Дамгаард Асмуссен

1
@KarlDamgaardAsmussen kl
deworde

Я особисто не додаю "." на мій шлях. Це не так важко набрати ./run або все, що я хочу зробити в місцевому режимі. Це врятувало мене кілька разів від збирання несподіваних речей. Томатний томахто.
Майкл Метьюз

1

Більше, ніж ризик для безпеки, маючи "." в PATH майже неможливо зробити так, щоб виконання будь-якої команди діяло за призначенням. Подумайте про запуск команди на зразок 'zip' у величезному каталозі, що містить тисячу файлів із випадковими іменами. Можливість того, що один із них насправді називається "zip", не є незначною і призведе до помилки, яку дуже важко зрозуміти (насправді файл повинен бути виконаним, що, однак, може статися).

Зокрема, це стосується написання сценаріїв, які зберігають змінну PATH користувача. Хороший письмовий сценарій повинен мати справу з усіма кутовими справами (наприклад, назви файлів з пробілами в них або починаючи з «-»). Але недоцільно запобігати виконанню файлу в поточному каталозі замість системної команди ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.