eval
임의 코드를 실행할 수 있으므로 사용을 권장하지 않습니다. 그러나을 사용 eval echo
하면 나머지 문자열이 인수가되는 것처럼 보이 echo
므로 안전해야합니다. 내가 맞습니까?
답변
반례 :
DANGEROUS=">foo"
eval echo $DANGEROUS
임의의 인수 echo
는 “foo”라는 파일을 만드는 것보다 더 사악한 일 을 할 수있었습니다.
답변
@Celada는 훌륭한 답변을 제공했습니다. eval
실제로는 악의 를 나타 내기 위해 “foo”라는 파일을 만드는 것보다 더 사악한 것이 있습니다 .
DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"
물론 “foo”라는 파일을 만드는 것보다 더 사악한 것보다 더 사악한 것이 있을 수 있습니다 .
답변
아니요, 항상 안전 하지는 않습니다 . 평가자는 모든 명령을 실행할 수 있습니다.
다음과 같은 안전한 명령 (날짜는 작은 따옴표 안에 있으므로 실행되지 않습니다) :
$ 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!
답변
이 것은 사실이지만 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
명령 행을 구문 분석하는 동안 첫 번째 중괄호 세트가 확장되지 않도록 보호하여에 의해 호출 된 서브 쉘에 의해 확장되도록합니다 eval
.
중첩 괄호 확장과 관련된 교활한 계획이있을 수 있습니다. 단순히이 작업을 수행 할 수는 있지만 너무 오래되어 어리석은 경우입니다. bash
이런 종류의 것을 달성하는 더 깔끔한 방법을 허용하는 것 이외의 껍질도 있습니다 . 그러나 어쨌든 eval
인수는 모두 매개 변수 확장이 포함되지 않은 고정 문자열이기 때문에 이러한 사용 은 안전합니다.