Ось відповідь, яка не вимагає привілеїв 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
Пояснюючи це для пояснення:
env -i HOME="$HOME": Очищає довкілля. В -iвстановлює порожню середу з яким - або змінними б то ні було . Це проблематично, оскільки це означає, що якщо ви намагаєтеся наївно запустити, bash -lвін не завантажить ваші .bash_profileтощо, тому що HOMEне встановлено. Щоб пом'якшити це, ми явно проходимо HOME="$HOME", створюючи середовище, де HOME(і тільки HOME) встановлено.
bash -l -c ...: Виконує потрібну команду в оболонці для входу. Для цього вам потрібна оболонка для входу, оскільки ми починаємо з чистого середовища та потрібно все перезавантажувати.
Зокрема:
- Для цього не потрібні привілеї sudo (
sudoверсія має).
- Для цього не потрібно вводити пароль користувача (
suверсія має).
- Для цього не потрібен запуск SSH-сервера та ключ без пароля, який можна використовувати для входу в машину (
sshверсія є).
/bin/bash --loginдля отримання такої поведінки. Я використовую його, наприклад, щоб отримати належний$PATH.