Frage

Wenn Sie ein Skript über Sudo oder SU ausführen, möchte ich den ursprünglichen Benutzer erhalten. Dies sollte unabhängig von mehreren passieren sudo oder su läuft ineinander und spezifisch sudo su -.

War es hilfreich?

Lösung

Ergebnisse:

Verwenden who am i | awk '{print $1}' ODER logname Da keine anderen Methoden garantiert sind.

Als Selbst angemeldet:

evan> echo $USER
evan
evan> echo $SUDO_USER

evan> echo $LOGNAME
evan
evan> whoami
evan
evan> who am i | awk '{print $1}'
evan
evan> logname
evan
evan>

Normaler sudo:

evan> sudo -s
root> echo $USER
root
root> echo $SUDO_USER
evan
root> echo $LOGNAME
root
root> whoami
root
root> who am i | awk '{print $1}'
evan
root> logname
evan
root>

sudo su -:

evan> sudo su -
[root ]# echo $USER
root
[root ]# echo $SUDO_USER

[root ]# echo $LOGNAME
root
[root ]# whoami
root
[root ]# who am i | awk '{print $1}'
evan
[root ]# logname
evan
[root ]#

sudo su -; Su Tom:

evan> sudo su -
[root ]# su tom
tom$ echo $USER
tom
tom$ echo $SUDO_USER

tom$ echo $LOGNAME
tom
tom$ whoami
tom
tom$ who am i | awk '{print $1}'
evan
tom$ logname
evan
tom$

Andere Tipps

Da ist kein perfekt Antworten. Wenn Sie Benutzer -IDs ändern, bleibt die ursprüngliche Benutzer -ID normalerweise nicht erhalten, sodass die Informationen verloren gehen. Einige Programme wie z. logname und who -m Implementieren Sie einen Hack, bei dem sie prüfen, um herauszufinden, an welches Terminal verbunden ist stdin, und dann überprüfen Sie, welcher Benutzer an diesem Terminal angemeldet ist.

Diese Lösung häufig Werkt, ist aber nicht narrensicher und sollte sicherlich nicht als sicher angesehen werden. Stellen Sie sich zum Beispiel vor, wenn who gibt Folgendes aus:

tom     pts/0        2011-07-03 19:18 (1.2.3.4)
joe     pts/1        2011-07-03 19:10 (5.6.7.8)

tom Gebraucht su Um auf Wurzeln zu gelangen und Ihr Programm auszuführen. Wenn STDIN wird nicht umgeleitet, dann ein Programm wie logname wird ausgeben tom. Wenn es umgeleitet wird (zB aus einer Datei) als SO:

logname < /some/file

Dann ist das Ergebnis ""no login name"Da die Eingabe nicht das Terminal ist. Interessanter ist jedoch noch immer die Tatsache, dass der Benutzer als anders angemeldete Benutzer posieren könnte. Da Joe bei PTS/1 angemeldet ist

logname < /dev/pts1

Jetzt heißt es joe Obwohl Tom derjenige ist, der den Befehl geleitet hat. Mit anderen Worten, wenn Sie diesen Mechanismus in jeder Art von Sicherheitsrolle verwenden, sind Sie verrückt.

Das ist ein ksh Funktion, die ich über HP-UX geschrieben habe. Ich weiß nicht, wie es funktionieren wird Bash unter Linux. Die Idee ist, dass die sudo Der Prozess wird als ursprünglicher Benutzer ausgeführt und die untergeordneten Prozesse sind der Zielbenutzer. Durch das Zurückfahren über Elternprozesse können wir den Benutzer des ursprünglichen Prozesses finden.

#
# The options of ps require UNIX_STD=2003.  I am setting it
# in a subshell to avoid having it pollute the parent's namespace.
#
function findUser
{
    thisPID=$$
    origUser=$(whoami)
    thisUser=$origUser
    while [ "$thisUser" = "$origUser" ]
    do
        ( export UNIX_STD=2003; ps -p$thisPID -ouser,ppid,pid,comm ) | grep $thisPID | read thisUser myPPid myPid myComm
        thisPID=$myPPid
    done
    if [ "$thisUser" = "root" ]
    then
        thisUser=$origUser
    fi
    if [ "$#" -gt "0" ]
    then
        echo $origUser--$thisUser--$myComm
    else
        echo $thisUser
    fi
    return 0
}

Ich weiß, dass die ursprüngliche Frage von vor langer Zeit stammt, aber die Leute (wie ich) fragen immer noch, und dies sah nach einem guten Ort aus, um die Lösung zu setzen.

Wie wäre es mit LogName (1), um den Anmeldenamen des Benutzers zu erhalten?

THIS_USER=`pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1 | sed 's/[()]//g'`

Das ist das einzige, was für mich funktioniert hat.

Benutzer1683793s findUser () -Funktion portiert auf bash Und erweitert, damit es Benutzernamen zurückgibt, die auch in NSS -Bibliotheken gespeichert sind.

#!/bin/bash

function findUser() {
    thisPID=$$
    origUser=$(whoami)
    thisUser=$origUser

    while [ "$thisUser" = "$origUser" ]
    do
        ARR=($(ps h -p$thisPID -ouser,ppid;))
        thisUser="${ARR[0]}"
        myPPid="${ARR[1]}"
        thisPID=$myPPid
    done

    getent passwd "$thisUser" | cut -d: -f1
}

user=$(findUser)
echo "logged in: $user"

Zyklieren Sie zurück und geben Sie eine Liste von Benutzern

Basierend auf der Antwort von Benutzer1683793

Durch die Ausdauer von Nicht-Ty-Prozessen überspringe ich Root als Initiator der Anmeldung. Ich bin mir nicht sicher, ob das in einigen Fällen zu viel zu viel ausdrücken kann

#!/bin/ksh
function findUserList
{
    typeset userList prevUser thisPID thisUser myPPid myPid myTTY myComm
    thisPID=$$                 # starting with this process-ID
    while [ "$thisPID" != 1 ]  # and cycling back to the origin
    do
        (  ps -p$thisPID -ouser,ppid,pid,tty,comm ) | grep $thisPID | read thisUser myPPid myPid myTTY myComm
        thisPID=$myPPid
        [[ $myComm =~ ^su ]] && continue        # su is always run by root -> skip it
        [[ $myTTY == '?' ]] && continue         # skip what is running somewhere in the background (without a terminal)
        if [[ $prevUser != $thisUser ]]; then   # we only want the change of user
                prevUser="$thisUser"            # keep the user for comparing
                userList="${userList:+$userList }$thisUser"  # and add the new user to the list
        fi
        #print "$thisPID=$thisUser: $userList -> $thisUser -> $myComm " >&2
    done
    print "$userList"
    return 0
}

logname oder who am i gab mir nicht die gewünschte Antwort, insbesondere nicht in längeren Listen von su user1, su user2, su user3, ...

Ich weiß, dass die ursprüngliche Frage von vor langer Zeit stammt, aber die Leute (wie ich) fragen immer noch, und dies sah nach einem guten Ort aus, um die Lösung zu setzen.

Alternative zum Aufrufen von PS mehrmals: Machen Sie einen Pstree -Anruf

pstree -lu -s $$ | grep --max-count=1 -o '([^)]*)' | head -n 1

Ausgabe (wenn er als gleichmäßig angemeldet ist): (evan)

Pstree -Argumente:

  • -L: Lange Linien (nicht verkürzt)
  • -U: Zeigen Sie, wann der Benutzer ändert (Benutzername)
  • -S $$: Zeigen Sie den Eltern dieses Prozesses

Holen Sie sich die erste Benutzeränderung (die sich anmeldet) mit grep -o und head.

Einschränkung: Der Befehl kann keine Klammern enthalten () (Normalerweise nicht)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top