eval
임의의 코드 실행을 허용하므로 일반적으로 사용하지 않는 것이 좋습니다 . 하지만 를 사용하면 eval echo
문자열의 나머지 부분이 매개변수가 될 것처럼 보이 echo
므로 안전할 것입니다. 나 맞아?
답변1
반례:
DANGEROUS=">foo"
eval echo $DANGEROUS
임의의 인수는 echo
"foo"라는 파일을 생성하는 것보다 더 사악한 작업을 수행할 수 있습니다.
답변2
@Celada가 훌륭한 답변을 제공했습니다. 시위는 eval
정말 사악하고 여기는"foo"라는 파일을 만드는 것보다 더 사악한 것:
DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"
물론 그럴 수도 있다."foo"라는 파일을 만드는 것보다 더 사악한 것.
답변3
아니요아니요항상 안전합니다. eval은 모든 명령을 실행할 수 있습니다.
안전한 명령은 다음과 같습니다(날짜는 작은따옴표 안에 있으므로 실행되지 않습니다).
$ echo '$(date)'
$(date)
eval과 함께 사용하면 위험해집니다.
$ eval echo '$(date)'
Sat Dec 24 22:55:55 UTC 2016
물론 날짜는 가능합니다.어느주문하다.
이를 개선하는 한 가지 방법은 eval의 인수를 추가로 인용하는 것입니다.
$ eval echo '\$(date)'
$(date)
그러나 표현을 정확하게 두 번 인용하는 것은 종종 어렵습니다.
외부 공격자가 표현식을 설정할 수 있는 경우 올바른 참조를 제어할 수 있는 방법이 없습니다. 예를 들면 다음과 같습니다.
$ var='$(date);echo Hello!'
$ eval echo "$var"
Sat Dec 24 23:01:48 UTC 2016
Hello!
답변4
eval
항상 주의가 필요한 것은 사실이지만 , eval echo
건설이 항상 무의미한 것은 아닙니다.할 수 있는사용하기에 안전합니다. 최근에는 여러 버팀대 확장을 필요한 순서대로 평가하는 데 필요했습니다.
bash
여러 개의 버팀대가 왼쪽에서 오른쪽으로 확장되므로
xargs -I_ cat _/{11..15}/{8..5}.jpg
다음으로 확장
xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg
하지만 먼저 두 번째 지원 연장을 완료해야 합니다.
xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg
제가 생각하는 가장 좋은 방법은
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
이는 작은따옴표가 eval
명령줄을 구문 분석하는 동안 첫 번째 중괄호 세트가 확장되는 것을 방지하여 호출하는 subshell에 의해 확장될 수 있도록 하기 때문에 작동합니다 eval
.
중첩된 중괄호 확장과 관련된 교묘한 계획이 있을 수 있으므로 이를 한 단계로 수행할 수 있지만, 만약 그렇다면 나는 너무 늙고 어리석어서 그것을 볼 수 없습니다. 그 외에도 bash
이런 종류의 작업을 더 깔끔하게 수행할 수 있는 다른 쉘이 있습니다 . 그러나 어떤 경우에도 이 사용은 eval
해당 매개변수가 매개변수 확장을 포함하지 않는 고정 문자열이기 때문에 안전합니다.