Библиотека сайта rus-linux.net
Использование sudo в Ubuntu для начинающих пользователей
Оригинал: A beginner's guide to understanding sudo on Ubuntu
Автор: Himanshu Arora
Дата публикации: 13 февраля 2017 г.
Перевод: А.Панин
Дата перевода: 22 марта 2017 г.
Вы когда-нибудь сталкивались с ошибкой "Permission denied" в процессе работы с интерфейсом командной строки Linux? Если это так, то велика вероятность того, что вы пытались выполнить операцию, требующую привилегий пользователя root. Например, на следующей иллюстрации показано сообщение об ошибке, выведенное после моей попытки копирования бинарного файла в одну из системных директорий.
Но в чем заключается решение данной проблемы? Все предельно просто: достаточно использовать команду sudo.
Пользователю, применяющему данную команду, обычно предлагается ввести его пароль. После ввода корректного пароля операция успешно выполняется.
Хотя команда sudo и является, без сомнения, одной из самых важных команд для любого, кто работает с интерфейсом командной строки в Linux, существует несколько важных аспектов (а также особенностей ее функционирования), о которых следует знать для того, чтобы пользоваться ею максимально ответственно и продуктивно. Именно их мы и обсудим в данной статье.
Но перед тем, как двигаться дальше, следует упомянуть о том, что все приведенные в статье команды и инструкции были протестированы в системе Ubuntu 14.04 LTS с командной оболочкой Bash версии 4.3.11.
Что такое sudo?
Команда sudo, как большинство из вас наверняка знает, используется для исполнения команд с повышенными привилегиями (обычно от лица пользователя root). Во вводной части я уже привел пример ее использования. Однако, если вам нужно, вы можете использовать данную команду для исполнения другой команды от лица какого-либо другого пользователя (не обязательно являющегося пользователем root).
Для этой цели предназначен параметр -u
. Так, в приведенном ниже примере я (himanshu) попытался переименовать файл из директории другого пользователя (howtoforge), но получил в результате ошибку "Permission denied". После этого я выполнил ту же команду mv
с префиксом sudo, то есть, sudo -u howtoforge
и на этот раз попытка переименования файла успешно завершилась.
С sudo может работать любой пользователь?
Нет. Для того, чтобы пользователь имел возможность работать с sudo, в файле /etc/sudoers
должна присутствовать запись, соответствующая его учетной записи. Следующий текст, взятый с веб-сайта проекта Ubuntu, должен прояснить ситуацию:
Файл /etc/sudoers
позволяет указать имена пользователей, команды которые эти пользователи могут исполнять от лица других пользователей, имена пользователей, от лица которых могут исполняться команды, названия машин, на которых они могут исполняться, а также задать специальные параметры, указывающие, к примеру, на необходимость запроса пароля при исполнении определенных команд. Этот файл состоит из псевдонимов (по своей сути являющихся переменными) и описаний пользователей (позволяющих указать команды, которые они могут исполнять).
Если вы используете Ubuntu, вы можете достаточно просто убедиться в том, что пользователь может работать с sudo: все, что вам нужно - это выбрать в качестве типа учетной записи данного пользователя вариант "Администратор".
Это может быть сделано после перехода по системному меню Параметры системы... -> Учетные записи.
Для начала придется разблокировать элементы управления.
После этого следует выбрать интересующую учетную запись пользователя и сменить ее тип на "Администратор"
.
Однако, в том случае, если вы используете не Ubuntu или в вашем дистрибутиве нет подобной функции, вы можете добиться аналогичного эффекта путем ручного редактирования файла /etc/sudoers
. Вам придется добавить в этот файл следующую строку:
[имя пользователя] ALL=(ALL:ALL) ALL
Думаю, не стоит лишний раз напоминать о том, что вместо строки "имя пользователя"
должно использоваться реальное имя учетной записи пользователя, которому предоставляется возможность работы с sudo. Важный нюанс, о котором стоит сказать отдельно, заключается в том, что в официальной документации для редактирования упомянутого файла рекомендуется использовать команду visudo
- вам всего лишь придется выполнить следующую команду:
sudo visudo
Для того, чтобы понять причину данной рекомендации, вы можете прочитать приведенную ниже выдержку из руководства sudo:
Утилита visudo
позволяет безопасно редактировать файл sudoers
. visudo
блокирует файл sudoers
для предотвращения одновременного редактирования несколькими пользователями, осуществляет простейшие проверки корректности инструкций и поиск синтаксических ошибок. Если файл sudoers
в текущий момент редактируется, вы получите сообщение о том, что следует предпринять попытку его редактирования через некоторое время.
Для получения дополнительной информации об утилите visudo
вы можете перейти по
Что такое сессия sudo?
Если вы периодически используете команду sudo, я уверен, что вы заметили особенность ее работы, заключающуюся в том, что после успешного ввода пароля вы можете использовать sudo еще несколько раз вообще без ввода пароля. Но по истечении некоторого времени команда sudo снова начинает запрашивать ввод пароля.
Это поведение никак не связано с количеством исполненных посредством sudo команд, но связано с временем. Да, по умолчанию sudo не будет запрашивать ввод пароля в течение 15 минут после его успешной проверки. По истечении этих 15 минут sudo снова попросит ввести пароль.
Однако, при желании вы можете изменить описанное поведение. Для этого следует открыть файл конфигурации /etc/sudoers
с помощью следующей команды:
sudo visudo
После этого нужно перейти к строке
Defaults env_reset
и добавить в конец этой строки следующую переменную с новым значением (выделено жирным шрифтом):
Defaults env_reset,timestamp_timeout=[новое значение]
Поле "[новое значение]"
должно быть заменено на количество минут, в течение которых должна существовать ваша сессия sudo. К примеру, я использовал значение 40.
Если вы хотите, чтобы запрос пароля осуществлялся при каждом использовании команды sudo, вы можете установить значение 0 данной переменной. А если вам нужно, чтобы сессия sudo длилась вечно, вы можете установить значение -1 данной переменной.
Пожалуйста учтите, что использование значения -1 рассматриваемой переменной настоятельно не рекомендуется.
Пароль sudo
Как вы могли заметить, в процессе ввода пароля не отображается никаких символов, даже привычных звездочек. Хотя это и не является большой проблемой, некоторым пользователям по различным причинам хочется видеть хотя бы звездочки.
К счастью, соответствующий режим ввода пароля достаточно просто активировать. Все, что вам нужно сделать - это изменить следующую строку в файле /etc/sudoers
:
Defaults env_reset
на строку
Defaults env_reset,pwfeedback
После этого нужно сохранить изменения в файле.
Теперь при вводе пароля в процессе работы с утилитой sudo будут отображаться звездочки.
Некоторые важные параметры команды sudo
Помимо параметра -u
(который мы обсуждали в начале данной статьи) существует несколько других важных параметров команды sudo, которые достойны упоминания. Мы обсудим некоторые из них в данном разделе.
Параметр -k
Предположим, что вы только что выполнили команду посредством sudo и ввели свой пароль. Как вы знаете, по умолчанию sudo не будет спрашивать пароль в течение следующих 15 минут. А теперь предположим, что вам понадобилось предоставить кому-либо доступ к своему терминалу без возможности использования sudo. Что можно предпринять в этом случае?
К счастью, существует параметр -k
, позволяющий принудительно завершить сессию sudo. А вот что написано о данном параметре на странице руководства sudo:
-k, --reset-timestamp
При использовании без команды позволяет сбросить кэшированные параметры пользователя. Другими словами, при следующем вызове sudo будет запрашиваться пароль. Данный параметр не требует ввода пароля и был добавлен специально для того, чтобы у пользователей имелась возможность убрать информацию о правах доступа sudo из файла .logout
.
При использовании вместе с командой или требующим пароля параметром может потребоваться ввод пароля, так как в результате использования данного параметра кэшированная информация о правах доступа sudo игнорируется. В результате sudo снова предложит ввести пароль (в том случае, если это требуется политикой безопасности) и не будет обновлять кэшированную информацию о правах доступа.
Параметр -s
Может случиться так, что в процессе работы вам потребуется выполнить множество команд, требующих привилегий пользователя root, и вам не захочется вводить префикс sudo перед каждой из них. Также вам не захочется настраивать длительность сессии sudo путем редактирования файла конфигурации /etc/sudoers
.
В этом случае вам может пригодиться параметр -s
. Это описание данного параметра со страницы руководства sudo:
-s, --shell
Запустить командную оболочку, путь к бинарному файлу которой задан с помощью переменной окружения SHELL
, если таковая существует, или командную оболочку, путь к бинарному файлу которой задан в параметрах учетной записи вызывающего пользователя. В случае использовании команды, она будет передана в эту командную оболочку для последующего исполнения посредством стандартного параметра -c
. Если команды не задано, пользователю будет предоставлен доступ к запущенной интерактивной командной оболочке.
Итак, данный параметр выполняет следующие действия:
-
Запускает новую командную оболочку, путь к бинарному файлу которой задан с помощью переменной окружения
$SHELL
. В том случае, если переменная окружения$SHELL
имеет пустое значение, запускается командная оболочка, путь к бинарному файлу которой указан в строке с описанием параметров учетной записи текущего пользователя в файле/etc/passwd
. -
Если вы передаете команду вместе с параметром
-s
(например, исполняя командуsudo -s whoami
), то исполняется следующая команда:sudo /bin/bash -c whoami
. -
Если вы не пытаетесь исполнить какую-либо свою команду (то есть, просто исполняете команду
sudo -s
), вы получаете доступ к интерактивной командной оболочке с привилегиями пользователя root.
Следует иметь в виду, что параметр -s
предоставляет в ваше распоряжение командную оболочку с привилегиями пользователя root, но без окружения пользователя root - эта командная оболочка будет использовать ваш файл .bashrc
. По сути, это означает, что, к примеру, при исполнении с помощью этой командной оболочки команды whoami
будет выводиться ваше имя пользователя, а не root.
Параметр -i
Параметр -i
похож на параметр -s
, который мы только что обсуждали. Однако, между ними имеются некоторые отличия. Одно из ключевых отличий заключается в том, что параметр -i
также предоставляет вам окружение пользователя root, поэтому ваш (пользовательский) файл .bashrc
игнорируется. Это сравнимо с использованием учетной записи пользователя root без входа в систему под именем пользователя root. Кроме того, вам не придется вводить пароль пользователя root.
Важное замечание: помните о том, что существует также команда su
, которая позволяет работать от лица других пользователей (по умолчанию вы становитесь пользователем root). Данная команда требует ввода пароля пользователя root. Для того, чтобы избежать необходимости ввода пароля этого пользователя, вы можете также использовать префикс sudo (то есть, команду sudo su
); в этом случае вам придется ввести ваш пароль. Однако, команды su
и sudo su
имеют некоторые отличия; для того, чтобы разобраться с ними, а также ознакомиться со сравнением данных команд с командой sudo -i
достаточно обратиться к обсуждению, доступному по
Заключение
Я надеюсь, что вы хотя бы в общих чертах поняли принцип работы команды sudo, а также методику изменения ее стандартного поведения. Самостоятельно испытайте описанные модификации файла /etc/sudoers
и ознакомьтесь с обсуждением (ссылка на которое приведена в предыдущем параграфе), если хотите узнать об этой команде немного больше.