Содержание статьи

Переключение между учётными записями в терминале – базовая, но критически важная операция для системного администрирования и работы с многопользовательскими системами. В Linux и Unix-подобных ОС для этого используются команды su и sudo, каждая из которых решает разные задачи. su (substitute user) позволяет полностью сменить контекст пользователя, включая переменные окружения и домашний каталог, тогда как sudo выполняет отдельные команды от имени другого пользователя без полного переключения сессии.
По умолчанию su запрашивает пароль целевого пользователя, а не текущего. Если целевой пользователь – root, пароль может не требоваться при наличии соответствующих прав в /etc/sudoers. Пример переключения на пользователя alex: su - alex. Флаг — (или -l) гарантирует загрузку профиля целевого пользователя, включая переменные PATH и HOME. Без него останутся переменные окружения текущего пользователя, что может привести к ошибкам в работе скриптов.
sudo удобнее для разовых операций, так как не требует знания пароля целевого пользователя. Например, выполнение команды от имени root: sudo -u root apt update. Для переключения на другого пользователя без прав root используйте sudo -u username command. Важно: sudo работает только для пользователей, перечисленных в /etc/sudoers, и требует настройки через visudo. Ошибки в этом файле могут заблокировать доступ к системе.
В Windows переключение пользователя в командной строке реализовано через runas. Синтаксис: runas /user:username "command". Например, запуск PowerShell от имени администратора: runas /user:Administrator "powershell". Для работы runas требуется ввод пароля целевого пользователя. Альтернатива – PsExec из пакета Sysinternals, позволяющий запускать процессы от имени другого пользователя без интерактивного ввода пароля: psexec -u username -p password cmd.
Выбор команды для смены пользователя в Linux и Windows

В Linux основной инструмент для смены пользователя – su (substitute user). Команда требует пароль целевого пользователя, если у текущего нет прав sudo. Синтаксис: su - username, где дефис обеспечивает загрузку окружения целевого пользователя. Для переключения на root достаточно su -. Важно: su не сохраняет переменные окружения по умолчанию, если не указан флаг -.
Альтернатива su – sudo -i или sudo -u username. Эти команды используют механизм sudo, позволяя выполнять действия от имени другого пользователя без знания его пароля, если текущий пользователь внесён в файл /etc/sudoers. Пример: sudo -u postgres psql запустит PostgreSQL от имени пользователя postgres. Преимущество – логирование действий в /var/log/auth.log.
В Windows смена пользователя через командную строку реализована иначе. Команда runas позволяет запускать процессы от имени другого пользователя: runas /user:username "command". Требует ввода пароля в интерактивном режиме. Для автоматизации используйте /savecred, но это снижает безопасность, так как пароль сохраняется в Windows Credential Manager. Пример: runas /user:admin "cmd.exe" откроет новую консоль с правами admin.
В PowerShell аналогом runas служит Start-Process -Credential. Синтаксис: Start-Process powershell -Credential username. После ввода пароля откроется новый процесс PowerShell с правами указанного пользователя. Для скриптов удобно использовать Get-Credential для безопасного ввода учётных данных. Пример: $cred = Get-Credential; Start-Process notepad -Credential $cred.
В Linux для временного повышения прав без полной смены пользователя применяйте sudo. Команда sudo -s открывает оболочку с правами root, сохраняя текущее окружение. Для выполнения конкретной команды: sudo command. Ограничения задаются в /etc/sudoers через директивы username ALL=(target_user) command. Например, alice ALL=(root) /usr/bin/apt разрешит пользователю alice запускать только apt от root.
В Windows Server 2012+ и Windows 10/11 доступна команда psexec из Sysinternals Suite. Она позволяет запускать процессы на локальной или удалённой машине от имени другого пользователя: psexec -u username -p password cmd.exe. Без флага -p пароль запрашивается интерактивно. Важно: psexec передаёт пароли в открытом виде, если не используется шифрование (флаг -e). Для удалённого выполнения: psexec \.
emote_pc -u domain\user cmd
При выборе команды учитывайте контекст. В Linux sudo предпочтительнее su для разовых операций из-за гибкости и аудита. В Windows runas подходит для локальных задач, а psexec – для администрирования домена. Для скриптов PowerShell используйте Start-Process -Credential с хранением паролей в зашифрованных файлах. Избегайте хардкодинга учётных данных – применяйте Export-Clixml для безопасного хранения.
Переключение на root-пользователя с помощью sudo и su

В Linux-системах переключение на учётную запись root выполняется двумя основными командами: sudo и su. Разница между ними критична для безопасности и удобства администрирования. sudo позволяет выполнять команды от имени root с временными привилегиями, запрашивая пароль текущего пользователя, тогда как su требует пароль root и полностью переключает сессию на суперпользователя.
Для использования sudo пользователь должен быть добавлен в группу sudo или wheel (в зависимости от дистрибутива). Проверить членство можно командой groups. Если пользователь отсутствует в нужной группе, добавьте его через usermod -aG sudo username (Debian/Ubuntu) или usermod -aG wheel username (RHEL/CentOS). После этого выполните sudo -i или sudo su - для перехода в root-сессию.
| Команда | Описание | Требования |
|---|---|---|
sudo -i |
Запускает интерактивную root-сессию с переменными окружения root | Пользователь в группе sudo/wheel, пароль пользователя |
sudo su - |
Аналог sudo -i, но через su |
То же, что и выше |
su - |
Полное переключение на root с его окружением | Пароль root |
sudo command |
Выполнение одной команды от root без переключения сессии | Пользователь в группе sudo/wheel |
При работе с su важно помнить, что пароль root должен быть установлен. Если он не задан (например, в Ubuntu по умолчанию), используйте sudo passwd root для его установки. Однако в большинстве современных дистрибутивов рекомендуется избегать постоянного использования root-аккаунта, отдавая предпочтение sudo для минимизации рисков безопасности.
Для выхода из root-сессии используйте exit или комбинацию Ctrl+D. При частом переключении на root удобно настроить алиасы в ~/.bashrc:
alias rootme='sudo -i' alias rootexit='exit'
Это сократит время на ввод команд и снизит вероятность ошибок.
В системах с SELinux или AppArmor переключение на root может потребовать дополнительных разрешений. Например, в RHEL с включённым SELinux команда sudo -i может завершиться ошибкой, если контекст безопасности пользователя не соответствует политике. В таких случаях проверьте логи journalctl -xe и при необходимости скорректируйте политики с помощью setsebool или chcon.
Смена пользователя с сохранением текущей среды окружения
В Linux команда sudo -E -u username позволяет переключиться на другого пользователя, сохранив переменные окружения текущего сеанса. Ключ -E (или --preserve-env) передаёт все переменные, включая PATH, HOME и пользовательские настройки, что критично для корректной работы скриптов или приложений, зависящих от окружения. Без этого флага система сбросит переменные к значениям по умолчанию для целевого пользователя, что может нарушить выполнение задач.
Для выборочного сохранения отдельных переменных используйте sudo -E -u username env VAR1=value1 VAR2=value2. Это полезно, когда требуется передать только специфические параметры, например, EDITOR или LANG, избегая утечек конфиденциальных данных. Пример: sudo -E -u postgres env PGDATA=/custom/path psql – здесь сохраняется только путь к данным PostgreSQL, а остальные переменные сбрасываются.
В системах с su альтернативой служит su - username -c "command" -p, где флаг -p (или --preserve-environment) выполняет аналогичную функцию. Однако su требует пароля целевого пользователя, в отличие от sudo, где достаточно прав администратора. Важно: su не поддерживает частичное сохранение переменных – только полное или никакое.
При работе с Docker контейнеры часто запускают от имени непривилегированных пользователей, но с сохранением хостового окружения. Команда docker exec -it --env-file env.list container_name su - user -p позволяет передать переменные из файла env.list, избегая ручного копирования. Это ускоряет отладку и деплой, особенно в CI/CD пайплайнах, где окружение динамически генерируется.
Для постоянного сохранения окружения при переключении пользователей добавьте в /etc/sudoers строку Defaults env_keep += "VAR1 VAR2" через visudo. Это гарантирует, что указанные переменные будут передаваться всегда, даже если пользователь забудет флаг -E. Пример: Defaults env_keep += "AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY" – критично для облачных инструментов, где учётные данные не должны сбрасываться.
Использование параметров для автоматического ввода пароля

Команда sudo поддерживает параметр -S, позволяющий передавать пароль через стандартный ввод. Это полезно в сценариях автоматизации, где ручной ввод недопустим. Пример: echo "пароль" | sudo -S apt update. Однако хранение пароля в открытом виде в скриптах – уязвимость, поэтому метод применим только в доверенных средах.
Для su автоматический ввод пароля реализуется через echo и конвейер: echo "пароль" | su - username. Работает не во всех дистрибутивах из-за ограничений PAM (Pluggable Authentication Modules). В Debian и Ubuntu требуется предварительно отключить проверку PAM для su в /etc/pam.d/su, закомментировав строку auth required pam_wheel.so.
Инструмент expect решает проблему интерактивного ввода пароля в скриптах. Пример скрипта для переключения пользователя:
#!/usr/bin/expect -f spawn su - username expect "Password:" send "пароль " interact
Установите expect командой sudo apt install expect (Debian/Ubuntu) или sudo yum install expect (RHEL/CentOS). Скрипт запускается с правами текущего пользователя, но передаёт пароль целевому аккаунту.
В системах с sshpass можно автоматизировать переключение через SSH: sshpass -p "пароль" ssh username@localhost. Утилита игнорирует предупреждения SSH о небезопасности передачи пароля в аргументах. Установите её через пакетный менеджер: sudo apt install sshpass. Метод уязвим к перехвату пароля через ps aux, поэтому используйте только в изолированных сетях.
Для безопасного хранения паролей применяйте pass или gpg. Пример с pass: pass show user/password | sudo -S command. Пароли шифруются GPG-ключом, а доступ к ним ограничивается правами пользователя. Установите pass командой sudo apt install pass и инициализируйте хранилище: pass init "ваш@gpg.id".
В корпоративных средах используйте sudo с файлом /etc/sudoers. Добавьте строку: username ALL=(ALL) NOPASSWD: ALL, чтобы разрешить выполнение команд без пароля. Редактируйте файл только через visudo, чтобы избежать синтаксических ошибок. Метод применим для сервисных аккаунтов, но не для интерактивных пользователей.
Для Docker-контейнеров передавайте пароль через переменные окружения: docker exec -e PASSWORD="пароль" container_name su - username. Внутри контейнера используйте echo $PASSWORD | su - username. Переменные окружения видны в docker inspect, поэтому применяйте только временные контейнеры или шифруйте данные.
В системах с systemd создайте юнит-файл с параметром Environment для передачи пароля сервису. Пример:
[Service] Environment="PASSWORD=пароль" ExecStart=/usr/bin/bash -c 'echo $PASSWORD | sudo -S command'
Запустите сервис командой systemctl start service_name. Пароль будет доступен только процессу сервиса, но не пользователям системы. Для повышения безопасности используйте systemd-creds (доступно в systemd v250+).
Обработка ошибок доступа при переключении учётных записей

Переключение пользователей через su или sudo часто завершается ошибками доступа из-за неверных прав или настроек безопасности. Наиболее распространённые коды ошибок: su: Authentication failure, sudo: no tty present and no askpass program specified и Permission denied (publickey). Первая возникает при неверном пароле или заблокированной учётной записи, вторая – при отсутствии терминала для ввода пароля, третья характерна для SSH-переключений с использованием ключей.
Для диагностики проверьте:
- Права на выполнение
sudo:sudo -l -U usernameпокажет разрешенные команды. - Журналы аутентификации:
journalctl -u sshd | grep "Failed password"для SSH илиgrep "authentication failure" /var/log/auth.logна Debian-подобных системах.
При ошибке no tty present добавьте в /etc/sudoers строку Defaults:username !requiretty или используйте sudo -S для чтения пароля из stdin. Если проблема в SSH, убедитесь, что в ~/.ssh/authorized_keys корректно указаны публичные ключи, а права на файл и каталог установлены как 600 и 700 соответственно. Для su проверьте, что пользователь не входит в группу nologin или /etc/passwd не содержит /sbin/nologin в качестве оболочки.
В корпоративных средах с PAM-модулями ошибки доступа могут возникать из-за политик паролей или ограничений по времени. Пример: модуль pam_faillock блокирует учётную запись после нескольких неудачных попыток. Разблокировка выполняется командой faillock --user username --reset. Для диагностики PAM-ошибок используйте pam-auth-update или проверьте конфигурацию в /etc/pam.d/, особенно файлы common-auth и sudo.
Если переключение через su работает, а через sudo – нет, сравните группы пользователей: groups username. Убедитесь, что пользователь включён в группу sudo (Debian) или wheel (RHEL). При использовании LDAP или Active Directory проверьте синхронизацию групп с помощью id username и наличие правил в /etc/sudoers.d/. Для временного обхода ограничений используйте sudo -i -u username с паролем root, но избегайте этого в продакшене – вместо этого исправьте базовую конфигурацию.
Создание скриптов для быстрого переключения между пользователями
Автоматизация переключения между учётными записями сокращает время на рутинные операции. В Linux для этого используют скрипты на Bash, которые вызывают команду su или sudo -u с заранее заданными параметрами. Пример минимального скрипта:
#!/bin/bashsudo -u username -i
Сохраните файл с расширением .sh, дайте права на выполнение (chmod +x script.sh) и запускайте через ./script.sh. Для Windows аналогичный эффект достигается через PowerShell-скрипты с командой Start-Process -Credential (Get-Credential) -FilePath "cmd.exe", но требует ввода пароля при каждом запуске.
Для ускорения работы добавьте скрипты в переменную PATH или создайте алиасы в ~/.bashrc (Linux) или $PROFILE (PowerShell). Пример алиаса для переключения на пользователя dev:
alias switch-dev='sudo -u dev -i'- Создайте файл
/usr/local/bin/switch-dev: #!/bin/bashexport EDITOR=nanosudo -u dev -i "$@"youruser ALL=(dev) NOPASSWD: /bin/bash
После добавления выполните source ~/.bashrc для применения изменений. В PowerShell аналогично: Set-Alias -Name switch-dev -Value {Start-Process -Credential dev -FilePath "pwsh.exe"}. Учтите, что алиасы не сохраняют пароли – для этого используйте sudoers (Linux) или SecureString (PowerShell).
Для сложных сценариев, где требуется переключение с передачей переменных окружения или запуском специфичных команд, расширьте скрипт. Пример для Linux с передачей переменной EDITOR:
Параметр "$@" передаёт все аргументы, переданные скрипту. В Windows используйте Start-Process с параметром -ArgumentList для аналогичного поведения.
Безопасность критична при автоматизации переключения пользователей. В Linux избегайте хранения паролей в скриптах – вместо этого настройте sudoers для беспарольного доступа к конкретным командам. Пример записи в /etc/sudoers:
В Windows используйте Export-Clixml для шифрования учётных данных, но помните, что они привязаны к текущему пользователю и машине. Для корпоративных сред рассмотрите интеграцию с Active Directory и RunAs с сохранёнными учётными данными через cmdkey.
