환경 변수에 간접적으로 액세스 [복제]

환경 변수에 간접적으로 액세스 [복제]

bash 스크립트가 있다고 가정하면

ev=USER

ev를 사용하여 $USER의 환경 변수 값을 얻는 방법은 무엇입니까?

순진하게 이것을 시도하십시오 :

echo ${"$"$ev}

이로 인해 대체가 불량해질 수 있습니다.

$USER 값을 반환하고 싶습니다.

답변1

간접 확장("가변 간접 참조"라고도 함)을 사용하면

ev=USER
printf '%s\n' "${!ev}"

bash이는 (5.0) 매뉴얼의 "매개변수 확장" 섹션에 설명되어 있습니다.

ev또는 이름 참조를 만들어 ( bash4.3 이상 필요)

declare -n ev=USER
printf '%s\n' "$ev"

bash이는 (5.0) 매뉴얼에 설명되어 있지만앞으로"위치 매개변수"라는 섹션입니다.

답변2

만약에 대해서만환경쉘 변수와 달리 변수를 사용하면 대부분의 시스템에서 다음을 사용할 수 있습니다.

printenv -- "$ev"

쉘 변수의 경우 Bourne과 유사한 쉘을 사용하여 다음을 수행할 수 있습니다.

eval 'printf "%s\n" "${'"$ev"}'}"'

또는 다음을 사용하여 zsh:

printf '%s\n' "${(P)ev}"

또는 다음을 사용하여 bash:

printf '%s\n' "${!ev}"

콘텐츠가 $ev귀하의 통제하에 있지 않다면, 이 3가지 취약점은 임의 명령 주입 취약점입니다.

답변3

$ev다음 값을 바꾼 후 명령을 평가할 수도 있습니다 .

eval echo "$"$ev

이 부분은 이렇게 실행하기 "$"$ev위해 파싱합니다 .$USERevalecho $USER

관련 정보