
Wenn ich auf der Kommandozeile arbeite, wechsle ich oft mit zu sudo sudo -i
. Mein Arbeitsverzeichnis ändert sich jedoch automatisch zu /root
. Dorthin möchte ich nie gehen, ich möchte dort bleiben, wo ich war! Wie kann ich das erreichen?
Antwort1
Sie könnten stattdessen verwenden sudo -s
. Dadurch würde Ihr aktuelles Verzeichnis nicht in geändert /root
, allerdings wären einige Ihrer Umgebungsvariablen nicht die von root.
DasSeiteaus den Ubuntu-Foren bietet 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 mehrHintergrundinformationen zu sudo.
Antwort2
Wenn Sie verwenden möchten su
, gibt es eine Möglichkeit, im selben Verzeichnis zu bleiben.
so -Benutzer-c "cd `pwd`; bash"
Was ist denn hier los:
su - user
= Anmelden alsuser
-c
was bedeutet: „Führen Sie einen Befehl in der Shell des neuen Benutzers aus“-c "cd `pwd`"
Der von uns eingegebene Befehl dient zum Wechseln in das aktuelle Verzeichnis (`pwd`
) – da wir jedoch die Backticks in Anführungszeichen verwenden,pwd
wird der Befehl ausgewertet, bevor wir ihn ausführensu
, sodass wir tatsächlich in das Verzeichnis wechseln, in dem wir uns JETZT als alter Benutzer befinden.- Im Gegensatz dazu
-c 'cd `pwd`'
würde der Befehl in der neuen Shell ausgeführtpwd
, sodass dies als ausgewertet würdecd /root
, was natürlich nichts bewirkt.
Das einzige Problem hierbei ist, dass die neue Shell direkt nach dem Ausführen des Befehls beendet wird. Daher fügen wir Folgendes hinzu:
- Im Gegensatz dazu
-c "cd `pwd`; bash"
was bedeutet, „bash
(neue Shell) nach dem Ausführen descd
Befehls auszuführen. Die Bash-Shell wird erst beendet, wenn wir uns abmelden.“
`pwd`
Beachten Sie, dass Sie durch ersetzen können $(pwd)
. Sie sind funktional gleich, aber die Vielzahl an Anführungszeichen kann das Lesen erschweren.
Antwort3
Ich hatte das gleiche Problem und darf nichts anderes als sudo su - devuser
auf dem Entwicklungsserver ausführen. Das hier ist mir also eingefallen:
- Wechseln Sie im .profile des Devusers zurück zum vorherigen Benutzer-Home, falls Folgendes gefunden wird:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
- Ein Skript zum Ermitteln eines vorherigen Benutzers. Das Skript wird im Bin-Verzeichnis von devuser 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 durchläuft einen Prozessbaum und prüft, ob sich der Benutzer geändert hat, der den Prozess besitzt.
Antwort4
Wenn beide Benutzer Zugriff auf das Arbeitsverzeichnis haben:
sudo su -- $USER
Beachten Sie: Wenn Sie ein Benutzer werden, der keinen Zugriff auf das Arbeitsverzeichnis hat, kann der neue Benutzer darin keine Lese-/Schreibvorgänge ausführen.
Oder seien Sie einfach Root im Arbeitsverzeichnis:
sudo su --