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?
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?
Antworten:
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 .
sudo -iufunktioniert bei mir ubuntuforums.org/…
sudo -iimmer noch durch env vars des Benutzers beschädigt. Die einzige Möglichkeit, dies zu vermeiden, ist die Verwendung su -l.
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.
-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.
Ich habe das gleiche Problem und darf nichts anderes als sudo su - devuserauf dem Dev-Server ausführen. Deshalb habe ich mir Folgendes ausgedacht:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
#!/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.