Ситуаций, в которых необходимо повышать привилегии и выполнять команды от имени суперпользователя (root
), довольно много. С некоторыми мы уже столкнулись, с другими познакомимся в следующих уроках:
Стать другим пользователем, находясь прямо в системе, можно с помощью утилиты su (substitute user, switch user). Когда-то такой способ был основным, но сейчас он устарел и крайне не рекомендуется к использованию. Подробнее об этом можно прочитать в статье из дополнительных материалов. Основной способ повышать привилегии в современных системах — утилита 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
спрашивает пароль и запоминает его на 5 минут. На протяжении этого времени вы можете использовать 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 -i
id
uid=0(root) gid=0(root) groups=0(root)
Главное — не забыть переключиться обратно после завершения необходимых манипуляций. Для этого наберите exit
.
Знание про sudo играет с новичками злую шутку. Каждый раз, когда они видят "странные" ошибки, то не пытаются разобраться, а пробуют запустить команду с sudo без параметров, то есть просто выполнить её от суперпользователя. Часто такой подход срабатывает, но он создаёт ещё больше проблем, чем решает.
Запуск команды, которая создаёт файлы и директории из-под sudo, приводит к тому, что владельцем этих файлов становится пользователь root. Фактически все последующие обращения к этому файлу без 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
Вам ответят команда поддержки Хекслета или другие студенты.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт