
명령줄에서 작업할 때 sudo -i
. 그러나 내 작업 디렉토리는 자동으로 /root
. 나는 결코 그곳에 가고 싶지 않습니다. 나는 내가 있던 곳에 머물고 싶다! 어떻게 이를 달성할 수 있나요?
답변1
대신 사용할 수 있습니다 . 환경 변수 중 일부는 루트의 변수가 아니지만 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에 대한 배경 정보.
답변2
를 사용하려면 su
동일한 디렉토리에 머무르는 방법이 있습니다.
수 -사용자-c "cd `pwd`; 배시"
무슨 일이야?
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의 .profile에서 다음이 발견되면 이전 사용자 홈으로 다시 전환합니다.
prev_user_home=$(~/bin/home.sh)
if [ -n $prev_user_home ] ; then
cd $prev_user_home
fi
- 이전 사용자를 확인하는 스크립트입니다. 스크립트는 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
프로세스 트리에 올라가서 프로세스 소유 사용자가 변경되었는지 확인합니다.
답변4
두 사용자 모두 작업 디렉토리에 액세스할 수 있는 경우:
sudo su -- $USER
작업 디렉토리에 대한 액세스 권한이 없는 사용자가 되면 새 사용자는 해당 디렉토리에서 읽기/쓰기 작업을 수행할 수 없습니다.
또는 작업 디렉토리의 루트가 되려면 다음을 수행하십시오.
sudo su --