インターネット経由で自分のものをダウンロードするためのシェルスクリプトがあります。インターネット上にファイルが存在するかどうかを確認するにはどうすればよいですか?http://192.168.1.1/backup/01012011.zip
存在するかどうか知りたいとしましょうか?ping
コマンドを使用してみましたが、エラーが表示されます/
。
誰かが私を助けることができますか?または別の方法がありますか?
インターネット経由で自分のものをダウンロードするためのシェルスクリプトがあります。インターネット上にファイルが存在するかどうかを確認するにはどうすればよいですか?http://192.168.1.1/backup/01012011.zip
存在するかどうか知りたいとしましょうか?ping
コマンドを使用してみましたが、エラーが表示されます/
。
誰かが私を助けることができますか?または別の方法がありますか?
回答:
確かに別の方法がありますが、これには、インターネット経由でリクエストが行われたときに実際に何が起こるかを理解する必要があります。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」になります。その後、他のコマンドと同じように、このコマンドをシェルでチェーンできます。
cut
コマンド...まだない仕事..今のところ、私はちょうどあなたが何をしたかのようにそれを行う...
curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?
'
を二重引用符()ではなく単一引用符()にすると、多くのバックスラッシュを取り除くことができ"
ます。
--spider
wget のオプションを使用できます。これは実際にファイルをダウンロードするのではなく、そこにあるかどうかを確認するだけです。あなたの例では:
wget --spider http://192.168.1.1/backup/01012011.zip
これは200 OK
、ファイルが存在する404 Not Found
か403 Forbidden
どうか、またはそこに存在しない場合や、ファイルを取得する権限がない場合などのエラーを含むメッセージを返します。
ping
はHTTPリクエストをまったく送信しないことに注意してください。むしろ、ping
「ICMP」と呼ばれるプロトコルを使用して、ホストが到達可能かどうかを判断し、遅延をチェックします。