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 -s
stattdessen 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 -iu
funktioniert bei mir ubuntuforums.org/…
sudo -i
immer 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 pwd
Befehl ausgewertet, bevor wir den su
Befehl ausführen , sodass wir tatsächlich in das Verzeichnis wechseln, in dem wir uns JETZT befinden Benutzer.
-c 'cd `pwd`'
würde der pwd
Befehl 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 cd
Befehls. 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 - devuser
auf 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.