bagaimana cara mendeteksi file melalui internet menggunakan ping atau perintah serupa?

10

Saya memiliki skrip shell untuk mengunduh beberapa barang saya melalui Internet. Bagaimana saya bisa tahu jika ada file melalui Internet? Katakanlah saya ingin tahu apakah http://192.168.1.1/backup/01012011.zipada atau tidak? Saya sudah mencoba menggunakan pingperintah, tetapi ini menunjukkan kesalahan, saya kira ini karena /karakter.

Adakah yang bisa membantu saya? Atau ada cara lain?

Egy Mohammad Erdin
sumber
Perlu dicatat bahwa pingtidak mengirim permintaan HTTP sama sekali. Sebaliknya, pingmenggunakan protokol yang disebut 'ICMP' untuk menentukan apakah host dapat dijangkau dan untuk memeriksa latensi.
Nathan Osman

Jawaban:

8

Tentu ada cara lain - tetapi ini membutuhkan pemahaman apa yang sebenarnya terjadi ketika permintaan dilakukan melalui Internet. Ketika Anda mengunjungi halaman di browser web Anda, data ditransfer menggunakan protokol yang disebut HTTP (ya, inilah sebabnya Anda akan sering melihat http://di awal URL).

HTTP adalah protokol berbasis teks. Informasi dipertukarkan antara klien dan server dengan mengirimkan header diikuti oleh tubuh permintaan. Header berisi banyak informasi status tentang permintaan dan informasi yang ditransfer. Header yang akan membuat Anda tertarik untuk membantu Anda dengan masalah Anda sama sekali bukan header - itu adalah baris pertama yang ditransfer dan berisi nomor yang disebut kode status. Nomor ini adalah 3 digit dan menyampaikan informasi status. Jika permintaan berhasil, hasilnya biasanya 200 (tidak selalu - ada pengecualian).

Satu hal yang pasti - jika file yang Anda minta tidak ada di server web, server harus membalas dengan kode status 404. Ini menunjukkan bahwa sumber daya tidak dapat ditemukan. (Untuk yang penasaran, berikut adalah daftar kode status HTTP dan artinya.)

Cukup teori. Mari kita lihat bagaimana kita bisa melakukan ini di terminal. Alat hebat untuk mengambil permintaan menggunakan HTTP yang juga memberi kami kemampuan untuk memeriksa kode status adalah cURL, yang tersedia di repo Ubuntu. Anda dapat menginstalnya dengan:

sudo apt-get install curl

Setelah diinstal, Anda dapat menjalankannya seperti:

curl [website]

... dan konten dari URL yang diberikan akan dicetak ke terminal. Ini adalah informasi yang dilihat browser web Anda ketika mengunjungi URL itu. Bagaimana ini membantu kita? Nah, perhatikan bendera untuk curlperintah . Jika kami melewati parameter --head, cURL hanya akan mengembalikan header dari permintaan. Cobalah dengan URL. Anda akan mendapatkan daftar garis formulir:

header-name: header-value

Perhatikan, tentu saja, baris pertama tidak seperti ini. Ingat kode status yang kita bicarakan sebelumnya? Anda akan melihatnya di baris pertama sebagai angka tiga digit. Yang perlu kita lakukan sekarang adalah mengekstraknya dari baris pertama menggunakan Perl - dan kita bisa melakukannya di terminal menggunakan -eflag Perl yang memungkinkan kita meneruskan kode Perl langsung ke penerjemah Perl. Kami juga perlu menambahkan bendera tambahan ke cURL ( --silent) agar tidak menampilkan bilah progres dan mengacaukan skrip Perl kami.

Inilah yang kami butuhkan ... cukup rumit karena harus keluar dari shell:

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

Apa yang pada dasarnya dilakukan adalah mengambil URL dengan cURL dan menjalankannya melalui ekspresi reguler Perl yang mengekstrak kode status dan mencetaknya.

Sekarang yang Anda butuhkan adalah memasukkan URL file yang Anda periksa dan membandingkannya dengan '404'. Jika Anda mendapatkan '404', Anda dapat menganggap file tersebut tidak ada.

Tentu saja, ini bisa sangat sulit untuk dimanipulasi di terminal, sehingga Anda dapat menulis skrip kecil yang membuat ini tidak hanya lebih mudah dimengerti, tetapi juga lebih mudah untuk dieksekusi:

#!/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);

Cukup salin dan tempel ke file. Untuk contoh ini, saya akan memanggil file url_check. Kemudian buat file tersebut dapat dieksekusi dengan:

chmod 755 url_check

Kemudian Anda dapat memeriksa file apa pun dengan perintah sederhana berikut:

./url_check [URL]

Nilai kembali akan menjadi '0' jika server mengembalikan 404 dan '1' sebaliknya. Anda kemudian dapat rantai perintah ini di shell seperti yang Anda lakukan pada perintah lain.

Nathan Osman
sumber
terima kasih banyak tentang teori dan solusinya, ... tetapi bagian perl, .. saya ingin membuatnya hanya dengan skrip shell sederhana, .. untuk bekerja, ....
Egy Mohammad Erdin
@ Warung: Ya ... skrip shell perlu memanggil perintah eksternal untuk tidak hanya permintaan URL jarak jauh, tetapi juga untuk mengurai respons.
Nathan Osman
ya ... dan saya bisa mencoba mem-parsing respons dengan cutperintah ... tetapi masih belum berfungsi, .. untuk saat ini, saya lakukan saja seperti yang Anda lakukan ..
Egy Mohammad Erdin
@ WarungNasi49: sesuatu seperti curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
zpea
@ GeorgeEdison: Jawaban yang bagus! Seperti yang Anda sebutkan mengutip kode perl dari bash: Anda bisa menghilangkan banyak garis miring terbalik jika Anda tanda kutip tunggal ( ') alih-alih tanda kutip ganda ( ") di sekitar ekspresi perl Anda.
zpea
13

Anda dapat menggunakan --spideropsi wget, yang sebenarnya tidak mengunduh file, tetapi hanya memeriksa apakah ada di sana. Dalam contoh Anda:

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

Ini akan mengembalikan pesan yang berisi 200 OKjika file ada di sana, atau kesalahan, misalnya 404 Not Foundjika tidak ada di sana, atau 403 Forbiddenjika Anda tidak memiliki izin untuk mendapatkannya.

Marios Zindilis
sumber
1
wget http://192.168.1.1/backup/01012011.zip

Kode hasil 0 berarti ya, sesuatu yang lain - tidak.

Anda dapat memeriksa kode hasil di dalam skrip dengan $?variabel.

mikhailgarber
sumber
1
Hai Mikail! Menafsirkan nilai kembali adalah ide yang bagus. Namun perintah ini akan mengunduh seluruh file, bukan hanya memeriksa apakah tersedia.
zpea