내 Perl 백 티크가“SH : LINE 1 : Any : 명령을 찾을 수 없음”을 불평하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1851213

  •  13-09-2019
  •  | 
  •  

문제

나는 이전에 프로그래밍 한 적이 없지만 작업을 위해 매우 간단한 웹 앱을 작성해야했습니다.

이 발굴 쿼리를 작동 시키려고 노력하고 있습니다.

dig @8.8.8.8 +nocomments +nostats +noquestion +nocmd google.com any

이 비트의 perl과 함께 :

$dig = `/usr/bin/dig \@8.8.8.8 +nocomments +nostats +noquestion +nocmd $query any`;

DIG의 끝에서 "다른"을 인식하지 못하는 것 외에는 다음과 같습니다.

sh: line 1: any: command not found

내가 잘못하고있는 것은 어리석게 단순한 일입니까?

도움이 되었습니까?

해결책

나는 내기 $query 그것에 새로운 라인이있어 껍질이 보이게합니다. any 새로운 명령으로.

시도해보십시오 chomp $query; 시스템이 전화하여 Newline을 제거합니다. 더 chomp.

다른 팁

아마 사용해야합니다 dig ... '$query' 따라서 쉘이 볼 때 단일 인용됩니다. 그렇게하지 않으면 껍질은 메타 카라스터를 해석합니다. 누군가가 넣으면 "; echo my_key > ~/.ssh/authorized_keys" 웹 양식으로, 당신은 망가졌습니다. 내부 사용 만 사용하더라도 누군가가 쿼리에 공백이있는 무언가를 넣으면 쉘이 단어를 분명하고 두 개의 Args로 파기 위해 전달됩니다.)

Perl을 사용할 수 있습니다

\Q$query\E
잠재적 인 metacharacter 에 대한 $ query를 확장하기 위해. 실제로, 그것은 단일 따옴표를 추가하는 것보다 훨씬 낫습니다. 쿼리에 단일 쿼트 문자가 포함되어 있으면 따옴표에서 벗어날 수 있습니다. 여전히 공격하기가 매우 어렵습니다. 이것 그것을 당신의 기억에 고정해야합니다.

Perl은 System () 함수를 사용하여 Args를 문자열 목록으로 지정하는 안전한 방법을 가지고 있으며, 하나는 쉘 명령으로 평가 될 하나가 아닌 /bin /sh를 피하십시오. 이것은 가장 안전한 방법이지만 Pipe && Fork && 직접 수행하지 않고는 백 틱 버전이 없습니다.

아마도 그것은 아마도 $ query 변수에있는 명령 문자열을 깨뜨리는 것입니다. 실패하고 오류를주는 예를 제공 할 수 있습니까? 아니면 스크립트를 조금 더 보여 주시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top