Podczas pracy z wierszem poleceń często zmieniam na sudo sudo -i
. Jednak mój katalog roboczy zmienia się automatycznie na /root
. Nigdy nie chcę tam iść; Chcę zostać tam, gdzie byłem! Jak mogę to osiągnąć?
Podczas pracy z wierszem poleceń często zmieniam na sudo sudo -i
. Jednak mój katalog roboczy zmienia się automatycznie na /root
. Nigdy nie chcę tam iść; Chcę zostać tam, gdzie byłem! Jak mogę to osiągnąć?
Odpowiedzi:
Możesz użyć sudo -s
zamiast tego, to nie zmieniłoby twojego bieżącego katalogu na /root
, chociaż niektóre twoje zmienne środowiskowe nie byłyby tymi z katalogu głównego.
Ta strona z forum Ubuntu ma ładne podsumowanie:
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
Ta strona z dokumentacji Ubuntu zawiera znacznie więcej podstawowych informacji na temat sudo .
sudo -iu
działa dla mnie ubuntuforums.org/…
sudo -i
są nadal uszkodzone przez zmienne środowiskowe użytkownika. Jedynym sposobem na uniknięcie tego jest użycie su -l
.
Jeśli chcesz użyć su
, możesz pozostać w tym samym katalogu.
su - użytkownik -c "cd` pwd`; bash "
Co tu się dzieje:
su - user
= zaloguj się jako user
-c
co oznacza „uruchom polecenie w powłoce nowego użytkownika”-c "cd `pwd`"
polecenie, które dajemy, polega na przełączeniu do bieżącego katalogu ( `pwd`
) - ale ponieważ używamy backticków w podwójnych cudzysłowach, pwd
polecenie jest sprawdzane przed uruchomieniem su
polecenia, dzięki czemu faktycznie przełączamy się do katalogu, w którym jesteśmy NOW jako stary użytkownik.
-c 'cd `pwd`'
wykonałby pwd
polecenie w nowej powłoce, więc oceniłoby to cd /root
, co, oczywiście, niczego nie osiągnie.Jedynym problemem jest to, że nowa powłoka kończy pracę zaraz po uruchomieniu polecenia, więc dodajemy:
-c "cd `pwd`; bash"
co oznacza „uruchom bash
(nowa powłoka) po uruchomieniu cd
polecenia. Powłoka bash nie kończy działania, dopóki się z niej nie wylogujemy.Pamiętaj, że możesz zamienić `pwd`
z $(pwd)
. Są funkcjonalnie takie same, ale obfitość znaków podobnych do cytatów może być trudna do odczytania.
Napotkałem ten sam problem i nie wolno mi uruchamiać niczego innego niż sudo su - devuser
na serwerze deweloperskim, więc wymyśliłem:
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
Przechodzi do drzewa procesów i sprawdza, czy użytkownik będący właścicielem procesu zmienił się.