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 -szamiast 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 -iudziała dla mnie ubuntuforums.org/…
sudo -isą 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, pwdpolecenie jest sprawdzane przed uruchomieniem supolecenia, dzięki czemu faktycznie przełączamy się do katalogu, w którym jesteśmy NOW jako stary użytkownik.
-c 'cd `pwd`'wykonałby pwdpolecenie 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 cdpolecenia. 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 - devuserna 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ę.