При работе в командной строке я часто переключаюсь на 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
Он просматривает дерево процессов и проверяет, изменился ли пользователь, владеющий процессом.