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.zip
ada atau tidak? Saya sudah mencoba menggunakan ping
perintah, tetapi ini menunjukkan kesalahan, saya kira ini karena /
karakter.
Adakah yang bisa membantu saya? Atau ada cara lain?
command-line
scripts
ping
Egy Mohammad Erdin
sumber
sumber
ping
tidak mengirim permintaan HTTP sama sekali. Sebaliknya,ping
menggunakan protokol yang disebut 'ICMP' untuk menentukan apakah host dapat dijangkau dan untuk memeriksa latensi.Jawaban:
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:
Setelah diinstal, Anda dapat menjalankannya seperti:
... 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
curl
perintah . Jika kami melewati parameter--head
, cURL hanya akan mengembalikan header dari permintaan. Cobalah dengan URL. Anda akan mendapatkan daftar garis formulir: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
-e
flag 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:
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:
Cukup salin dan tempel ke file. Untuk contoh ini, saya akan memanggil file
url_check
. Kemudian buat file tersebut dapat dieksekusi dengan:Kemudian Anda dapat memeriksa file apa pun dengan perintah sederhana berikut:
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.
sumber
cut
perintah ... tetapi masih belum berfungsi, .. untuk saat ini, saya lakukan saja seperti yang Anda lakukan ..curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) alih-alih tanda kutip ganda ("
) di sekitar ekspresi perl Anda.Anda dapat menggunakan
--spider
opsi 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 OK
jika file ada di sana, atau kesalahan, misalnya404 Not Found
jika tidak ada di sana, atau403 Forbidden
jika Anda tidak memiliki izin untuk mendapatkannya.sumber
Kode hasil 0 berarti ya, sesuatu yang lain - tidak.
Anda dapat memeriksa kode hasil di dalam skrip dengan
$?
variabel.sumber