Behalten Sie das gleiche Arbeitsverzeichnis bei, wenn Sie zu sudo wechseln

25

Wenn ich an der Befehlszeile arbeite, wechsle ich häufig zu sudo using sudo -i. Mein Arbeitsverzeichnis wechselt jedoch automatisch zu /root. Ich möchte niemals dorthin gehen. Ich möchte bleiben, wo ich war! Wie kann ich das erreichen?

Setzen Sie Monica wieder ein
quelle

Antworten:

28

Sie könnten sudo -sstattdessen verwenden, es würde Ihr aktuelles Verzeichnis nicht in ändern /root, obwohl einige Ihrer Umgebungsvariablen nicht die von root wären.

Diese Seite aus den Ubuntu-Foren hat eine schöne Zusammenfassung:

Summary of the differences found   
                                               corrupted by user's 
                HOME=/root      uses root's PATH     env vars
sudo -i         Y               Y[2]                 N
sudo -s         N               Y[2]                 Y
sudo bash       N               Y[2]                 Y
sudo su         Y               N[1]                 Y

Diese Seite aus der Ubuntu-Dokumentation enthält viel mehr Hintergrundinformationen zu sudo .

Levon
quelle
1
Schön! Vielen Dank, einfache aber tolle kleine Übersicht!
Setzen Sie Monica am
@ user1162541 Freut mich, helfen zu können.
Levon
sudo -iufunktioniert bei mir ubuntuforums.org/…
rofrol
Während meines Tests ist env vars of sudo -iimmer noch durch env vars des Benutzers beschädigt. Die einzige Möglichkeit, dies zu vermeiden, ist die Verwendung su -l.
Simba
5

Wenn Sie verwenden möchten su, gibt es eine Möglichkeit, im selben Verzeichnis zu bleiben.

su - user -c "cd` pwd`; bash "

Was ist hier los:

  • su - user = einloggen als user
  • -c was bedeutet "einen Befehl in der Shell des neuen Benutzers ausführen"
  • -c "cd `pwd`"Der Befehl, den wir geben, ist, in das aktuelle Verzeichnis ( `pwd`) zu wechseln. Da wir jedoch die Backticks in doppelten Anführungszeichen verwenden, wird der pwdBefehl ausgewertet, bevor wir den suBefehl ausführen , sodass wir tatsächlich in das Verzeichnis wechseln, in dem wir uns JETZT befinden Benutzer.

    • Im Gegensatz dazu -c 'cd `pwd`'würde der pwdBefehl in der neuen Shell ausgeführt, so dass dies ausgewertet würde cd /root, was natürlich nichts bewirken würde.

    Das einzige Problem hierbei ist, dass die neue Shell direkt nach dem Ausführen des Befehls beendet wird. Dann fügen wir hinzu:

  • -c "cd `pwd`; bash"Das bedeutet "run" bash(neue Shell) nach dem Ausführen des cdBefehls. Die Bash-Shell wird erst beendet, wenn wir uns abmelden.

Beachten Sie, dass Sie ersetzen können `pwd`mit $(pwd). Sie sind funktionell gleich, aber die Fülle von Anführungszeichen kann schwer zu lesen sein.

Gerste
quelle
0

Ich habe das gleiche Problem und darf nichts anderes als sudo su - devuserauf dem Dev-Server ausführen. Deshalb habe ich mir Folgendes ausgedacht:

  1. Wechseln Sie im .profile des Entwicklers zurück zum vorherigen Benutzer, wenn Folgendes gefunden wurde:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. Ein Skript zum Ermitteln eines vorherigen Benutzers. Das Skript wird im bin-Verzeichnis des Entwicklers abgelegt:
#!/bin/bash
#brings you back home after sudo su

function get_owner {
  pid=$1
  echo $(ps ouid -p $pid h | tr -d ' ')
}

pid=$$
my_uid=$(get_owner $pid)
uid=$my_uid
i=0
while [[ $uid == $my_uid && $i -lt 20 ]] ; do
    pid=$(ps -o ppid= $pid)
    uid=$(get_owner $pid)
    i=$((i+1))
done

user_home=$(getent passwd $uid | cut -d ':' -f '6')
if [[ -d $user_home && $uid != 0 ]] ; then
    echo $user_home
fi

Es geht einen Prozessbaum hoch und prüft, ob der Benutzer, der den Prozess besitzt, geändert wurde.

reimai
quelle