이 시련을 겪은 후에도 여전히 bash를 사용하고 있나요?

이 시련을 겪은 후에도 여전히 bash를 사용하고 있나요?

Mountain Lion 호스트에서 다음 명령을 사용하여 사용자로 로그인 Coguaro했습니다 .coconutpowderbash

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 읽기)과 bashdefault 에서 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.

관련 정보