Команда su (от Substitute User или Switch User) — это фундаментальный инструмент для любого, кто работает с Linux. Она позволяет сменить текущего пользователя в системе. Но что, если вам нужно переключиться на пользователя, у которого нет пароля, как у системных пользователей www-data или docker? А если после переключения команды падают с ошибками? Эта статья — исчерпывающее руководство по работе с su, sudo и решению сопутствующих проблем.
1. Что такое su и как она работает по умолчанию?
Базовый синтаксис команды прост:
su [опции] [логин_пользователя]- Если не указать логин, команда попытается переключиться на root.
- По умолчанию
suтребует ввести пароль целевого пользователя.
Пример 1: Стандартное использование
# Стать root'ом (запросит пароль root)
$ su
Password: <вводим_пароль_root>
# Стать пользователем 'alice' (запросит пароль alice)
$ su alice
Password: <вводим_пароль_alice>Проблема в том, что у многих системных пользователей (созданных для запуска служб) просто нет пароля. Попытка выполнить su www-data завершится ошибкой.
$ su www-data
Password: <любая_попытка_ввести_пароль>
su: Authentication failure2. Как переключиться на пользователя без пароля?
Ошибка аутентификации не означает, что переключиться невозможно. Это означает, что стандартный механизм с паролем не подходит. Правильный способ — выполнить команду от имени привилегированного пользователя (обычно root через sudo).
Ключевой прием: Запуск оболочки с помощью -s
Синтаксис для запуска оболочки от имени пользователя без пароля:
sudo su -s /bin/bash <username>Разберем команду:
sudo: Запрашиваем права суперпользователя.su: Запускаем команду смены пользователя.-s /bin/bash: Говоримsuзапустить интерактивную оболочку bash, а не стандартную оболочку пользователя (которая может быть/bin/falseили/usr/sbin/nologin, блокирующая вход).<username>: Целевой пользователь.
Пример 2: Стать пользователем www-data для отладки веб-сервера
$ whoami
myuser
$ sudo su -s /bin/bash www-data
$ whoami
www-data
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ pwd
/home/myuser # Обратите внимание, мы остались в старой директории
$ exit # Возвращаемся обратноАльтернатива: Использование sudo -u
Более предпочтительный и "каноничный" способ сделать то же самое:
Пример 3: То же самое, но через sudo -u
sudo -u www-data /bin/bashТеперь вы в интерактивной оболочке с правами и окружением пользователя www-data. Идеально для отладки прав доступа, проверки конфигураций и запуска скриптов.
3. Полезные опции и практические примеры
Имитация логина (- или -l)
Опция -l (или просто -) имитирует полноценный логин: она сбрасывает окружение переменных среды и переходит в домашнюю директорию целевого пользователя.
Пример 4: Логин с полным окружением
# Для root'а
sudo su -
# Для пользователя 'postgres' (у него обычно есть своя оболочка и домашняя директория)
sudo su - postgres
psql --version
exitВыполнение одной команды (-c)
Вам не всегда нужна интерактивная оболочка. Часто требуется выполнить всего одну команду.
Пример 5: Запуск одиночных команд от имени другого пользователя
# Узнать, кто я, не заходя в оболочку
sudo -u www-data whoami
# Проверить конфигурацию Nginx от имени пользователя nginx
sudo -u nginx nginx -t
# Посмотреть, что находится в домашней директории пользователя 'redis'
sudo -u redis ls -la ~
# Перезапустить службу от имени systemd-пользователя (если есть права)
sudo -u systemd-resolve systemctl status systemd-resolved4. Типичные проблемы и их решения (Важный раздел!)
Даже после успешного переключения вы можете столкнуться с ошибками. Самая частая из них — отсутствие прав на запись в домашнюю директорию целевого пользователя.
Проблема:
Вы переключились на www-data, но при попытке отредактировать кронтаб или создать файл получаете ошибку.
$ sudo -u www-data crontab -e
touch: cannot touch '/var/www/.selected_editor': Permission denied
Failed to run:
Cannot create /var/www/.config/mc directory
crontab: "/usr/bin/sensible-editor" exited with status 1Причина:
Пользователь www-data запущен, но его домашняя директория (/var/www/) принадлежит другому пользователю (например, root или вашему пользователю). У www-data нет прав создавать там файлы (.selected_editor, .config, .cache), которые необходимы для работы редакторов и других программ.
Решение 1: Изменить владельца домашней директории (самое правильное)
Дайте пользователю права на его же домашнюю директорию.
sudo chown -R www-data:www-data /var/wwwПосле этого команды вроде crontab -e будут работать. Внимание: Если в /var/www лежат файлы вашего сайта, убедитесь, что это не нарушит работу вашего веб-сервера (обычно это безопасно, так как веб-сервер тоже работает от имени www-data).
Решение 2: Временное переназначение домашней директории (быстрый хак)
Переназначьте переменную HOME на время выполнения команды на директорию, куда пользователь может писать (например, /tmp).
sudo -u www-data HOME=/tmp crontab -eЭто заставит редактор создавать временные файлы в /tmp, а не в /var/www.
Решение 3: Использовать sudoedit для редактирования системных файлов
Вместо того чтобы запускать редактор от имени другого пользователя, можно использовать sudoedit для редактирования файла кронтаба напрямую.
# Найдите, где хранятся crontab'ы пользователей (обычно /var/spool/cron/crontabs/)
sudo ls -la /var/spool/cron/crontabs/
# Отредактируйте файл для www-data
sudoedit /var/spool/cron/crontabs/www-dataДля этого способа нужны соответствующие права sudo.
Другие частые ошибки и решения:
This account is currently not available.
Пользователю назначена неинтерактивная оболочка в/etc/passwd(например,/usr/sbin/nologinили/bin/false). Решение: Используйтеsudo su -s /bin/bash username, чтобы явно указать оболочку.- Команда не найдена (
command not found) в сеансеsu
Окружение PATH не было сброшено. Решение: Используйтеsudo su - usernameдля логина с чистым окружением, где PATH будет установлен правильно из профилей целевого пользователя.
5. Сравнение способов и лучшие практики
| Способ | Команда | Когда использовать |
|---|---|---|
Стандартный su | su [user] | Переключение на пользователей с известным паролем. |
su с оболочкой | sudo su -s /bin/bash [user] | Интерактивная работа от имени системных пользователей без пароля. |
sudo -u с оболочкой | sudo -u [user] /bin/bash | Более правильная альтернатива способу выше. |
| Запуск команды | sudo -u [user] [command] | Выполнение одиночных команд в скриптах автоматизации. |
| Логин с окружением | sudo su - [user] | Когда нужно полное окружение целевого пользователя (переменные, PATH). |
Лучшие практики безопасности:
- Не задавайте пароль системным пользователям. Это важная мера безопасности.
- Используйте
sudo. Настройте права в/etc/sudoersточечно, вместо того чтобы давать полный доступ кsu. - Принцип минимальных привилегий. Спрашивайте себя: "Действительно ли мне нужна полноценная оболочка, или достаточно выполнить одну команду (
sudo -u user command)?".
Заключение
Команда su и ее комбинация с sudo — мощный инструмент для администрирования Linux. Теперь вы знаете не только как переключаться на любого пользователя, но и как решать возникающие при этом проблемы.
Как можно отблагодарить:
- Оформить удобную для вас подписку на Boosty.to
- Разово поддержать через DonationAlerts
