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.