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?

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.


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

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`

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


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ć


0

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

LOCAL_USER_ID=$(id -u $(logname))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.