Перейти к содержимому

Sudo sh c что за команда

  • автор:

Использование sudo c модулем sh в Python

Есть 3 способа использования команды терминала sudo для выполнения команд в скрипте, требующих прав суперпользователя. Они перечислены в порядке полезности и безопасности. В большинстве случаев следует просто использовать вариант sh.contrib.sudo() .

sh.contrib.sudo()

Так как команда sudo используется очень часто, разработчики модуля sh добавили версию этой команды в подмодуль contrib , чтобы сделать использование sudo более интуитивным. Версия contrib представляет собой обычную обертку для команды sh.sudo raw со специальным ключевым аргументом для ввода пароля суперпользователя, чтобы она работала правильно.

Выполнение sh.contrib.sudo() через менеджер контекста with с вводом пароля через терминал:

import sh with sh.contrib.sudo: print(ls("/root")) # [sudo] password for youruser: ************* # your_root_files.txt 

Или, альтернативно, с помощью подкоманд:

import sh print(sh.contrib.sudo.ls("/root")) # [sudo] password for youruser: ************* # your_root_files.txt 

В приведенном выше примере вызов sh.contrib.sudo автоматически запрашивает пароль, используя под капотом встроенный модуль Python getpass.getpass() .

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

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

Также можно указать пароль к sh.contrib.sudo в виде строки:

import sh password = 'password' with sh.contrib.sudo(password, _with=True): print(ls("/root")) 

Предупреждение. Этот метод менее безопасен, потому что явно указывается пароль в скрипте python, а это плохая идея. Однако он более гибкий, поскольку позволяет получить пароль из другого источника, если конечным результатом является строка.

/etc/sudoers NOPASSWD .

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

Отредактируйте свой файл sudoers :

$ sudo visudo # Добавьте или отредактируйте строку, # описывающую права доступа пользователя: yourusername ALL = (root) NOPASSWD: /path/to/your/program

Добавляемая строка говорит о том, что при вводе команды терминала sudo пользователь yourusername на ВСЕХ ALL хостах сможет работать как (root) , и что не будет запрашиваться пароль NOPASSWD для выполнения /path/to/your/program .

Предупреждение. Этот метод может быть небезопасным, если непривилегированный пользователь сможет редактировать этот сценарий и таким образом поместит что-то плохое в этот сценарий.

Использование необработанной команды sh.sudo (которая преобразуется непосредственно в двоичный файл sudo ) без метода NOPASSWD возможно при условии, если самостоятельно подключить специальный ключевой аргумент. Этот метод обсуждается в основном в образовательных целях. Если вы потратите время на то, чтобы подключить ключевой аргумент к sh.sudo самостоятельно, то вы, по сути, воссоздали sh.contrib.sudo .

import sh # пароль должен заканчиваться новой строкой my_password = "password\n" # `-S` говорит: "получите пароль от `stdin`" # метод `.bake` аналогичен `functools.partial()` my_sudo = sh.sudo.bake("-S", _in=my_password) # вызываем созданную функцию `my_sudo` # с зашитыми в нее параметрами my_sudo.ls("root") 

По сути метод .bake делает то же самое что и functools.partial() .

Использование аргумента _fg=True

Еще один менее очевидный способ использования sudo — выполнить необработанную команду sh.sudo , но также вывести ее на передний план. Таким образом, sudo будет работать правильно, автоматически подключая stdin/out/err и запрашивая пароль, если он требуется. Однако недостатком использования _fg=True является то, что нельзя записать куда либо его вывод — все просто выводится на терминал.

import sh sh.sudo.ls("/root", _fg=True) 
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Передача параметров в команды модуля sh
  • Коды завершения и исключения модуля sh
  • Перенаправление вывода команды модуля sh
  • Фоновое выполнение команды с модулем sh
  • Конвейер в стиле Bash и модуль sh
  • Использование sudo c модулем sh
  • Использование ssh с модулем sh
  • Специальные ключевые аргументы модуля sh
  • Объект запущенной команды модуля sh
  • Класс Command() модуля sh
  • Частые вопросы по модулю sh

Sudo sh c что за команда

sudo -V | -h | -l | -L | -v | -k | -K | -s | [ -H ] [ -P ] [ -S ] [ -b ] | [ -p запрос ] [ -c класс | — ] [ -a тип_аутентификации ] [ -u имя_пользователя / #uid ] команда

ОПИСАНИЕ

sudo позволяет разрешенному пользователю выполнять команду как суперпользователь или другой пользователь, как определено в файле sudoers . Реальный и эффективный uid и gid при этом устанавливаются так, чтобы соответствовать таковым целевого пользователя, как определено в файле passwd (также инициализируется вектор группы, если целевой пользователь — не root). По умолчанию sudo требует, что бы пользователи аутентифицировали себя при помощи пароля (ЗАПОМНИТЕ: это пароль пользователя, не пароль root). Как только пользователь аутентифицировал себя происходит обновление временной метки и пользователь может использовать sudo некоторый период времени без пароля (по умолчанию пять минут, если в sudoers не указано другое).

sudo определяет, кто является авторизованным пользователем сверяясь с файлом /etc/sudoers и всеми файлами с подходящим названием в каталоге /etc/sudo.d . Указав для sudo флаг -v пользователь может обновить временную метку без выполнения команды . Строка приглашения для ввода пароля так же устаревает, если пользователь не введёт пароль в течение 5 минут (если в sudoers не переопределено другое).

Если не указанный в файле sudoers пользователь попытается выполнить при помощи sudo команду, то уполномоченному пользователю будет отправлено почтовое сообщение, как определено во время конфигурации или в файле sudoers (по умолчанию это root). Обратите внимание, что сообщение не будет отправлено, если неавторизованный пользователь пытается выполнить sudo с флагами -l или -v . Это позволяет пользователям определить — разрешено им использовать sudo или нет.

sudo может регистрировать оба типа попыток, успешные и не удачные, (так же как и ошибки) при помощи системного журнала регистрации событий syslog (3), собственного журнала, или с использованием обоих вариантов. По умолчанию sudo регистрирует события через syslog (3), но это можно изменить во время конфигурации или в файле sudoers .

ПАРАМЕТРЫ

sudo акцептирует следующие параметры командной строки: «-V» Параметр -V ( версия ) заставляет sudo показать номер версии и выйти. Если пользователем инициировавшим вызов является root, то параметр -V отобразит список значений по умолчанию с которыми был собран sudo , в том числе локальные сетевые адреса машины. «-l» Параметр -l ( список ) перечислит дозволенные (и запрещенные) команды для пользователя на данной машине. «-L» Параметр -L ( список по умолчанию) отобразит список параметров, которые могут быть установлены в строке Defaults , с кратким описанием каждого. Этот параметр полезен в сочетании с grep (1). «-h» Параметр -h ( помощь ) заставит sudo показать справку об использовании и выйти. «-v» Если указан параметр -v ( идентифицировать ), sudo обновит временную метку пользователя, предложив пользователю, если необходимо, указать пароль. Это продлит срок действия прежнего пароля sudo на следующие 5 минут (или на тот срок, который указан в sudoers ), но не требует при этом выполнения какой-либо команды. «-k» Указание для sudo параметра -k ( уничтожить ) лишает законной силы временную метку пользователя, устанавливая время на начало века. При следующем выполнении sudo потребуется указать пароль. Эта операция не требует указания пароля и была добавлена, чтобы позволить пользователю аннулировать права sudo из файла .logout. «-K» Параметр -K ( уничтожить наверняка) для sudo полностью удаляет временную метку пользователя. Этот параметр тоже не требует указания пароля. «-b» Параметр -b ( фон ) сообщает sudo выполнить заданную команду в фоновом режиме. Если вы используете параметр -b , то вы не сможете использовать контроль над запущенными процессами оболочки для манипуляций командами. «-p» Параметр -p ( приглашение ) позволяет переопределить внешний вид приглашения в систему по умолчанию. Если вид приглашения содержит управляющий символ %u , то %u будет заменен учетным именем пользователя. Аналогично %h может быть заменено на имя компьютера. «-c» Параметр -c ( класс ) заставляет sudo выполнить определенную команду с ограничением ресурсов, свойственным указанному классу пользователя. Параметр класс может быть либо именем класса, указанным в /etc/login.conf, или знаком -. Указание класс с помощью — означает, что команда будет выполнена с учетом прав того пользователя, от имени которого эта команда выполняется. Если параметр класс указывает на текущий класс пользователя, то команда должна быть выполнена от имени root, или команда sudo должна выполняться из оболочки суперпользователя (root). Этот параметр доступен с BSD-классом входа в систему, где sudo был сконфигурирован с параметром —with-logincap. «-а» Параметр -а ( тип аутентификации ) принуждает sudo при идентификации пользователя использовать указанный тип аутентификации, в соответствии с /etc/login.conf. Системный администратор может указать перечень подходящих для sudo методов аутентификации путём добавления в /etc/login.conf записи «auth-sudo». Этот параметр доступен только на системах поддерживающих BSD-тип аутентификации, если sudo был сконфигурирован с параметром —with-bsdauth. «-u» Параметр -u ( пользователь ) вызывает sudo для выполнения указанной команды от имени пользователя, отличного от root . Для указания uid вместо имени пользователя , используйте #uid . «-s» Параметр -s ( оболочка ) запускает командный интерпретатор, определенный переменной окружения SHELL , или оболочку указанную в passwd (5). «-H» Параметр -H ( HOME ) устанавливает значение переменной окружения HOME к домашнему каталогу целевого пользователя (по умолчанию root), определенную в passwd (5). По умолчанию sudo не изменяет HOME . «-Р» Параметр -P ( сохранить вектор группы ) сообщает sudo о необходимости сбережения вектора группы пользователя в неизменном виде. По умолчанию sudo инициализирует групповой вектор к списку групп, к которым принадлежит целевой пользователь. Однако, реальный и эффективный идентификаторы групп назначаются соответствующими целевому пользователю. «-S» Параметр -S ( stdin ) заставляет sudo считывать пароль со стандартного ввода вместо терминала. «—» Флаг — обозначает, что sudo должен прекратить выполнение параметров командной строки. Это полезно в сочетании с флагом -s .

КОДЫ ВОЗВРАТА

В случае успешного выполнения возвращаемым значением sudo будет возвращаемое значение выполненной программы.

В противном случае sudo завершает работу со значением 1, если обнаруживает проблемы в конфигурации/правах доступа или sudo не в состоянии выполнить заданную команду. В последнем случае сообщение об ошибке будет выведено в stderr. Если sudo не в состоянии получить stat (2) на одну или болееe запись в пользовательском PATH, то сообщение об ошибке будет выведено на stderr. (Если каталог не существует или если это на самом деле не каталог, запись о нем будет игнорирована и об ошибке сообщено не будет.) При нормальных обстоятельствах этого не должно произойти. Наиболее частая причина возврата от stat (2) «permission denied», если вы запустили автоматическое монтирование дисков и один из каталогов в вашем PATH находится на машине, которая в настоящий момент не доступна.

ПРИМЕЧАНИЯ ПО БЕЗОПАСНОСТИ

sudo пытается быть безопасной при выполнении внешних команд. Переменные, контролирующие выполнение динамической загрузки и связей, могут быть использованы для уничтожения программ выполняемых sudo . Для борьбы с этим, переменные окружения LD_*, _RLD_*, SHLIB_PATH (только HP-UX) и LIBPATH (только AIX), изъяты из окружения доступного для команд выполняемых всеми. sudo также изымает переменные IFS, ENV, BASH_ENV, KRB_CONF, KRB5_CONFIG, LOCALDOMAIN, RES_OPTIONS, HOSTALIASES, NLSPATH, PATH_LOCALE, TERMINFO, TERMINFO_DIRS И TERMPATH, поскольку они тоже могут представлять угрозу. Если установлена переменная TERMPATH и является именем пути, то она также будет игнорирована. Дополнительно, если переменные LC_* или LANGUAGE содержат символы / или %, то они будут игнорированы. Если sudo було собрано с поддержкой SecurID, то переменные VAR_ACE, USR_ACE и DLC_ACE будут также очищены. Список переменных, подлежащих очистке со стороны sudo , может быть распечатан в вывод команды sudo -V, выполненной от имени суперпользователя (root).

Во избежание подмены команд sudo проверяет «.» и «» (оба указывают на текущий каталог), когда осуществляет поиск команды в пользовательском PATH (если один из них есть в PATH) в последнюю очередь. Однако, обратите внимание, что фактическая переменная окружения PATH не модифицирована и передается программе, выполняемой sudo , в неизмененном виде.

Из соображений безопасности, если ваша ОС поддерживает разделяемые библиотеки и не отключает пользовательский путь поиска для программ использующих setuid (чаще всего), вы должны использовать параметры линковщика которые исключают такую возможность или линкуют sudo статически.

sudo проверяет принадлежность каталога содержащего временные метки (по умолчанию это /var/run/sudo ) и игнорирует каталоги с содержимым не принадлежащим root и доступным на запись только для root. В системах, позволяющих не привилегированным пользователям передавать права на файлы через chown (2), если временная метка находится в каталоге доступном для записи для всех (т.е.: /tmp ), то возможна ситуация, когда пользователь создаст каталог каталог содержащий временную метку прежде, чем будет выполнено sudo . Однако, так как sudo проверяет права владения и режим доступа каталога и его содержимого, то вред может быть нанесён только «скрытыми» файлами, помещенными в каталог с временными метками. Это вряд ли случится в том случае, если владельцем каталогов с временными метками является суперпользователь и они не доступны для других пользователей для записи в них. Что бы обойти эту проблему вы можете использовать каталог для хранения временных меток (например /var/adm/sudo ), никому не доступный для записи, или создать /var/run/sudo , с соответствующими владельцем (root) и правами доступа (0700) в системных файлах запуска.

sudo игнорирует временные метки с датой создания в далеком будущем. Временные метки с датой большей, чем настоящий момент времени + 2 * TIMEOUT будут игнорироваться, регистрироваться sudo и уполномоченному пользователю будет послано предупреждение. Это сделано во избежание создания временных меток с поддельными датами, которые позволят отдавать файлы пользователям.

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

EXAMPLES

Внимание: следующие примеры содержат работающие записи sudoers (5).

Для получения списка файлов в каталоге закрытом для чтения:

sudo ls /usr/local/protected

Для получения списка файлов домашнего каталога пользователя yazza на машине, где файловая система, содержащая ~yazza не позиционируется как корневая:

sudo -u yazza ls ~yazza

Для редактирования файла index.html как пользователь www:

sudo -u www vi ~www/htdocs/index.html

Для выключения компьютера:

sudo shutdown -r +15 «quick reboot»

Для создания списка занимаемого каталогами места в партиции /home. Обратите внимание, что это выполняется в под-оболочке (sub-shell) для выполнения cd и переадресации файла.

sudo sh -c «cd /home ; du -s * | sort -rn > USAGE»

ПЕРЕМЕННЫЕ

sudo использует следующие системные переменные:

PATH Установленную в нормальное значение, если установлен SECURE_PATH. SHELL Используется для указания оболочки для запуска с параметром -s. USER Устанавливается к целевому пользователю (root, если параметром -u не определено другое). HOME В варианте -s или -H (или если sudo было сконфигурировано с
параметром —enable-shell-sets-home) указывает на домашний каталог целевого пользователя.
SUDO_PROMPT Используется как заданная по умолчанию подсказка пароля. SUDO_COMMAND Установлено на команды, выполняемые sudo. SUDO_USER Установлено на вход в систему пользователя, которому разрешено
вызывать sudo. SUDO_UID Установлено на uid пользователя, которому разрешено вызывать sudo. SUDO_GID Установлено на gid пользователя, кто вызвал sudo. SUDO_PS1 Если установлено, PS1 будет установлен на это значение.

ФАЙЛЫ

/etc/sudoers /etc/sudo.d/* Описание того, кто и какие команды может выполнять /var/run/sudo Каталог содержащий временные метки

АВТОРЫ

Многие люди годами работали над sudo . Эта версия содержит код написанного преде всего:

Todd Miller
Chris Jepeway

Краткую историю sudo смотри в файле HISTORY в дистрибутиве или в интернете по адресу http://www.sudo.ws/sudo/history.html.

Александр Блохин — перевод на русский язык.

ОШИБКИ

Если вам кажется, что вы нашли ошибку в sudo, то отправьте рапорт об ошибке по адресу: http://www.courtesan.com/sudo/bugs/

ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ

Sudo поставляется «КАК ЕСТЬ’ и любые явные или неявные гарантии, включая, но не ограничиваясь неявными гарантиями, коммерческой ценности и пригодности для конкретной цели отрицаются. Подробности смотри в файле LICENSE, поставляемом вместе с sudo .

ПРЕДОСТЕРЕЖЕНИЕ

Не существует никакого простого способа предотвратить захват пользователем оболочки с правами суперпользователя (root), если он имеет доступ к командам оболочки.

Если пользователь имеет sudo ALL, то ничто не остановит его от создании собственной программы, которая даст ему оболочку привилегированного пользователя (root), не смотря ни на какие элементы ! в спецификации пользователя.

Выполнение сценариев оболочки через sudo может вызвать те же самые ошибки ядра, которые делают сценарии оболочки со сменой идентификатора пользователя опасными на некоторых операционных системах (если ваша ОС поддерживает каталог/dev/fd/, сценарии оболочки со сменой идентификатора пользователя в целом безопасны).

Команда sudo в Linux

Монитор Dell UltraSharp U4025QW поддерживает Thunderbolt 4 и частоту обновления 120 Гц

Favorite

Добавить в избранное

Команда sudo в Linux

Команда sudo позволяет запускать программы от имени другого пользователя, по умолчанию пользователь root. Если вы проводите много времени в командной строке, sudo — одна из команд, которую вы будете использовать довольно часто.

Использование sudo вместо входа в систему в качестве пользователя root более безопасно, поскольку вы можете предоставлять ограниченные административные привилегии отдельным пользователям, не зная пароля root.

В этой статье мы объясним, как использовать команду sudo.

Установка Sudo (sudo command not found)

Пакет sudo предустановлен в большинстве дистрибутивов Linux.

Чтобы проверить, установлен ли пакет sudo в вашей системе, откройте консоль, введите sudoи нажмите Enter. Если у вас установлен sudo, система отобразит краткое справочное сообщение, в противном случае вы увидите что-то вроде sudo command not found.

Если sudo не установлен, вы можете легко установить его с помощью менеджера пакетов вашего дистрибутива.

Установите Sudo на Ubuntu и Debian

apt install sudo

Установите Sudo на CentOS и Fedora

yum install sudo

Добавление пользователя в Sudoers

По умолчанию в большинстве дистрибутивов Linux предоставление доступа к sudo так же просто, как добавление пользователя в группу sudo, определенную в файл sudoers. Члены этой группы смогут запускать любую команду от имени пользователя root. Название группы может отличаться от рассылки к рассылке.

В дистрибутивах на основе RedHat, таких как CentOS и Fedora, имя группы sudo wheel. Чтобы добавить пользователя в группу, выполните:

usermod -aG wheel username

В Debian, Ubuntu и их производных членам группы sudo предоставляется доступ sudo:

usermod -aG sudo username

Учетная запись суперпользователя в Ubuntu по умолчанию отключен по соображениям безопасности и пользователям рекомендуется выполнить системную задачу администрирования с использованием Sudo. Первоначальный пользователь, созданный установщиком Ubuntu, уже является членом группы sudo, поэтому, если вы работаете в Ubuntu, есть вероятность, что пользователь, вошедший в систему, уже получил права sudo.

Если вы хотите разрешить определенному пользователю запускать только определенные программы как sudo, вместо добавления пользователя в группу sudo добавьте пользователей в файл sudoers.

Например, чтобы позволить пользователю andreyex запускать только команду mkdir с sudo, введите:

sudo visudo

и добавьте следующую строку:

andreyex ALL=/bin/mkdir

В большинстве систем команда visudo открывает файл /etc/sudoers в текстовом редакторе vim. Если у вас нет опыта работы с vim, проверьте нашу статью о том, как сохранить файл и выйти из редактора vim.

Вы также можете разрешить пользователям запускать команды sudo без аутентификации:

andreyex ALL=(ALL) NOPASSWD: ALL

Как использовать sudo

Синтаксис sudoкоманды следующий:

sudo OPTION.. COMMAND

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

Чтобы использовать sudo, просто добавьте к команде префикс sudo:

sudo command

Где command — команда, для которой вы хотите использовать sudo.

Sudo прочитает файл /etc/sudoers и проверит, предоставляется ли пользователю, вызывающему программу, с помощью команды sudo. При первом использовании sudo в сеансе вам будет предложено ввести пароль пользователя, и команда будет выполнена от имени пользователя root.

Например, чтобы перечислить все файлы в каталоге /root, вы бы использовали:

sudo ls /root
[sudo] password for andreyex: . .. .bashrc .cache .config .local .profile

Тайм-аут пароля

По умолчанию sudo попросит вас ввести пароль еще раз через пять минут бездействия sudo. Вы можете изменить время ожидания по умолчанию, отредактировав файл sudoers. Откройте файл с помощью visudo:

sudo visudo

Установите время ожидания по умолчанию, добавив строку ниже, где 10 время ожидания указано в минутах:

Defaults timestamp_timeout=10

Если вы хотите изменить метку времени только для конкретного пользователя, добавьте следующую строку, где user_name — это рассматриваемый пользователь.

Defaults:user_name timestamp_timeout=10

Запустите команду как пользователь, отличный от Root

Существует неправильное восприятие, sudo которое используется только для предоставления полномочий root обычному пользователю. На самом деле, вы можете использовать sudo для запуска команды, как любой пользователь.

Опция -u позволяет выполнить команду в качестве указанного пользователя.

В следующем примере мы используем sudo для запуска команды whoami от имени пользователя «destroyer»:

sudo -u destroyer whoami

Команда whoami выведет имя пользователя, запустившего команду:

destroyer

Как перенаправить с Sudo

Если вы попытаетесь перенаправить вывод команды в файл, у которого у пользователя нет прав на запись, вы получите ошибку “Permission denied”.

sudo echo "test" > /root/file.txt
bash: /root/file.txt: Permission denied

Это происходит потому, что перенаправление >вывода выполняется под пользователем, в котором вы вошли, а не пользователем, указанным в sudo. Перенаправление происходит до вызова команды sudo.

Одним из решений является вызов новой оболочки от имени пользователя root с помощью sudo sh -c:

sudo sh -c 'echo "test" > /root/file.txt'

Другой вариант — передать вывод как обычный пользователь в команду tee, как показано ниже:

echo "test" | sudo tee /root/file.txt

Заключение

Вы узнали, как использовать команду sudo и как создавать новых пользователей с привилегиями sudo.

Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Sudo — Основы командной строки

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

  • Установка новых программ
  • Навигация по чужим директориям
  • Изменение прав доступа
  • Изменение содержимого в файлах, не принадлежащих текущему пользователю
  • Создание, редактирование и удаление файлов, когда не хватает прав текущего пользователя
  • Запуск программ, требующих повышенных привилегий

В этом уроке обсудим, как стать другим пользователем. Для этого зайдите в систему и воспользуйтесь утилитой su (сокращение от substitute user или switch user). Когда-то такой способ был основным, но сейчас он устарел и не рекомендуется к использованию. Подробнее об этом можно прочитать в статье «Su или sudo?» из дополнительных материалов.

Основной способ повышать привилегии в современных системах — утилита sudo (substitute user and do — дословно «подменить пользователя и выполнить»).

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

# Нет прав на выполнение touch /etc/myfile touch: cannot touch '/etc/myfile': Permission denied # С `sudo` все работает sudo touch /etc/myfile # Видно, что владелец файла — это суперпользователь `root` stat /etc/myfile File: '/etc/myfile' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: ca01h/51713d Inode: 2761 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) # Нет прав на удаление rm /etc/myfile rm: remove write-protected regular empty file '/etc/myfile'? y rm: cannot remove '/etc/myfile': Permission denied # Опять помогла утилита `sudo` sudo rm /etc/myfile 

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

Иногда нужно выполнить команду из-под пользователя, отличного от root . Тогда придется добавить флаг -u :

sudo -u nobody mkdir /tmp/test # Директория создана от имени пользователя nobody stat /tmp/test File: '/tmp/test' Size: 4096 Blocks: 8 IO Block: 4096 directory Device: ca01h/51713d Inode: 4577 Links: 2 Access: (0755/drwxr-xr-x) Uid: (65534/ nobody) Gid: (65534/ nogroup) 

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

# Команда `sudo` запросит пароль текущего пользователя sudo -i # Проверяем, что сессия запущена от суперпользователя id uid=0(root) gid=0(root) groups=0(root) 

Главное — не забыть переключиться обратно после завершения необходимых манипуляций. Для этого наберите exit .

Подводные камни

Знание про sudo играет с новичками злую шутку. Каждый раз, когда они видят странные ошибки, то не пытаются разобраться, а пробуют запустить команду с sudo без параметров — то есть просто выполнить ее от суперпользователя. Часто такой подход срабатывает, но он создает еще больше проблем.

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

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

Общее правило может быть таким:

  • Все, что лежит в личных директориях пользователя, должно принадлежать этому пользователю
  • Все, что находится вне домашней директории пользователя и требует дополнительных прав, скорее должно запускаться с sudo , но бывают и исключения

Рассмотрим, как это работает на практике:

ls -la # Все содержимое домашней директории принадлежит одному пользователю # Сама директория пользователя принадлежит ему же # Родительская директория принадлежит суперпользователю drwxr-xr-x+ 117 mokevnin staff 3744 Feb 19 15:55 . drwxr-xr-x 5 root admin 160 Oct 12 19:15 .. -r-------- 1 mokevnin staff 7 Nov 21 2017 .CFUserTextEncoding -rw-r--r--@ 1 mokevnin staff 22532 Feb 8 00:04 .DS_Store 
Дополнительные материалы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *