Команда sudo

Командаsudo -- это ещё один способ ущемления прав пользователя при доступе к аккаунту администратора. Он принят по умолчанию во всех дистрибутивах семейства Ubuntu, может быть задействован при инсталляции в Debian’е (хотя и по заказу) или подключён в любом другом дистрибутиве Linux.

По сравнению с su она обладает рядом преимуществе, особенно сказывающихся при эпизодическом применении, делая всякого рода настроечные и установочные мероприятия проще и безопасней. И потому часто оказывается предпочтительной. А для пользователя Ubuntu знание этой команды, ввиду умолчального отсутствия суперпользовательского пароля -- практически необходимость: любое действие по установке программ или настройке чего бы то ни было, делается в дистрибутивах этого семейства через sudo.

Итак, sudo -- это программа для получения прав суперпользователя (или любого иного пользователя), подобная su. Основных отличий от последней -- три:

  1. во-первых, sudo по умолчанию требует указания пароля того пользователя, который получает права другого, а не пароля того, чьи права приобретаются; правда, это может быть изменено;
  2. Во-вторых, действие sudo распространяется по умолчанию только на одну команду -- ту, которая указывается в качестве ее аргумента; хотя и такое поведение можно изменить с помощью соответствующих опций, о чём будет сказано позднее;
  3. в-третьих, sudo обеспечивает более гибкое разграничение доступа пользователей к административным правам -- не только разрешая или запрещая получение оных, но и позволяя выполнять только определённый круг действий.

Этим достигается две цели: а) возможность выполнения пользователем административных действий без сообщения ему суперпользовательского пароля, и б) снижение риска повредить систему вследствие забывчивости. Да, есть еще и третья, дополнительная возможность, предоставляемая sudo -- протоколирование действий, позволяющее определить, в результате чего система рухнула.

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

$ sudo fdisk -l /dev/sda

данная от лица обычного пользователя, выведет информацию об указанном дисковом устройстве точно так же, как и данная root’ом.

Таким образом, утилита sudo в самом простом случае действует аналогично команде su -c [command], но более удобным образом. Во-первых, её команда-аргумент не нуждается ни в каком экранировании. Во-вторых, в должным образом настроенной оболочке bash в отношении команд-аргументов и путей -- аргументов последних, будет действовать автодополнение по нажатию клавиши Tab. Уже одно это определяет предпочтительность sudo супротив su. А как добиться от bash столь образцового поведения -- мы рассмотрим в подрубрике о командных оболочках.

Кстати, если от лица суперпользователя нужно выполнить подряд несколько команд, делать это следует быстро -- введенный первый раз пароль по умолчанию “действует” в течении 5 минут. То есть в течении этого времени в ответ на команду sudo пароль повторно запрашиваться не будет.

Период действия пароля для команды sudo можно увеличить, уменьшить или вообще ликвидировать, чтобы аутентификация запрашивался всегда. Это достигается редактированием конфигурационного файла утилиты, к чему мы вернёмся чуть позже.

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

$ sudo nano -w /etc/fstab

Впрочем, для редактирования общесистемных конфигов предназначена специальная команда sudoedit (или просто sudo с опцией -e). Она не требует указания имени вызываемого для этой цели редактора: в качестве такового используется значение переменной EDITOR из окружения того пользователя, который ее вызвал. Если эта переменная не определена -- а это обычно делается в профильных файлах регистрационной оболочки пользователя, -- для редактирования вызывается редактор Vim (в своей упрощенной ипостаси, эмулирующей классический vi).

Как это ни парадоксально, команда sudo не исключает запуска администраторского сеанса внутри обычного пользовательского. Потому что с ее помощью можно запустить ту же команду su:

$ sudo su

И это -- даже в Ubuntu’идах, где root-аккаунта как бы и нет; точнее, по умолчанию нет его пароля. Но использование sudo делает его ненужным даже для команды su. Но и задать пароль суперпользователя не запрещается -- ведь для этого достаточно дать команду

$ sudo passwd

чтобы в дальнейшем использовать su обычным образом. И даже, при желании, авторизоваться root’ом при регистрации в системе.

Впрочем, и тут команда sudo предусматривает “идеологически правильный” метод, и даже не один. Это -- опции -s и -i, пролонгирующие, хотя и несколько по разному, действие команды sudo на неопределённый срок, вплоть до завершения “вторичного сеанса” командой exit.

Опция -s, открывая вторичный сеанс root’а, сохраняет все переменные окружения первоначального пользователя. Однако, если к ней добавить опцию -H, то переменные эти будут заново считаны из профильных файлов домашнего каталога администратора, то есть /root, как при запуске интерактивного экземпляра шелла. Однако каталог, бывший текущим в момент ввода команды, при этом не изменится, как не изменится и вид приглашения командной строки.

Опция же -i полностью воспроизводит root-окружение, запуская его командную оболочку как регистрационную (login shell). Разумеется, при этом и текущий каталог меняется на /root, а приглашение командной строки приобретает вид, описанный в соответствующей переменной профильного файла администраторского шелла (в bash -- PS1).

На практике разница между обеими формами обретения перманентных прав администратора не велика, особенно в bash. Но в zsh соответствующими настройками профильных файлов при желании можно добиться существенно разного окружения в каждом из этих случаев. Правда, насколько это нужно пользователю -- большой вопрос. А вот то, что при использовании опций -H нахождение в перманентно административном режиме никак внешне не впроявляется, чревато ошибками. И делает в большинстве случаев применение опции -i предпочтительным.

Возможности sudo не ограничиваются запуском команд от лица администратора: задав опцию -u username, их можно выполнить и от лица того пользователя, чей логин задан в качестве её значения. Это может быть полезным при просмотре или копировании dot-файлов и dot-каталогов другого пользователя, часто открытых для чтения и изменения только их хозяину.

К слову сказать, команду sudo можно запустить так, чтобы она запрашивала пароль пользователя, от имени которого будет выполняться команда (например, администратора), а не того, кто требует его полномочий. Для этого существует опция -targetpw. А чтобы сделать требование root’ового пароля постоянным, достаточно определить, например, псевдоним типа

alias sudo -targetpw

Требование ввода root’ового пароля при запуске sudo -- поведение этой команды по умолчанию в некоторых дистрибутивах, например, как говорят, в Suse.<

Команда sudo имеет еще немало опций -- выше я привёл только те, которые мне приходилось использовать. Остальные легко посмотреть в man sudo. Из не перечисленных упомяну ещё опцию -b, предписывающую запускать “подсудную” команду в фоновом режиме. Она может быть полезна при выполнении долговременных действий, например, при копировании образов USB на флэшку командой dd.


Содержание


Теги: