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

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

Вы могли бы использовать sudo -s вместо этого, это не изменило бы ваш текущий каталог на /root , хотя некоторые из ваших переменных среды не были бы root.

Эта страница с форума Ubuntu имеет приятное резюме:

 Summary of the differences found corrupted by user's HOME=/root uses root's PATH env vars sudo -i YY[2] N sudo -s NY[2] Y sudo bash NY[2] Y sudo su YN[1] Y 

На этой странице из документации Ubuntu имеется гораздо больше справочной информации о sudo .

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

  su - user -c "cd` pwd`; bash " 

Что тут происходит:

  • su - user = login как 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-сервере, так что это то, что я придумал:

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

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