Обе команды связаны с повышением прав, но делают это по-разному.
📌 Основная идея
su — substitute user ➡️ «заменить пользователя»sudo — substitute user and do ➡️ «выполнить как другой пользователь»⚙️ Как работает su
su переключает вас на другого пользователя внутри текущей сессии. Для этого нужно знать пароль целевой учётки, а не своей.user@dev:/$ su john
Пароль: ****
john@dev:/$ whoami
john
Вы стали Джоном и работаете от его имени.
su без дефиса, как в этом примере, просто меняет пользователя, но оставляет окружение старого. О su - мы еще поговорим.⚙️ Как работает sudo
sudo запускает одну команду от имени другого пользователя (по умолчанию — root). При этом спрашивается ваш пароль, а не пароль того, под кем выполняется команда.user@dev:/$ sudo -u john whoami
john
Чтобы это работало, у пользователя
user должны быть разрешения в /etc/sudoers:user ALL=(ALL:ALL) ALL
Редактируется через
visudo:sudo visudo
Проверить конфигурацию можно так:
sudo visudo -c
💡
visudo защищает от ошибок: если синтаксис неправильный, файл не сохранится.⚙️ su с дефисом
Иногда можно заметить команду
su - john.Зачем дефис?
Он очищает окружение и запускает оболочку, как будто вы вошли в систему под новым пользователем.
Посмотрим на примере:
ssh user@pc
export a="test"
su john
echo $a
# test
Переменная
$a сохранилась.А теперь с дефисом:
su - john
echo $a
# ничего не выводит
Переменные исчезли — новая, "чистая" среда.
📎 Коротко:
su — просто смена пользователя, старое окружение остаётся;su - — полная имитация входа в систему под новым пользователем.⚙️ Аналоги у sudo
sudo тоже может запустить shell с разным уровнем "чистоты" окружения:sudo -s # shell с правами root, окружение текущее
sudo -i # shell как при входе под root (загружается /root/.profile и т.п.)
Если в /root/.profile прописать переменную, то она появится только при
sudo -i.✔️
sudo -i ≈ sudo su -Но писать
sudo su - — дурной тон: запускается лишний процесс, команда громоздкая и вообще не нужная.