무엇을 할 수 있는 '평가' 명령? 왜 유용해? 그것은 함정이거나 내장현 함수은 bash? Man '페이지' 이 없다.
'평가' 는 일부 POSIX. 될 수 있는 인터페이스입니다 내장현 쉘로 있다.
eval - construct command by concatenating arguments
또 불러키지 인수와 건설, 이는 실행됨을 명령에 의해 쉘입니다. 이것은 예를 마 페이지:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
이는 다양한 언어로 공통 기능을 펄 (perl) 및 javascript. (예: Eval 펄독 투명지에 보면 자세한 (예: http://perldoc.perl.org/functions/eval.html
예, '평가' 은 bash 내장 명령 때문에 '배시' 맨페이지를 설명되어 있습니다.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
일반적으로 사용하는 것과 함께 [ 명령을 대체 ] (https://en.wikipedia.org/wiki/Command_substitution). 명시성 '평가' 할 수 없는, 셸 명령을 실행할 수 없으며, 결과로 대체 평가하십시오 거잖나.
말하도다 보기할 코드 환산하면 'VAR = value. '에코 (echo $ var. 차이점은 처리하는 방법에 쉘로 글 '에코 VAR = value':
andcoz@ >. ~ $ (에코 VAR = value) 내주었다. VAR = value: 명령을 찾을 수 없습니다. andcoz@ >. ~ echo $ VAR 빈 line> <;
셸 '에코' 와 'VAR = value' 도 두 개의 서로 다른 명령을 실행할 수 있는 것이다. 이 오류가 던지는 대한 두 번째 구체화하십시오. 대입 계속 반박했다. 2. andcoz@ >. ~ eval $ (에코 VAR = value) andcoz@ >. ~ echo $ VAR 가치 셸 (연결) '에코' 와 'VAR = value' 병합합니다 문장열 분석하고, 이 두 대의 일체형 적절한 규칙과 실행하므로 따르면 it.
당연하면서도 중요한 사실은 매우 위험한 함장님이요 '평가' 할 수 있다. 보안 문제를 피하기 위해 모든 입력 충족되었으며 '평가' 명령 조심스럽게 점검됩니다 합니다.
'평가' 주님으로부터그에게 맨페이지 있지 않기 때문에 별도의 외부 명령을 명령, 즉, 대신 내장현 쉘로 내부 및 알려진 의해서만 쉘로 ('배시'). 배시 '의' 관련 부품 맨페이지를 다음과 같이 말합니다.
eval [arg ...]
The args are read and concatenated together into a single command.
This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0
또한 '평가' 출력물에는 도움말에서는 경우 입니다.
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
Exit Status:
Returns exit status of command or success if command is null.
'평가' 는 강력한 명령 및 사용하려면 좀 가능한 끕니까 매우 신중해야 한다고 합니다 [보안 위험을] (http://mywiki.wooledge.org/BashFAQ/048) 와 함께 제공되는 것이 특징이다.
Eval 이 eval 의 쉘을 통해 그들을 지시합니다 기술서임을 시행하십시오 명령으로 인수만 실행하십시오 명령줄이. 이 같은 상황에서 할 수 있다 (아래 참조).
스크립트에 대한 명령을 정의하는 경우, 나중에 그 명령을 사용할 수 있는 붙여넣습니다 가변으로 콩지름에 평가.
/home/user1 > a="ls | more"
/home/user1 > $a
bash: command not found: ls | more
/home/user1 > # Above command didn't work as ls tried to list file with name pipe (|) and more. But these files are not there
/home/user1 > eval $a
file.txt
mailids
remote_cmd.sh
sample.txt
tmp
/home/user1 >
대부분의 기능은 사실상 '평가' 언어 (TCL) ',' 루비 '' ',' 파이썬.), 포탄 아니라. # 39 의 it& 평가하는 데 사용되는 코드를 동적으로.
기본적으로 '평가' 는 인수로 문자열으로 및 평가한 / 해석하는 코드가 항목이없습니다. '평가' 에서 '평가' 할 수 있지만, 두 개 이상의 인수 시행하십시오 셸, 그냥 그 문자열을 구성하기 위해 연결 평가하십시오.
다음과 같습니다.
varname=$1 varvalue=$2
eval "$varname=\$varvalue" # evaluate a string like "foo=$varvalue"
# which in Bourne-like shell language
# is a variable assignment.
그러나 it& # 39 로, s, s 도 불안하다고요 it& # 39 의 중요한 부분을 전달된 살균 동적임 (외부에서 제공) '평가' reason for the very 지정하십시오. it& # 39 의 코드 쉘로 해석된다.
예를 들어, 만약 $1 위 ',' 는 '이글거리 명령 var ',' 평가 '평가' 이글거리 명령 최종 최대 것이다. var = $ 바르바라우에 '셸 코드 및 실행하십시오 이글거리 명령 있는' '.
이 이상 과장 '평가' 의 에비니스 경우가 많습니다.
그래, 우리가 잘 알고 있지만, 적어도 it& # 39 의 불안하다고요 it& # 39 의 불안하다고요.
많은 다른 명령과의 않을 경우 이 같은 코드 평가하여 쉘로 인수만 살균, 따라 쉘로), ' [' 일명 'test', '익스포트를', 'printf', GNU 'sed', '있다', 그리고 물론 'sh' / '펄' 와 '/' 통역사 모두 내주었다.
예 (사용하여 여기에 'uname' 와 'a' 도 '와' $ 이글거리 명령 외부에서 웅산티스트 제공하는 데이터):
$ a='$(uname>&2)' sh -c 'eval "echo $a"'
Linux
$ a='x[0$(uname>&2)]' mksh -c 'export "$a=$b"'
Linux
$ a='x[0$(uname>&2)]' ksh93 -c 'printf "%d\n" "$a"'
Linux
0
$ a='x[0$(uname>&2)]' ksh93 -c '[ "$a" -gt 0 ]'
Linux
$ a=$'bar/g;e uname>&2\n;s//'; echo foo | sed "s/foo/$a/g"
Linux
bar
$ a='";system("uname");"'; awk "BEGIN{print \"$a\"}"
Linux
$ a=';uname'; sh -c "echo $a"
Linux
Sed ',' 그 '익스포트를'. # 39 의 명령 때문에 더 위험한 it& 동안 간주할 수 있습니다. ',' 평가 '$ $ var" 명백하네 " 하면 컨텐트에서 var' s not to be 평가되고 있는, 그래서 명백하네 it& # 39, sed " 쉘로 코드 ',' 또는 's / foo / $ $ var = value" " 익스포트합니다 var/"' 또는 ' [" $ var";;; gt 0] '. # 39 는 이 데인저우스티 it& 동일하지만, s 감춰집니다 이 다른 명령과의.
<! - 모든 언어: 쉬 >.
eval 은 셸 명령을 대개 구축됩니까 비호환성의 내장. Posix 의 일환으로 it 나열되는지 없다는 ", 2.14. 입력입니다 특수 내장 Utilities"] [특수] 의 [" eval";] [eval]. 어떤 내장 고말은 입니다. 이 용어는 " built-in" >;; 셸 유틸리티 직접 실행할 수 있음을 말해주는 필요가 없습니다. 검색합니다.
간단히 말해. 두 번 입력선의 만드는 것으로 분석되었다.
팔로우 수 있는 일련의 단계를 " process", 셸 있다. 선. [이걸봐 이미지] [크리스티파스] 와 실현할 수 있는 유일한 줄이 eval 올라간다, 다시 1 단계, 왼쪽에 있습니다. [(Posix 설명] 에서 셸린트로:
>. 2.1 쉘로 뚭컻 >. 1. 셸 읽습니다 입력입니다. >. 2. 셸 스스로 입력되는 토큰: 말과 연산자 >. 3. 셸 명령을 받아 분석하고 단순 정보 제공 및 복합. >. 4. 셸 향상합니다 다양한 확장 (별도). >. 5. 셸 향상합니다 리디렉션을 종합유선방송사업자 (so) 와 그들의 피연산자로 제거하고 리디렉션을 매개변수에서 목록. >. 6. 셸 실행하므로 함수, 내장, 실행 파일 또는 스크립트입니다. >. 7. 셸 명령을 기다리는 수집하고 선택적으로 완료하십시오 종료 상태. 6 단계에서 내장현 실행됨을. Eval 이 선을 보내 처리됩니까 6 단계에서 1 단계. 실행 중인 것이 유일한 찼음을 e0100042.log 전으로 거슬러 올라간다. >. 그래서 나는 기도하라주여 Twice. 함께 충족되었으며 입력선의 eval 은 구문 분석
그리고 가장 중요한 것은 효과 이해하기 힘들다. 한 것이 첫 번째 단계를 7 시간 낮음-1 선 위에서 설명한 말을 인용해 쉘로 적용되고 있다. Δ1 4 단계 (확장), 또한 [일련의 단계를 모두 수행할 수 있는 확장] [확장], 마지막에 원하는거요 쿼트에 제거 : >. 항상 수행됨 쿼트에 제거 불지옥으 마지막. 그래서 항상 있어 한 가지 수준의 관계자의 말을 인용, "라고 언급하였다.
그 첫 번째 효과, 추가 / 다른 부분으로 라인을 따라 낮음-1 쉘로 구문 분석 및 다른 모든 단계를 노출돼 있다.
간접 실행할 수 있는 확장:
a=b b=c ; eval echo \$$a ### shall produce "c"
왜? $ '는' 의 첫 번째 때문에, 첫 번째 반복 보도했다. 이에 따라 확장을 위한 것이 무시됨 쉘입니다. $ '다음' 의 이름을 가진 a 는 b" 깔의 ";). 그 후, 1 단계 quote 는 $ '처음' 재거됨 userdic. 따옴표로 표시하지 않은. 첫 번째 루프지 끝 그런, 두 번째 루프 작업자쪽에서 구체화하십시오 'b' 는 $ 읽은 쉘입니다. 그 후, c" " 확대했다. 그리고 인수로 주어진 '에코'. &Quot 위해 see"; 어떤 eval 의 첫 번째 루프 (추후 다시 평가하실) 을 사용하여 에코 생산할 예정이다. 모든 프로그램은 명령 / 또는 / 스크립트입니다 인수만 극명하게 보여준다.
$ a=b b=c
$ eval echo \$$a;
c
에코 (echo) 에 의해 복귀시킴 eval " see"; 무슨일인거죠:
$ echo echo \$$a
echo $b
또한, 가능한 모든 " 표시하십시오 parts". 선이 있다.
$ printf '<%s> ' echo \$$a
<echo> <$b>
이 예에서 변수, 하지만 이 하나만 있는 에코 및 원-부트 너희에게베풀어진 평가 시 수 있도록 더 복잡한 건.
비활성화해야 밝혔다. 위의 코드에서 닮았냐구 실수가 없다. 쉽냐구요: 몇 가지 의견이 없습니다. 어떻게? 할 수 있습니다. # 39 의 간단한 let& com/go/4e6b330a_kr 변경하십시오 아닌 코드):
$ a=b b="hi jk"
$ eval echo \$$a
hi jk
지켜보리니 부족한 공간? 이는 '가치' 는 b 에서 $ 인사이드라면 분할합니다 쉘입니다. 이 경우, 시도하시겠습니까 설득할 수 없는 있습니다.
$ a=b b="hi * jk"
$ eval echo \$$a ### warning this will expand to the list
### of all files in the present directory.
누각되었습니다 따옴표. 이를 제대로 (추가 내부 및 외부 ',', ',' " $ a" \" 인용). 이 시도하시겠습니까 () 는 완벽하게 안전한):
$ a=b b="hi * jk"
$ eval echo \" \$"$a" \"
hi * jk
>. 맨페이지를 없는 일이다. 아니, 없는 비종속 맨페이지 엔드입니다. 심지어 '때마침' 평가 '를 통해 수작업식 검색하겠습니다 양반이군요 - f' show 평가 항목 없음. 배시 '사람' 이 안에 포함되어 있다. 있는 그대로 어떤 빌트인. 내장 COMMANDS" 쉘로 검색하겠습니다 "; 다음 eval" 대한 ";). 쉽게 도움을 받을 수 있다. Bash, '평가' 할 수 있는 내장현 대한 도움말을 통해 볼 수 있습니다.
텍스트 바인딩하면 코드를 동적으로 있기 때문이다. 이를 정리하면 다음과 같습니다. 이 목록은 해당) 에서 인수 (인수 및 / 또는 확장 등) 를 수행되 할말이다 어떠한 이유로든 인수를 통해 공격자가 공격자가 코드 실행 설정되었습니다 것입니다. 심지어 간단해진다는 정의된 eval 틀렸다니까 말하고 있는 자 중 하나 또는 여러 개의 값을 인수만: >. C& # 39, 몬족, 여기 앉아서 넣지 명령행을, 내아기마저도 autoexec. it with my powers. 에로남이네 불안하다고요? 분명한 것은 누구나 할 수 있다. Eval 안전 규칙을 합니다.
읽기 [자세한 내용 여기서요] (http://mywiki.wooledge.org/BashFAQ/048).
~ ad/documentation/bash_shell/bash3-chp-7-sect-3.html [크리스티파스]: