Mountain Lion 호스트에서 다음 명령을 사용하여 사용자로 로그인 Coguaro
했습니다 .coconutpowder
bash
Coguaro:~ coconutpowder$ echo $0
-bash
높은 권한으로 명령을 실행해야 하므로 su
전환을 시도했지만 root
허용되지 않습니다.
Coguaro:~ coconutpowder$ su -
Password:
su: Sorry
그만하면 충분 해. 나는 그 man
페이지를 읽고 su
이것을 얻었습니다:
PAM is used to set the policy su(1) will use.
In particular, by default only users in the ``admin'' or ``wheel''
groups can switch to UID 0 (``root'').
su
나는 이 작업을 수행하도록 허용된 어떤 그룹에도 속해 있지 않다는 것을 확인했습니다 .
Coguaro:~ coconutpowder$ id
uid=502(coconutpowder) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts)
su
그래서 명령을 다시 실행 하고 앞에 a를 붙이면 sudo
다음과 같이 할 수 있습니다 /etc/sudoers
.
/etc/sudoers: coconutpowder ALL=(ALL) ALL
Coguaro:~ coconutpowder$ sudo su -
Coguaro:~ root# echo $USER $0 $BASH_VERSION
root -sh 3.2.48(1)-release
Coguaro:~ root#
이제 나는 내가 보고 있는 것을 실제로 실행하고 있기 때문에 문제가 있다고 생각되는 시나리오에 직면하고 있습니다. sh
이는 결국 내 로그인 셸이지만 이전 로그인에서 설정된 환경 변수가 root
있고 BASH_VERSION
해당 메커니즘을 통과했습니다 sudo
. 내가 틀렸다면 정정해주세요.
이는 다음과 같은 일부 쉘 감지 트릭이 손상되었음을 의미합니다.
if [ ${BASH_VERSION-not_running_within_bash} = not_running_within_bash ]; then
# ...
fi
su
나는 그것을 올바르게 수행하는 방법을 전혀 모르고 root
결정할 방법이 있습니다.확증하다내가 그것을 사용하든 말든 bash
. 스크립트는 일부 값이 잘못된 경우 파일 시스템 경로를 손상시킬 수 있는 Bash 배열을 광범위하게 사용합니다. 다른 곳에서 언급한 해킹이 약간의 해킹(?!)이라는 것을 알았기 ps -p $$
때문에 먼저 로그인해야 하고 coconutpowder
직접 수행할 수 없다는 점을 고려하여 달성하려는 작업을 수행할 수 있는 가장 좋은 방법을 찾고 있습니다. root
.
실수로 사용자 전환을 수행하는 경우 문제는 다른 쪽이 전류만 감지하는 것과 관련이 있다고 생각합니다(대신"기본"또는"할당된") 껍데기.
지금까지 $0 구문 분석을 준비 중이며 -
로그인 셸을 나타내는 접두사 문자를 제거할 수도 있습니다.
su
로그인 하는 방법 root
(예: $HOME/.profile 읽기)과 bash
default 에서 default 로 직접 전환하는 방법을 알려주지 않는 한 sh
이는 변경할 수 없습니다.
답변1
이제 나는 내가 보고 있는 것을 보기 위해 실제로 sh를 실행하고 있기 때문에 문제가 있다고 생각하는 시나리오에 직면하고 있습니다. 결국 이것은 내 루트 로그인 쉘이지만 이전 로그인에서 BASH_VERSION 환경 변수가 설정되어 있습니다. 그리고 sudo를 통해 메커니즘을 전달하시겠습니까? 내가 틀렸다면 정정해주세요.
다행히도 당신은 틀렸습니다. 유사한 환경 변수는 다음과 같습니다 BASH_VERSION
.놓다, 하지만출구이므로 하위 프로세스에는 존재하지 않습니다.
출력 비교:
set | grep ^BASH
그리고
env | grep ^BASH
set
둘 다 env
환경 변수를 표시합니다. 변수를 set
볼 수 있는 내장 쉘입니다 BASH_*
. env
외부 프로그램이므로 BASH_*
변수가 전혀 표시되지 않는다는 것을 알 수 있습니다.
만약 너라면했다이러한 변수를 하위 프로세스로 내보내려면 수동으로 수행하면 다음 위치에 표시됩니다 env
.
$ export BASH_VERSION
$ env | grep ^BASH
BASH_VERSION=4.2.36(1)-release
그러나 이렇게 수동으로 내보내지 않는 한, 존재한다는 것은 BASH_VERSION
실제로 bash를 실행하고 있다는 것을 의미한다고 상당히 확신할 수 있습니다. 또한 export -p
어떤 변수가 이런 방식으로 내보내졌는지 확인하려면 출력을 참조하세요 .
답변2
예, 아직도 bash를 사용하고 계십니다. BASH_VERSION
환경 변수가 아닌 쉘 변수입니다. 해당 쉘 내에서만 정의되며 다른 프로세스로 내보내지지 않습니다. (바라보다bash에서 환경 변수와 내보낸 환경 변수의 차이점그리고쉘 변수는 어떤 범위를 가질 수 있습니까?).
$0
그림 과 같이 -sh
쉘은로그인 쉘. bash이지만 bash name 으로 시작합니다 sh
. bash가 쉘로 시작되면 sh
다르게 동작합니다. 즉, 다른 쉘과의 호환성을 높이기 위해 일부 bash 관련 기능을 끕니다.
su
순서는 신경쓰지 마세요 . 루트로 대화형 로그인 셸을 얻으려면 를 실행하세요 sudo -i
. 예를 들어 실행할 대체 셸을 지정할 수 있습니다 sudo -i zsh
. 특정 환경 변수를 유지하고 루트 .profile
또는 기타 로그인 파일을 실행하지 않는 대화형 셸을 실행하려면 sudo -s
.