Команда su в Linux: Как стать другим пользователем (даже без пароля)

Команда 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 failure

2. Как переключиться на пользователя без пароля?

Ошибка аутентификации не означает, что переключиться невозможно. Это означает, что стандартный механизм с паролем не подходит. Правильный способ — выполнить команду от имени привилегированного пользователя (обычно root через sudo).

Ключевой прием: Запуск оболочки с помощью -s

Синтаксис для запуска оболочки от имени пользователя без пароля:

sudo su -s /bin/bash <username>

Разберем команду:

  1. sudo: Запрашиваем права суперпользователя.
  2. su: Запускаем команду смены пользователя.
  3. -s /bin/bash: Говорим su запустить интерактивную оболочку bash, а не стандартную оболочку пользователя (которая может быть /bin/false или /usr/sbin/nologin, блокирующая вход).
  4. <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-resolved

4. Типичные проблемы и их решения (Важный раздел!)

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

Проблема:
Вы переключились на 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. Сравнение способов и лучшие практики

СпособКомандаКогда использовать
Стандартный susu [user]Переключение на пользователей с известным паролем.
su с оболочкойsudo su -s /bin/bash [user]Интерактивная работа от имени системных пользователей без пароля.
sudo -u с оболочкойsudo -u [user] /bin/bashБолее правильная альтернатива способу выше.
Запуск командыsudo -u [user] [command]Выполнение одиночных команд в скриптах автоматизации.
Логин с окружениемsudo su - [user]Когда нужно полное окружение целевого пользователя (переменные, PATH).

Лучшие практики безопасности:

  1. Не задавайте пароль системным пользователям. Это важная мера безопасности.
  2. Используйте sudo. Настройте права в /etc/sudoers точечно, вместо того чтобы давать полный доступ к su.
  3. Принцип минимальных привилегий. Спрашивайте себя: "Действительно ли мне нужна полноценная оболочка, или достаточно выполнить одну команду (sudo -u user command)?".

Заключение

Команда su и ее комбинация с sudo — мощный инструмент для администрирования Linux. Теперь вы знаете не только как переключаться на любого пользователя, но и как решать возникающие при этом проблемы.

Как можно отблагодарить:

  • Оформить удобную для вас подписку на Boosty.to
  • Разово поддержать через DonationAlerts
12510login-checkКоманда su в Linux: Как стать другим пользователем (даже без пароля)

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