태그 보관물: scripts

scripts

ping 또는 유사한 명령을 사용하여 인터넷을 통해 파일을 감지하는 방법은 무엇입니까? 파일이 있는지 어떻게

인터넷을 통해 물건을 다운로드하는 쉘 스크립트가 있습니다. 인터넷을 통해 파일이 있는지 어떻게 알 수 있습니까? http://192.168.1.1/backup/01012011.zip존재 여부를 알고 싶 습니까? ping명령 을 사용해 보았지만 오류가 표시 /됩니다. 문자 때문이라고 생각합니다 .

누구든지 나를 도울 수 있습니까? 아니면 다른 방법이 있습니까?



답변

확실히 다른 방법이 있지만 인터넷을 통해 요청이있을 때 실제로 어떤 일이 발생하는지 이해해야합니다. 웹 브라우저에서 페이지를 방문하면 HTTP라는 프로토콜을 사용하여 데이터가 전송됩니다 (그렇기 때문에 http://URL의 시작 부분에 종종 표시 됩니다).

HTTP는 텍스트 기반 프로토콜입니다. 헤더와 요청 본문을 전송하여 클라이언트와 서버간에 정보가 교환됩니다. 헤더에는 요청 및 전송되는 정보에 대한 많은 상태 정보가 포함됩니다. 문제를 해결하는 데 도움이되는 헤더는 실제로 헤더가 아닙니다. 첫 번째 행이며 상태 코드라는 숫자가 들어 있습니다. 이 숫자는 3 자리 숫자이며 상태 정보를 전달합니다. 요청이 성공한 경우 결과는 일반적으로 200입니다 (항상 그런 것은 아님).

한 가지 확실한 점은 요청한 파일이 웹 서버에 존재하지 않으면 서버는 상태 코드 404로 응답해야합니다. 이는 리소스를 찾을 수 없음을 나타냅니다. (호기심을 자극하기 위해 여기 에 HTTP 상태 코드와 그 의미가 있습니다.)

글쎄, 충분한 이론. 터미널에서 어떻게 할 수 있는지 봅시다. 상태 코드를 검사하는 기능을 제공하는 HTTP를 사용하여 요청을 가져 오는 데 유용한 도구는 cbun이며 우분투 저장소에서 사용할 수 있습니다. 다음과 같이 설치할 수 있습니다.

sudo apt-get install curl

설치가 완료되면 다음과 같이 호출 할 수 있습니다.

curl [website]

… 그리고 주어진 URL의 내용이 터미널에 인쇄됩니다. 웹 브라우저가 해당 URL을 방문 할 때 표시되는 정보입니다. 이것이 우리에게 어떻게 도움이됩니까? 자, 명령 플래그를curl 자세히 살펴보십시오 . 매개 변수를 전달하면 --headcURL은 요청의 헤더 반환 합니다 . URL로 시도하십시오. 다음과 같은 형식의 줄 목록이 나타납니다.

header-name: header-value

물론 첫 번째 줄은 이처럼 보이지 않습니다. 앞에서 이야기 한 상태 코드를 기억하십니까? 첫 번째 줄에 세 자리 숫자로 표시됩니다. 우리가해야 할 일은 Perl을 사용하여 첫 번째 줄에서 추출하는 것입니다. Perl의 -e플래그를 사용하여 터미널에서이를 수행 할 수 있습니다. Perl 코드를 Perl 인터프리터에 직접 전달할 수 있습니다. 또한 --silent진행률 표시 줄이 표시되지 않고 Perl 스크립트가 엉망이되지 않도록 cURL ( )에 추가 플래그를 추가해야합니다 .

여기에 우리가 필요한 것은 … 쉘에서 많은 것을 피해야하기 때문에 상당히 복잡합니다.

perl -e "\ $ s = \`curl [URL] --head --silent \`; \ $ s = ~ m / (\\ d {3}) /; print \ $ 1"

이것이 기본적으로하는 일은 cURL로 URL을 가져 와서 상태 코드를 추출하여 인쇄하는 Perl 정규 표현식을 통해 실행하는 것입니다.

이제 확인하려는 파일의 URL에 넣고 ‘404’와 비교하십시오. ‘404’가 표시되면 파일이 존재하지 않는다고 가정 할 수 있습니다.

물론 이것은 터미널에서 조작하기가 매우 어려울 수 있으므로 이해하기 쉽고 실행하기 쉬운 작은 스크립트를 작성할 수 있습니다.

#!/usr/bin/perl

# Get the URL
$url = $ARGV[0];

# Fetch the header
$header = `curl $url --head --silent`;

# Try to find the status code
$header =~ m/(\d{3})/;

# Return the result
exit(0) if $1 == 404;
exit(1);

복사해서 파일에 붙여 넣기 만하면됩니다. 이 예제에서는 파일을 호출합니다 url_check. 그런 다음 다음을 사용하여 파일을 실행 가능하게 만드십시오.

chmod 755 url_check

그런 다음 다음 간단한 명령으로 파일을 확인할 수 있습니다.

./url_check [URL]

서버가 404를 반환하면 반환 값은 ‘0’이고 그렇지 않으면 ‘1’이 반환됩니다. 그런 다음 다른 명령과 마찬가지로 셸에서이 명령을 연결할 수 있습니다.


답변

--spiderwget 옵션을 사용하면 실제로 파일을 다운로드하지 않고 파일이 있는지 확인합니다. 귀하의 예에서 :

wget --spider http://192.168.1.1/backup/01012011.zip

이 중 하나를 포함하는 메시지를 반환합니다 200 OK파일이있는 경우, 또는 오류, 예를 404 Not Found거기 아니라면, 또는 403 Forbidden당신이 그것을 얻을 수있는 권한이없는 경우.


답변

wget http://192.168.1.1/backup/01012011.zip

결과 코드 0은 예, 그렇지 않으면 다른 것을 의미합니다.

스크립트 내에서 $?변수를 사용 하여 결과 코드를 확인할 수 있습니다 .


답변