eval을 사용하여 변수에서 명령 실행

eval을 사용하여 변수에서 명령 실행

grep을 사용하여 일부 로그 파일에 색상을 지정하려고 합니다. 나는 다음과 같은 스크립트를 작성했습니다.

#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' $log |less -R"
log="/var/log/syslog"
eval $com

실행 중에 $log가 누락되었습니다!

나는 이것을 시도했습니다 :

#!/bin/bash
com="`GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' $log |less -R`"
log="/var/log/syslog"
eval $com

아무 일도하지!

내 코드에 어떤 문제가 있는지 알 수 있나요?

답변1

사용하지 마세요eval.

여기서는 완전히 피할 수 있습니다.

function color_log() {
  log=$1
  GREP_COLOR="1;36" egrep --color=always '[^a-zA-Z0-9]' $log | less -R
}

color_log "/var/log/syslog"

답변2

첫 번째 스크립트에서 이스케이프해야 합니다 $.$log

#!/bin/bash
com="GREP_COLOR=\"1;36\" egrep --color=always  '[^a-zA-Z0-9]' \$log |less -R"
log="/var/log/syslog"
eval $com

편집하다:

이 특별한 경우에는 실제로 사용할 필요가 없으므로 evalДМИТРИЙ와 같은 대안적이고 안전한 방법을 선호하는 것이 좋습니다. 반면에 설계오류는 eval먼저 사용하다가 해결한 코딩오류는 참고가 되지 않았습니다 $log. eval관련된 모든 취약점으로 인해 확실히 합법적인 부정적인 언론 보도가 있지만, 이는 여전히 알 가치가 있는 매우 강력한 지침입니다 . 주의 깊게 작성된 평가는 악의적이거나 우발적인 코드 실행을 방지할 수 있습니다.

관련 정보