Почему некоторые команды не существуют?

765
Ross

Я довольно новый пользователь Linux и заметил, что некоторые команды доступны только суперпользователю - например, shutdown. Я часто путаюсь, когда знаю, что есть команда, пытаюсь ее выполнить, но мне говорят, что ее даже не существует, - но все, что мне нужно, это быть пользователем root, чтобы выполнить ее.

Мой вопрос: почему эти команды не говорят, что у вас недостаточно прав для его запуска, или говорят, что вам нужно быть пользователем root? Есть ли какая-то техническая причина для этого или это просто так?

0

4 ответа на вопрос

6
heavyd

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

echo $PATH 

и вы можете проверить местоположение вашей команды, набрав

whereis shutdown 

как правило, вы увидите, что каталог команды, которую вы ищете, отсутствует в вашей переменной PATH. Вы можете добавить каталоги к своему пути, добавив следующие строки в свой скрипт входа в систему (~ / .bash_profile).

PATH=$PATH:/my/new/directory export PATH 
4
Telemachus

Ответ, который вы, вероятно, видите, указывает не на то, что команды не существуют, а на то, что они «не найдены»:

telemachus ~ $ ifconfig -a bash: ifconfig: command not found 

Некоторые сообщения об ошибках бесполезны, но это на самом деле относительно полезно. Слова «не найдены» говорят вам, где проблема. Ваша оболочка (в моем случае это Bash, очевидно) ищет команды по своей $PATHпеременной. Это PATHнабор значений, разделенных двоеточиями. Каждое значение является каталогом, куда идут исполняемые (двоичные) программы, и оболочка ищет команды в порядке слева направо по этой цепочке каталогов. Вот как можно увидеть, каков ваш PATH:

telemachus ~ $ echo $PATH /home/telemachus/bin:/usr/local/bin:/usr/bin:/bin:/usr/games 

(Обратите внимание, что регистр имеет значение, PATH все верхнее. Также $имеет значение.) Поэтому моя оболочка ищет команды в binкаталоге в моей домашней папке, затем в /usr/local/bin, затем в /usr/binи т. Д. Порядок имеет значение, потому что иногда у вас будет две версии одной программа, и вы хотите убедиться, что вы найдете конкретный в первую очередь. (У меня в $HOME/binкаталоге есть версия Ruby, отличная от общесистемной, и я хочу, чтобы она была найдена первой.)

Чтобы добавить каталог в PATH, вы обычно можете отредактировать профиль вашей оболочки. В зависимости от того, какой дистрибутив Linux вы используете, этот файл будет называться .profileили .bash_profile, и он будет находиться в вашем домашнем каталоге. Файлы, начинающиеся с .(часто называемые точечными файлами), по умолчанию скрыты. Они не будут отображаться в файловом менеджере GUI, и lsкоманда не увидит их (без помощи). Чтобы увидеть, что присутствует в вашем доме, откройте оболочку (в новой оболочке вы по умолчанию будете находиться в вашем домашнем каталоге) и введите ls -A . -A флаг указывает Ls команду, чтобы показать скрытые файлы. Вы должны увидеть либо .profileили .bash_profile, которые вы можете редактировать. Добавьте двоеточие и полный путь к нужному каталогу (полный путь должен начинаться с/указать свою позицию от корня вашего диска). Вы не хотите двоеточие после последнего значения. Поэтому, если у вас нормальный PATH, вы можете добавить /sbinэтот путь:

PATH=$PATH:/sbin 

Тем не менее, все это говорит, что вы все еще не можете получить прямо /sbin/shutdownтаким образом:

telemachus ~ $ /sbin/shutdown -h now shutdown: you must be root to do that! 

Дав полный путь к команде, я «нашел» команду, но все равно не смог ее запустить. Некоторые команды, например shutdown, требуют специальных привилегий. Чтобы получить разрешение на выпуск shutdownиз оболочки, вам нужно будет использовать suили в sudoзависимости от того, какую систему вы используете. Я уже написал роман, так что это история для другого дня.

3
Kirill V. Lyadvinsky

Они хранятся в каталогах /usr/sbinили /sbinкаталогах, которые не включены в PATHпеременную пользователя (по умолчанию).

1
Andrea Ambu

Думайте о Linux как о многопользовательской системе, и это будет иметь смысл. Вы не хотите, чтобы машина, на которой вы работаете, была отключена другим пользователем . Если root делает это хорошо, возможно, у него есть веская причина отключить его.

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

В консоли вы можете получить root-доступ с помощью suкоманды (если вы знаете пароль root) или sudo suесли ваш дистрибутив использует sudo. После этого у вас будут все полномочия и привилегии, необходимые для взлома вашей системы: P