다음과 같은 열악한 환경을 고려하십시오.
for word in builtin command type unfunction declare set unset alias; do
eval "$word(){ echo $word function; }; alias $word='echo $word alias'"
done
내장된 명령에 액세스할 수 있나요? 예를 들어 다음과 같은 작업이 가능합니까?
\command \builtin \type echo
아직도 볼 수 있는 것:
echo is a shell builtin
적대적인(또는 잠긴) 환경에서 기본 내장, 함수 또는 경로 이름에 절대 액세스할 수 없도록 사물을 완전히 재정의하는 것이 가능합니까?
답변1
Bash의 경우 활성화하면POSIX 모드:
- 함수 이름은 POSIX 특수 내장 함수 중 하나와 다를 수 있습니다.
- POSIX 특수 내장 함수는 명령 조회 중에 쉘 함수보다 먼저 발견됩니다.
및는 특수 내장 함수이므로 POSIX 스키마를 통해 액세스한 다음 이를 사용하여 함수를 제거하고 별칭을 제거하는 데 사용할 수 set
있습니다 .unset
\unalias
$ for word in builtin command type declare set unset unalias alias; do eval "$word(){ echo $word function; }; alias $word='echo $word alias'"; done
alias function
$ unalias builtin command type unfunction declare set unset alias
unalias alias builtin command type unfunction declare set unset alias
$ POSIXLY_CORRECT=1
$ \unset -f builtin command type declare set unset unalias alias
$ \unalias builtin command type unfunction declare set unset alias
bash: unalias: unfunction: not found
bash: unalias: alias: not found
$ type -a builtin
builtin is a shell builtin
하지만 다음과 같이 다시 되돌릴 방법이 생각나지 않습니다.
enable -n set unset builtin command type declare unalias alias typeset enable shopt
(제한된 쉘에서는 허용되지 않을 수 있으므로 새 쉘을 시작하려고 할 필요가 없습니다.)