저는 현재 OverTheWire 웹사이트에서 CTF를 플레이하고 있습니다. 다음 레벨의 비밀번호를 얻으려면 레벨 32[ https://overthewire.org/wargames/bandit/bandit33.html ]에서 멈춰 있습니다. 액세스 수준 32 명령-비밀번호는 입니다.ssh [email protected] -p 2220
56a9bf19c63d650ce78e6ec0354ee45e
그래서 로그인하면 UPERCASE SHELL이라는 쉘이 나타납니다. 명령을 받아 대문자로 변환하면 "명령을 찾을 수 없음 오류"가 발생합니다. $SHELL을 실행하면 "WELCOME TO UPPERCASE SHELL"이라는 배너만 표시됩니다. 그래서 3시간 동안 꼼짝 못하게 되어서 구글링을 해봤습니다. 그래서 그 사람 중 한 명이 $0를 입력했고, 그 사람은 Bourne Shell로 이동했습니다. 그렇다면 $0과 $SHELL의 차이점은 무엇인가요?
$SHELL이 기본 쉘인 [UPPERCASE_SHELL]이라는 것을 알고 있으므로 실행 후 확인했습니다 cat /etc/paswd | grep bandit32
. 그렇다면 $0는 무엇입니까? $0이 현재 셸인 경우 [UpperCase] 출력과 동일한 배너를 얻어야 합니다. Bourne Shell에 어떻게 로그인하나요?
결론. 이 두 가지 쉘 변수는 무엇입니까? 이 상황에서 그들은 어떻게 작동합니까?
답변1
$SHELL
흥미로운 변수다. 대부분의 쉘에는 여기에 귀하의 이름이 포함됩니다.로그인 쉘(이 내용은 /etc/passwd에서 확인할 수 있습니다.) 다른 쉘 인터프리터를 시작해도 자동으로 변경되지 않습니다.
예를 들어 내 로그인 쉘은 fish
. 다양한 쉘이 이를 어떻게 처리하는지 살펴보겠습니다 $SHELL
.
$ set -e SHELL; bash -c 'echo $SHELL'
/usr/local/bin/fish
$ set -e SHELL; ksh -c 'echo $SHELL'
/bin/sh
$ set -e SHELL; zsh -c 'echo $SHELL'
$ set -e SHELL; dash -c 'echo $SHELL'
$ set -e SHELL; fish -c 'echo $SHELL'
set -e var
변수를 재설정하는 물고기의 방법입니다.
- bash는 SHELL을 로그인 쉘로 설정합니다.
- ksh는 기본 쉘을 사용합니다.
- zsh, dash 및 fish는 SHELL에 특별한 의미가 없습니다.
그래서 $SHELL
정보만 제공하고최대. 나는 그것이 어떤 마법적인 가치를 갖는다고 믿지 않을 것입니다.
SHELL의 값은 실제로 다음과 같이 주어진다 login
.앞으로쉘이 호출됩니다. 내 Mac의 (BSD) 매뉴얼에서 login
:
로그인 유틸리티는 사용자의 홈 디렉터리(HOME), 명령 셸(SHELL), 검색 경로(PATH), 터미널 유형(TERM) 및 사용자 이름(LOGNAME 및 USER)을 지정하여 환경(environ(7) 참조)에 정보를 입력합니다. .
답변2
$SHELL
쉘 이름을 알려줘야 합니다 - 참조글렌의 대답이 변수는 얼마나 모호하게 고려해야 하는가.
$0
현재 스크립트의 이름입니다.
test.sh
다음과 같이 쉘 스크립트를 작성합니다 .
#!/bin/bash
echo My shell is $SHELL
echo My script is called $0
실행하면 어떤 일이 일어나는지 확인하세요. Shebang을 변경해 #!/bin/zsh
도 결과는 변경되지 않습니다. Glenn의 답변을 다시 참조하십시오.
게임에 관해서는 어떤 일이든 일어날 수 있습니다. 그것은 단지 게임의 시뮬레이션 셸일 수도 있고 시뮬레이션 게임 요소일 수도 있습니다. 아무도 말할 수 없습니다.