명령줄에서 작업할 때 나는 종종 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
우분투 문서의 이 페이지에는 더 많은 내용이 있습니다.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 --