pingまたは同様のコマンドを使用してインターネット経由でファイルを検出する方法


10

インターネット経由で自分のものをダウンロードするためのシェルスクリプトがあります。インターネット上にファイルが存在するかどうかを確認するにはどうすればよいですか?http://192.168.1.1/backup/01012011.zip存在するかどうか知りたいとしましょうか?pingコマンドを使用してみましたが、エラーが表示されます/

誰かが私を助けることができますか?または別の方法がありますか?


pingはHTTPリクエストをまったく送信しないことに注意してください。むしろ、ping「ICMP」と呼ばれるプロトコルを使用して、ホストが到達可能かどうかを判断し、遅延をチェックします。
Nathan Osman、2011

回答:


8

確かに別の方法がありますが、これには、インターネット経由でリクエストが行われたときに実際に何が起こるかを理解する必要があります。Webブラウザーでページにアクセスすると、データはHTTPと呼ばれるプロトコルを使用して転送されます(そうです。これがhttp://、URLの先頭によく表示される理由です)。

HTTPはテキストベースのプロトコルです。ヘッダーとそれに続くリクエストの本文を送信することにより、クライアントとサーバー間で情報が交換されます。ヘッダーには、リクエストと転送される情報に関する多くのステータス情報が含まれています。問題の解決に役立つヘッダーは、実際にはヘッダーではありません。転送される最初の行であり、ステータスコードと呼ばれる番号が含まれています。この番号は3桁で、ステータス情報を伝えます。リクエストが成功した場合、結果は通常200です(常にではない-例外があります)。

1つ確かなことは、リクエストしたファイルがWebサーバーに存在しない場合、サーバーはステータスコード404で応答する必要があります。これは、リソースが見つからなかったことを示します。(好奇心のために、ここでは HTTPステータスコードとその意味のリストです。)

まあ、十分な理論。端末でこれを行う方法を見てみましょう。ステータスコードを調べる機能も提供するHTTPを使用してリクエストをフェッチするための優れたツールはcURLです。これはUbuntuリポジトリで入手できます。あなたはそれをインストールすることができます:

sudo apt-get install curl

インストールしたら、次のように呼び出します。

curl [website]

...そして指定されたURLのコンテンツが端末に出力されます。これは、WebブラウザーがそのURLにアクセスしたときに表示される情報です。これはどのように役立ちますか?コマンドのフラグをcurlよく見てください。パラメータを渡すと--head、cURLはリクエストからヘッダーのみを返します。URLで試してください。次の形式の行のリストが表示されます。

header-name: header-value

もちろん、最初の行がこのようなものではないことに注意してください。先ほどお話ししたステータスコードを覚えていますか?最初の行に3桁の数字として表示されています。ここで行う必要があるのは、Perlを使用して最初の行から抽出することです。Perlの-eフラグを使用してターミナルで実行できるため、Perlコードを直接Perlインタープリターに渡すことができます。また、cURL(--silent)にフラグを追加して、進行状況バーが表示されてPerlスクリプトがめちゃくちゃにならないようにする必要もあります。

ここに私たちが必要とするものがあります...シェルから多くをエスケープする必要があるため、それは非常に複雑です:

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」になります。その後、他のコマンドと同じように、このコマンドをシェルでチェーンできます。


おかげでそんなに理論とソリューション、...しかし、Perlの一部について、..私は単純なシェルスクリプトでそれを作るために不思議..作業上、....
EGYモハマドErdin

@警告:まあ...シェルスクリプトは、リモートURLをクエリするだけでなく、応答を解析するために外部コマンドを呼び出す必要があります。
Nathan Osman、2011

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 Found403 Forbiddenどうか、またはそこに存在しない場合や、ファイルを取得する権限がない場合などのエラーを含むメッセージを返します。


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

結果コード0は、はい、それ以外の意味-いいえ。

$?変数を使用して、スクリプト内の結果コードを確認できます。


1
ミカイル!戻り値を解釈することをお勧めします。ただし、このコマンドは、ファイルが利用可能かどうかを確認するだけでなく、ファイル全体をダウンロードします。
zpea
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.