Запуск команди без успадкування батьківського оточення


11

Чи є спосіб запустити команду "так, ніби" це в новому сеансі входу?

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

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

Найближче до мене - рішення гетто: ssh me@localhost "some command"


Використовуйте /bin/bash --loginдля отримання такої поведінки. Я використовую його, наприклад, щоб отримати належний $PATH.
Даніель Бек

Це еквівалент /bin/bash --l, який я вже спробував. Він копіює оригінальне середовище. Спробуйте: export SOME_VAL=something. Потім /bin/bash --login. Потім env | grep SOME_VAL. Значення буде там.
dgo.a

Відповіді:


7

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

Дякую, Елліотт Це виглядає так просто і очевидно ... тепер, коли на мене це вказали.
dgo.a

12
su -l $USER

sudo -u $USER -i

Для чогось навіть більш агресивного спробуйте env -i bash, але це скасовує все, включаючи $ HOME та $ TERM.


2
Дякую! Друга команда дає мені саме те, що я хочу. Я шукав більше 2 годин і не знайшов нічого близького до вашої відповіді. На основі вашої відповіді я повернувся до man sudoі виявив: "якщо цільовий користувач такий, як користувач, який викликає, не потрібно вводити пароль". ( suЗдається, завжди просить пароль.) Я такий дурень, що у першому абзаці manсторінки пропустив щось таке просте :( Я уникав судо в першу чергу, тому що вважав, що завжди запитував пароль. Спасибі знову!
dgo.a

1
лише підказка для інших ... якщо ви увійдете в систему, як $USERвам потрібно буде увійти як root, а потім sudo -u ...як ваш користувач. Якщо ви просто зробите, sudo -uяк користувач, ви отримаєте спадщину.
Адам Гент

це не працює, очевидно, якщо у вас немає sudoдоступу. Чи існує альтернативний метод, який не вимагає судо?
користувач5359531

@ user5359531: Так - su -l $USER.
grawity

1
що запитує пароль; Я входжу через аутентифікацію ключа ssh, тому навіть не знаю, що таке пароль. І підказка пароля знищить вміння сценарію. Поки що його вигляд ssh $USER@localhost <command>працює як краще
user5359531
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.