Uruchomienie polecenia bez dziedziczenia środowiska rodzica

14

Czy istnieje sposób na uruchomienie polecenia „tak, jakby” odbywało się ono w nowej sesji logowania?

Już próbowałem env -i. Nie chcę jednak radzić sobie z różnymi zmiennymi ENV, które muszę ustawić lub wyłączyć.

Próbowałem również bash -c "some command"i bash -l -c "some commmand", ale wszystkie one kopiują obecne środowisko.

Najbliższe, jakie przyszedłem, to rozwiązanie w getcie: ssh me@localhost "some command"

dgo.a
źródło
Użyj, /bin/bash --loginaby uzyskać takie zachowanie. Używam go np. Do uzyskania właściwego $PATH.
Daniel Beck
Jest to odpowiednik tego /bin/bash --l, co już próbowałem. Kopiuje oryginalne środowisko. Wypróbuj: export SOME_VAL=something. Potem /bin/bash --login. Potem env | grep SOME_VAL. Wartość będzie tam.
dgo.a

Odpowiedzi:

12

Oto odpowiedź, która nie wymaga uprawnień sudo ani hasła użytkownika, ale zapewnia środowisko takie, jak na nowym logowaniu.

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

Przykład:

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

Podział na wyjaśnienia:

  1. env -i HOME="$HOME": Czyści środowisko. W -iustanawia pustego środowisku bez zmiennych ogóle . Jest to problematyczne, ponieważ oznacza, że ​​próba naiwnego uruchomienia bash -lnie spowoduje załadowania .bash_profileitp., Ponieważ HOMEnie jest ustawiona. Aby temu zaradzić, jawnie przechodzimy HOME="$HOME", tworząc środowisko, w którym ustawiono HOME(i tylko HOME).

  2. bash -l -c ...: Uruchamia żądane polecenie w powłoce logowania. Będziesz potrzebował do tego powłoki logowania, ponieważ zaczynamy od czystego środowiska i musimy przeładować wszystko.

Szczególnie:

  • Nie wymaga to uprawnień sudo ( sudowersja tak).
  • Nie wymaga to wpisania hasła użytkownika ( suwersja tak).
  • Nie wymaga to uruchomienia serwera SSH i posiadania klucza bez hasła, którego można użyć do ponownego zalogowania się na maszynie ( sshwersja tak).
Elliott Slaughter
źródło
Dzięki, Elliott. Wygląda tak prosto i oczywisto ... teraz, kiedy mi to wskazano.
dgo.a
12
su -l $USER

sudo -u $USER -i

Dla czegoś jeszcze bardziej agresywnego spróbuj env -i bash, ale to wszystko rozbija, w tym $ HOME i $ TERM.

użytkownik1686
źródło
2
Dzięki! Drugie polecenie daje mi dokładnie to, czego chcę. Szukałem ponad 2 godziny i nie znalazłem nic blisko twojej odpowiedzi. W oparciu o twoją odpowiedź wróciłem do man sudoi stwierdziłem: „jeśli użytkownik docelowy jest taki sam jak użytkownik wywołujący, hasło nie jest wymagane”. ( suWydaje się, że zawsze prosi o hasło.) Jestem takim głupcem, że przeoczyłem coś tak prostego w pierwszym akapicie manstrony :( Unikałem sudo, ponieważ zakładałem, że zawsze prosi o hasło. Dzięki znowu!
dgo.a
1
tylko wskazówka dla innych ... jeśli jesteś zalogowany jako $USERużytkownik root, a następnie sudo -u ...jako użytkownik. Jeśli zrobisz to sudo -ujako użytkownik, odziedziczysz.
Adam Gent
to nie działa, oczywiście, jeśli nie masz sudodostępu. Czy istnieje alternatywna metoda, która nie wymaga sudo?
user5359531
@ user5359531: Tak - su -l $USER.
user1686,
1
który prosi o hasło; Jestem zalogowany za pomocą uwierzytelniania za pomocą klucza ssh, więc nawet nie wiem, jakie jest hasło. A monit o hasło zabije zdolność do obsługi skryptów. Jak na razie wygląda ssh $USER@localhost <command>to lepiej
user5359531