Przechodząc do sudo, pozostań w tym samym katalogu roboczym

25

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ąć?

Przywróć Monikę
źródło

Odpowiedzi:

28

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 .

Levon
źródło
1
Piękny! Wielkie dzięki, prosty, ale świetny mały przegląd!
Przywróć Monikę
@ user1162541 Z przyjemnością mogę pomóc.
Levon
sudo -iudziała dla mnie ubuntuforums.org/…
rofrol
Podczas mojego testu zmienne środowiskowe sudo -isą nadal uszkodzone przez zmienne środowiskowe użytkownika. Jedynym sposobem na uniknięcie tego jest użycie su -l.
Simba
5

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.

    • W przeciwieństwie do tego, -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.

will.barley
źródło
0

Napotkałem ten sam problem i nie wolno mi uruchamiać niczego innego niż sudo su - devuserna serwerze deweloperskim, więc wymyśliłem:

  1. W .profile devuser'a wróć do poprzedniego domu użytkownika, jeśli został znaleziony:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. Skrypt określający poprzedniego użytkownika. Skrypt znajduje się w katalogu bin devuser:
#!/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ę.

reimai
źródło