11

Есть ли способ выполнить команду "как будто" в новой сессии входа в систему?

Я уже пробовал env -i . Однако я не хочу иметь дело с различными переменными ENV, которые я должен установить или сбросить.

Я также пробовал bash -c "some command" и bash -l -c "some commmand" , но все они копируют текущую среду.

Самое близкое, что я нашел, - это решение гетто: ssh me@localhost "some command"

2 ответа2

12
su -l $USER

sudo -u $USER -i

Для чего-то еще более агрессивного попробуйте env -i bash , но это сбрасывает все, включая $ HOME и $ TERM.

6

Вот ответ, который не требует привилегий sudo или пароля пользователя, но все же обеспечивает среду, подобную той, которую вы получите при новом входе в систему.

env -i HOME="$HOME" bash -l -c 'your_command'

Пример:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

Разбить это для объяснения:

  1. env -i HOME="$HOME": очищает среду. -i устанавливает пустое окружение без каких-либо переменных. Это проблематично, потому что это означает, что если вы попытаетесь наивно запустить bash -l он не загрузит ваш .bash_profile и т.д., Потому что HOME не установлен. Чтобы смягчить это, мы явно передаем HOME="$HOME" , создавая среду, в которой установлен HOME (и только HOME).

  2. bash -l -c ...: запускает нужную команду в оболочке входа в систему. Вам понадобится оболочка для входа, потому что мы начинаем с чистой среды и должны перезагрузить все.

В частности:

  • Это не требует привилегий sudo (версия sudo делает).
  • Это не требует ввода пароля пользователя (версия su делает).
  • Это не требует запуска сервера SSH и наличия ключа без пароля, который можно использовать для входа в систему на компьютере (версия ssh делает это).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .