При работе в командной строке я часто переключаюсь на sudo, используя sudo -i. Однако мой рабочий каталог автоматически меняется на /root. Я никогда не хочу туда идти; Я хочу остаться там, где я был! Как мне этого добиться?
При работе в командной строке я часто переключаюсь на sudo, используя sudo -i. Однако мой рабочий каталог автоматически меняется на /root. Я никогда не хочу туда идти; Я хочу остаться там, где я был! Как мне этого добиться?
Ответы:
Вы можете использовать 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 .
sudo -iuработает для меня ubuntuforums.org/…
sudo -iвсе еще поврежден env vars пользователя. Единственный способ избежать этого - использовать su -l.
Если вы хотите использовать 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). Они функционально одинаковы, но обилие цитатоподобных символов может стать трудночитаемым.
Я столкнулся с той же проблемой, и мне не разрешено запускать что-либо, кроме как sudo su - devuserна сервере dev, поэтому я пришел к такому выводу:
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
Он просматривает дерево процессов и проверяет, изменился ли пользователь, владеющий процессом.