Оставайтесь в том же рабочем каталоге при переходе на sudo

Оставайтесь в том же рабочем каталоге при переходе на sudo

При работе в командной строке я часто переключаюсь на sudo с помощью sudo -i. Однако мой рабочий каталог автоматически меняется на /root. Я никогда не хочу туда переходить; я хочу остаться там, где был! Как мне этого добиться?

решение1

Вместо этого вы можете использовать sudo -s, это не изменит ваш текущий каталог на /root, хотя некоторые из ваших переменных окружения не будут соответствовать переменным root.

Этотстраницана форумах Ubuntu есть хорошее резюме:

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

На этой странице из документации Ubuntu есть гораздо больше информациисправочная информация о sudo.

решение2

Если вы хотите использовать su, есть способ остаться в том же каталоге.

вс -пользователь-c "cd `pwd`; bash"

Что тут происходит:

  • su - user= войти какuser
  • -cчто означает «выполнить команду в оболочке нового пользователя»
  • -c "cd `pwd`"команда, которую мы даем, — это переключение в текущий каталог ( `pwd`), но поскольку мы используем обратные кавычки в двойных кавычках, команда pwdоценивается до того, как мы ее выполним su, так что мы фактически переключаемся в каталог, в котором находимся СЕЙЧАС как старый пользователь.

    • Напротив, команда -c 'cd `pwd`'будет выполнена pwdв новой оболочке, поэтому результатом будет cd /root, что, конечно, ничего не даст.

    Единственная проблема здесь в том, что новая оболочка завершает работу сразу после запуска команды, поэтому мы добавляем:

  • -c "cd `pwd`; bash"что означает «запустить bash(новую оболочку) после выполнения cdкоманды». Оболочка bash не завершит работу, пока мы не выйдем из нее.

Обратите внимание, что вы можете заменить `pwd`на $(pwd). Они функционально одинаковы, но обилие символов, похожих на кавычки, может затруднить чтение.

решение3

Я столкнулся с той же проблемой, и мне не разрешено запускать ничего, кроме как sudo su - devuserна сервере разработки, поэтому вот что я придумал:

  1. В devuser's .profile переключитесь обратно на предыдущий домашний каталог пользователя, если найдете:
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. Скрипт для определения предыдущего пользователя. Скрипт находится в каталоге 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

Он поднимается по дереву процессов и проверяет, изменился ли пользователь, владеющий процессом.

решение4

Если оба пользователя имеют доступ к рабочему каталогу:

sudo su -- $USER

Обратите внимание: если вы станете пользователем, не имеющим доступа к рабочему каталогу, новый пользователь не сможет выполнять в нем операции чтения/записи.

Или просто быть пользователем root в рабочем каталоге:

sudo su --

Связанный контент