sudo로 변경할 때 동일한 작업 디렉토리를 유지하십시오.


25

커맨드 라인에서 작업 할 때 종종을 사용하여 sudo로 변경합니다 sudo -i. 그러나 작업 디렉토리가 자동으로로 변경됩니다 /root. 나는 그곳에 가고 싶지 않습니다. 나는 내가 있었던 곳에 머물고 싶다! 어떻게하면 되나요?

답변:


28

당신은 사용할 수 있습니다 sudo -s그것은 당신의 현재 디렉토리를 변경하지 않을 대신 /root환경 변수 중 일부는 루트의 그 않을 것이지만.

우분투 포럼 의이 페이지 는 다음과 같이 요약되어 있습니다.

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에 대한 훨씬 더 많은 배경 정보가 있습니다.


1
아름다운! 고마워요, 간단하지만 훌륭한 작은 개요!
복원 Monica Monica

@ user1162541 도와 드리겠습니다.
Levon

sudo -iu나를 위해 일한다 ubuntuforums.org/…
rofrol

내 테스트 중에 env vars of sudo -i는 여전히 사용자의 env var에 의해 손상되었습니다. 이것을 피하는 유일한 방법은를 사용하는 것 su -l입니다.
Simba

5

을 사용 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). 그것들은 기능적으로 동일하지만, 인용과 같은 문자가 풍부하기 때문에 읽기가 어려워 질 수 있습니다.


0

나는 같은 문제에 직면하여 sudo su - devuserdev 서버 이외의 것을 실행할 수 없으므로 이것이 내가 생각해 낸 것입니다.

  1. devuser의 .profile에서 발견되면 이전 사용자 홈으로 다시 전환하십시오.
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
        cd $prev_user_home
fi
  1. 이전 사용자를 결정하는 스크립트 스크립트는 devuser의 bin 디렉토리에 있습니다.
#!/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

프로세스 트리로 올라가고 프로세스 소유 사용자가 변경되었는지 확인합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.