Zidentyfikuj użytkownika w skrypcie Bash wywołanym przez sudo

108

Jeśli utworzę skrypt /root/bin/whoami.shzawierający:

#!/bin/bash
whoami

a ten skrypt jest wywoływany przez użytkownika z odpowiednio skonfigurowanym sudo, to wskaże

root

Czy istnieje szybki sposób uzyskania rzeczywistego użytkownika w skrypcie, czy też będę musiał uciekać się do parametrów przekazanych wraz z tą nazwą użytkownika?

quadmore
źródło

Odpowiedzi:

134

$ SUDO_USER nie działa, jeśli używasz sudo su -.
Wymaga również wielu kontroli - jeśli $USER == 'root'to uzyskasz $SUDO_USER.

Zamiast polecenia whoamiużyj who am i. Spowoduje to uruchomienie whopolecenia przefiltrowanego dla bieżącej sesji. Daje ci więcej informacji niż potrzebujesz. Więc zrób to, aby uzyskać tylko użytkownika:

who am i | awk '{print $1}'

Alternatywnie (i prostsze) możesz użyć logname. Robi to samo, co powyższe stwierdzenie.

To daje nazwę użytkownika, który zalogował się do sesji.

Te działają niezależnie od sudolub sudo su [whatever]. Działa również niezależnie od tego, ile razy sui sudosą wywoływane.

evan
źródło
2
Tak, +1 who am ito odpowiedź tutaj.
Joe Kearney
43
Alternatywa dla who am ijest who mom likes. Twój wybór.
wchargin
3
whozwraca dla mnie 2 wiersze, oba zawierają moje imię i nazwisko, i who am inie zwraca żadnego. Jakaś pomoc?
Hosh Sadiq
7
Jestem na Ubuntu 16.04 i polecenie who am inic nie robi, wydaje się proste who, więc who | awk '{print $1}'działa zgodnie z oczekiwaniami;)
daveoncode
1
Na wypadek, gdybyś nie awkzainstalował, możesz również użyć cut: who mom likes | cut -d' ' -f1 lub sedz jakiegoś powodu: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez
56

Myślę, że $ SUDO_USER jest ważny.

#!/bin/bash
echo $SUDO_USER
whoami
Brandon Horsley
źródło
1
Dziwna rzecz: sudo envpokazuje, SUDO_USERale sudo echo $SUDO_USERnic nie drukuje ...
Job
17
praca, to nie jest dziwne, należy się tego spodziewać. w sudo echo $SUDO_USER, bash ocenia $ SUDO_USER przed wykonaniem sudo. wypróbuj skrypt zamieszczony w tym rozwiązaniu, działa.
@quadmore: Jeśli odpowiedź Ci odpowiada, nie zapomnij jej zaakceptować.
Job
2
Możesz także użyć, echo ${SUDO_USER:-$USER}aby złapać zarówno sudobieganie, jak i inne niż sudo. Ale odpowiedź logname evana brzmi łatwiej
Tobias Kienzler,
2
@TobiasKienzler - I jak wskazuje Evan, $SUDO_USERnie działa z sudo su -, ale lognamezawsze działa.
David Harkness,
13

Oto jak uzyskać nazwę użytkownika osoby, która wywołała skrypt, bez względu na to, czy sudo, czy nie:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

lub krótsza wersja

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
Aleksiej Tenitski
źródło
8
jeszcze krócej: user=${SUDO_USER:-$(whoami)}lubuser=$(logname)
Tobias Kienzler,
3

who am i | awk '{print $1}'nie działał dla mnie, ale who|awk '{print $1}'będzie służył tej pracy

Srinivas
źródło
1
Nie na hoście, na którym więcej niż jeden użytkownik ma sesję
Roman Grazhdan
1

Korzystanie whoami, who am i, who, idlub $SUDO_USERnie jest tutaj.

Właściwie whonigdy nie jest rozwiązaniem tego pytania, ponieważ zawiera tylko listę zalogowanych użytkowników, których może być dziesiątki ...

Moim zdaniem jedyną cenną odpowiedzią jest użycie logname.

Mam nadzieję że to pomoże

Obrabować

Obrabować
źródło
0

Jeśli jest to UID, którego szukasz (przydatny do szaleństw dokerów), to działa:

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
źródło