비정상적인 상황에서 내장 명령이 실행되는지 확인

비정상적인 상황에서 내장 명령이 실행되는지 확인

다음과 같은 열악한 환경을 고려하십시오.

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 모드:

  1. 함수 이름은 POSIX 특수 내장 함수 중 하나와 다를 수 있습니다.
  2. 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

(제한된 쉘에서는 허용되지 않을 수 있으므로 새 쉘을 시작하려고 할 필요가 없습니다.)

관련 정보