Pobierz zmienną środowiskową innego użytkownika [zamknięte]

23

Czy istnieje sposób, aby zobaczyć zmienną środowiskową innego użytkownika? Chcę to zrobić jako root, więc uprawnienia nie będą stanowić problemu.

Dla samego użytkownika używam echo $PATHlub set | grep PATH(lub setgdy nie pamiętam nazwy zmiennej). Jaka byłaby podobna instrukcja dla innego użytkownika?

Za to, co jest warte, jestem na Ubuntu Server 13.04.


źródło
4
Użytkownicy nie mają zmiennych środowiskowych, procesy mają. Procesy wykonywane przez jednego użytkownika często nie mają tego samego środowiska. Jaki problem próbujesz rozwiązać?
Gilles 'SO- przestań być zły'
@Gilles na przykład chcę wiedzieć, jaki folder MAIL ma użytkownik. Mógłbym zalogować się jako ten użytkownik, a następnie zrobić echo $MAIL, ale pomyślałem, że może istnieć skrót.
3
To wciąż nie definiuje użytecznie pytania (i na przykład zaakceptowana odpowiedź może, ale nie musi działać, w zależności od wielu czynników). Szukasz domyślnej lokalizacji skrzynki pocztowej? Czy szukasz lokalizacji, w której użytkownik faktycznie otrzymuje swoją pocztę lokalną (która może być inna i może nie istnieć, jeśli użytkownik ją posiada .forward)? Użytkownicy często ustawiają kilka zmiennych w swoich .profilelub innych plikach konfiguracyjnych i nie ma sposobu, aby wiarygodnie je wszystkie wyliczyć. Znowu, jaki problem próbujesz rozwiązać?
Gilles 'SO - przestań być zły'

Odpowiedzi:

20

Inną opcją jest użycie env. Uruchom to jako root:

sudo -Hiu $user env | grep $var

Na przykład

sudo -Hiu terdon env | grep HOME
HOME=/home/terdon
terdon
źródło
1
Kiedy loguję się jako root i wykonuję to polecenie dla mojej standardowej nazwy użytkownika, otrzymuję HOME=/root. To jest katalog domowy root, ale to nie jest mój standardowy katalog domowy. Jeśli chcesz poznać środowisko, które uzyskałby dany użytkownik, gdy się zaloguje, musisz uruchomić skrypty startowe powłoki logowania tego konkretnego użytkownika (i pamiętaj, że jego powłoka logowania może różnić się od powłoki logowania).
Uwe
@Uwe w jakim systemie? Działa dla mnie dobrze. Czy masz na myśli, że logujesz się rootz poziomu menedżera logowania? Działa dobrze, jeśli upuszczę do tty i zaloguję się jako root.
terdon
Jestem na maszynie Debiana. Loguję się jako uwe, otwieram xterm, biegam env | grep HOMEi zaczynam HOME=/home/uwe; Wykonuję, sua potem jeszcze raz env | grep HOMEi dostaję HOME=/root, a potem biegam sudo -u uwe env | grep HOMEi wciąż dostaję HOME=/root.
Uwe
@ dziwny. Jestem również na maszynie Debiana (LMDE), zrobiłem dokładnie ten sam proces, który opisałeś (nawet użyłem xtermzamiast mojego zwykłego terminala) i otrzymałem oczekiwany wynik.
terdon
Zgodnie z instrukcją sudoustawia zmienną HOME tylko wtedy, gdy -Hopcja jest obecna lub jeśli /etc/sudoersustawiony jest odpowiedni wpis w . Wygląda na to, że nasze pliki sudoers różnią się. W każdym razie to prawdopodobnie dobry pomysł, aby użyć -Htutaj, a być może również -i.
Uwe
2

W przypadku jednego użytkownika możesz wykonać następujące czynności:

su - <username> -c '. ~/.profile; echo $PATH'

Lista $ PATH wszystkich użytkowników:

for user in $(cat /etc/passwd | awk -F: '{print $1}'); do
  su - $user -c '. ~/.profile; printf "%s\n" "$PATH"'
done

@Camil Staps

. ~/.profilejest to zatem sztuczka, której uczę się od mojej ulubionej osoby, Peteris Krumins. Wyjaśnił sztuczkę tutaj . Może później wersja bash miała budowanie z opcją NON_INTERACTIVE_LOGIN_SHELLS.

Cuonglm
źródło
Dzięki! Bo $PATHto działa również bez . ~/.profile; części - po co to jest?
@CamilStaps Co rozumiesz przez „to działa”? Tak, dostajesz wartość $PATHnawet bez pozyskiwania ~/.profile, ale prawie na pewno nie jest to, czego chcesz (= wartość, którą zobaczyłby ten użytkownik, gdy się zalogował). Nawet pozyskiwanie ~/.profilenie jest w pełni niezawodne, ponieważ użytkownik może użyć powłoki, której plik startowy jest inny niż ~/.profile.
Uwe
@ Uwe mam taką samą wydajność bez, ale wydaje mi się, że to tylko zbieg okoliczności.
Zakładasz, że użytkownik nie używa csh.
glenn jackman
@CamilStaps Pierwsze pytanie dotyczy tego, czy ten konkretny użytkownik ~/.profilew ogóle modyfikuje swoją ŚCIEŻKĘ . Ale w każdym razie zachowanie sudomoże być dość dużo skonfigurowane w /etc/sudoers(patrz moja dyskusja z terdon), więc kiedy nasze systemy zachowują się inaczej, jest to prawdopodobnie spowodowane różnicami w plikach konfiguracyjnych.
Uwe
0

z poziomu root możesz su -do użytkownika, a następnie grep zmienną środowiskową, którą chcesz zobaczyć:

su - <username> -c 'echo $PATH'

Raza
źródło
z jakiegoś powodu to nie działa dla mnie, nawet jeśli polecenie jest wykonywane jako inny użytkownik. Skończyło się na użyciu „env”, więc coś, co runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2działa dobrze dla mnie. Jeśli nie jesteś rootem, musisz poprzedzić komendę za pomocą sudo.
Andrei-Niculae Petre