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