Ось відповідь, яка не вимагає привілеїв 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
.