Під час роботи над командним рядком я часто переходжу на використання 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 - user -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
Він піднімає дерево процесів і перевіряє, чи змінився користувач, який володіє процесом.