Почему при запуске sh-файла в Linux нужно запускать ./name.sh? - PullRequest
3 голосов
/ 22 сентября 2011

У меня есть файл с именем x.sh, который я хочу выполнить.Если я бегу:

x.sh

, тогда я получаю:

x.sh: command not found

Если я бегу:

./x.sh

, тогда он работает правильно.Почему я должен вводить ./ сначала?

Ответы [ 5 ]

5 голосов
/ 22 сентября 2011

Поскольку текущий каталог не входит в переменную окружения PATH по умолчанию, а исполняемые файлы без указания пути ищутся только внутри каталога, указанного в PATH. Вы можете изменить это поведение, добавив . в конец PATH, но это не обычная практика, вы просто привыкнете к этому UNIXism.

Идея, лежащая в основе этого, заключается в том, что если поиск исполняемых файлов сначала выполняется в текущем каталоге, злоумышленник может поместить в свой домашний каталог исполняемый файл с именем, например ls или grep или какая-либо другая часто используемая команда, обманывая администратора, чтобы использовать ее, возможно, с полномочиями суперпользователя. С другой стороны, эта проблема не особенно чувствуется, если вы поставите . в конце PATH, так как в этом случае системные каталоги ищутся первыми.

Но : наш злонамеренный пользователь все еще может создавать свои опасные сценарии, называемые общими опечатками часто используемых команд, например, sl для ls (Подсказка: привяжите его к Steam Locomotive , и вы все равно не будете обмануты :D).

Итак, вы видите, что все же лучше быть в безопасности, если вы вводите имя исполняемого файла без указания пути, вы уверены, что запускаете что-то из системных каталогов (и, следовательно, предположительно безопасно).

5 голосов
/ 22 сентября 2011

Поскольку текущий каталог обычно не включается в PATH по умолчанию, из соображений безопасности: НЕ просматривая текущий каталог, можно избежать всех видов злобных действий, которые могут быть вызваны установкой вредоносной программы с именем легитимной утилиты. , В качестве примера представьте, что кому-то удается внедрить в вашу директорию скрипт с именем ls, и этот скрипт выполняет rm *.

Если вы хотите включить текущий путь в свой путь и используете bash в качестве оболочки по умолчанию, вы можете добавить путь через файл ~/.bashrc.

export PATH=$PATH:.

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

Вы можете также изменить общесистемные настройки с помощью /etc/profile, но это, вероятно, не очень хорошая идея.

1 голос
/ 22 сентября 2011

Если вы не укажете явно каталог, то оболочка выполнит поиск в каталогах, перечисленных в вашем $PATH, для именованного исполняемого файла. Если ваш $PATH не включает ., то текущий каталог не ищется.

$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

Это специально. Если в текущем каталоге выполняется поиск, то введенная вами команда потенциально может измениться в зависимости от того, в каком каталоге вы находитесь. Это позволит злоумышленнику поместить двоичный файл с именем ls или cp в часто посещаемые каталоги и заставить вас запустить другая программа.

$ cat /tmp/ls
rm -rf ~/*
$ cd /tmp
$ ls
*kaboom*

Я настоятельно рекомендую вам , а не добавить . к вашему $PATH. Вы быстро привыкнете печатать ./, это не страшно.

1 голос
/ 22 сентября 2011

Поскольку текущий каталог не находится в PATH (в отличие от cmd в Windows). Это функция безопасности, позволяющая случайно запустить вредоносные сценарии в текущем каталоге.

Хотя это нежелательно, чтобы удовлетворить любопытство, вы можете добавить . к PATH, и тогда вы увидите, что x.sh будет работать.

0 голосов
/ 22 сентября 2011

Вы не можете выполнить свой файл, просто набрав x.sh, потому что текущий рабочий каталог отсутствует в вашем $ PATH.Чтобы увидеть текущий рабочий каталог, введите

$ pwd

Чтобы увидеть свой $ PATH, введите

$ echo $PATH

Чтобы добавить текущий каталог в $ PATH для этого сеанса, введите

$ PATH=$PATH:.

Чтобы добавить его навсегда, отредактируйте файл .profile в вашем домашнем каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...