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


10

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

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


주목해야한다 pingHTTP 모두에서 요청을 보내지 않습니다. 오히려 ping'ICMP'라는 프로토콜을 사용하여 호스트에 연결할 수 있는지 여부를 확인하고 대기 시간을 확인하십시오.
— Nathan Osman

답변:


8

확실히 다른 방법이 있지만 인터넷을 통해 요청이있을 때 실제로 어떤 일이 발생하는지 이해해야합니다. 웹 브라우저에서 페이지를 방문하면 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'이 반환됩니다. 그런 다음 다른 명령과 마찬가지로 셸에서이 명령을 연결할 수 있습니다.


덕분에 너무 많은 이론과 솔루션, ...하지만 펄 부분에 대한 .. 난 그냥 간단한 쉘 스크립트를 만들어 궁금해 .. 작업에 ...
— Egy 공급 모하마드 Erdin

@Warung : 음 ... 쉘 스크립트는 원격 URL을 쿼리 할뿐만 아니라 응답을 구문 분석하기 위해 외부 명령을 호출해야합니다.
— Nathan Osman

yups ... 그리고 내가 가진 구문 분석 응답을 시도 할 수 있습니다 mybe cut명령 ...하지만 아직도 작업 .. 지금, 난 그냥 당신이 무슨 짓을했는지처럼 그렇게 ...
— Egy 공급 모하마드 Erdin

@ WarungNasi49 : 같은 것 curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
— zpea

@GeorgeEdison : 좋은 답변입니다! bash에서 perl 코드 인용을 언급했듯이 : perl 표현식 주위 '에 큰 따옴표 ( ") 대신 작은 따옴표 ( )를 사용 하면 많은 백 슬래시를 제거 할 수 있습니다 .
— zpea

13

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

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

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


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

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

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


1
안녕 미카 일! 반환 값을 해석하는 것이 좋습니다. 그러나이 명령은 사용 가능한지 확인하는 것이 아니라 전체 파일을 다운로드합니다.
— zpea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.