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

25

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

Восстановить Монику
источник

Ответы:

28

Вы можете использовать sudo -sвместо этого, это не изменит ваш текущий каталог на /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 .

Левон
источник
1
Прекрасный! Большое спасибо, простой, но отличный обзор!
Восстановить Монику
@ user1162541 Рад возможности помочь.
Левон
sudo -iuработает для меня ubuntuforums.org/…
rofrol
Во время моего теста env vars of sudo -iвсе еще поврежден env vars пользователя. Единственный способ избежать этого - использовать su -l.
Симба
5

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

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). Они функционально одинаковы, но обилие цитатоподобных символов может стать трудночитаемым.

will.barley
источник
0

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

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

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

reimai
источник