2017-05-15 1 views
0

나는 bash 스크립트를 작성 중이다. 다음 awk 명령은 일치하는 항목이 있어도 아무 것도 출력하지 않습니다. $ SEARCH_QUERY를 실제 데이터로 바꿀 때 awk 행을 복사했으며 대화 형 쉘에서 성공적으로 실행됩니다. 이것은 awk이 변수 $ SEARCH_QUERY의 데이터를 올바르게 변환하지 않는다고 생각하게합니다. 이 문제를 해결하는 방법이나 bash 관련 주제를 읽는 방법에 대한 아이디어가 있습니까? 작은 따옴표 그렇게 awk 즉 정규식 자체로 $SEARCH_QUERY을 치료하고, 매개 변수 확장을 억제 - 원래의 코드가 깨진 이유 의 관점에서 당신bash 스크립트 - awk가 정규 변수로 전달 된 변수를 처리하지 않음

search_contacts() 
{ 
    echo "Enter contact Name:" 
    read SEARCH_QUERY 
    awk ' /$SEARCH_QUERY/ { print $0 }' contacts.db 
} 
+1

모든 대문자를 쉘에서 자신의 변수 이름을 사용하지 마십시오 - 예 이름은 OS 또는 쉘 자체에 의미가있는 변수에 사용되지만 소문자 이름은 쉘의 설정 또는 조작과 충돌하지 않습니다. http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html, 네 번째 단락을 참조하십시오. –

+1

원본 코드가 작동하지 않는 경우 - 즉각적인 * 문제는 작은 따옴표 (확장을 억제 함)를 사용한 다음 확장을 사용하여 데이터를 awk 코드로 대체하는 것입니다. 그러나 * 가장 심각한 * 문제는 데이터를 코드로 대체하기 위해 문자열 대체를 사용하는 것이 었습니다. 핵심 부분에서 이것은 주입 취약점의 근원입니다. SQL 인젝션, 셸 인젝션 및 awk 인젝션과 마찬가지로 존재합니다. awk는 셸 명령을 실행할 수 있기 때문에 임의의 내용을 awk 스크립트로 대체하게하는 것은 시스템에서 임의의 명령을 실행시키는 것과 동일합니다. –

+0

찰리 고마워요. awk 옵션 사용 : search_query는 awk에 의해 실행되는 불쾌한 사용자 삽입 코드의 위험을 방지합니까? – GustavMahler

답변

1

감사드립니다. 문자열 SEARCH_QUERY끝을 찾은 후 문자열을 찾으십시오. 아마도 일치 할 수없는 정규식입니다. , 위에서 위험 불안 인 의견에 따라,

# THIS IS DANGEROUSLY INSECURE; DON'T DO THIS EVER 
awk "/$SEARCH_QUERY/" contacts.db 

그러나;

따라서, 순진 접근 방식은 인용 유형을 변경하는 것, 의도 한 대체가 실제로 발생 등 소요 SEARCH_QUERY 값이 정규식 (예 : / 포함)을 종료하면 원하는 임의의 awk 코드를 실행할 수 있습니다. nonmatch/ || system("rm -rf ~") || /anything는 아주 나쁜 일을 할 것입니다. - 가장 좋은 방법의 측면에서


데이터 대역 코드에서 전달해야합니다

awk -v search_query="$SEARCH_QUERY" '$0 ~ search_query' contacts.db 
관련 문제