ping veya benzeri bir komut kullanarak internet üzerinden bir dosyayı nasıl tespit edebilirim?


10

Bazı şeylerimi Internet üzerinden indirmek için bir kabuk betiğim var. İnternet üzerinden bir dosya olup olmadığını nasıl bilebilirim? Var olup http://192.168.1.1/backup/01012011.zipolmadığını bilmek istediğimi varsayalım ? pingKomut kullanmayı denedim , ancak hata gösteriyor, çünkü bu /karakter sanırım .

Biri bana yardım edebilir mi? Ya da başka bir yol var mı?


Hiç pingHTTP isteği göndermediğine dikkat edilmelidir . Daha ziyade, pingbir ana bilgisayarın erişilebilir olup olmadığını belirlemek ve gecikmeyi kontrol etmek için 'ICMP' adlı bir protokol kullanır.
Nathan Osman

Yanıtlar:


8

Kesinlikle başka bir yol var - ancak bu, İnternet üzerinden bir istek yapıldığında gerçekte ne olduğunu anlamayı gerektirir. Web tarayıcınızdaki bir sayfayı ziyaret ettiğinizde, veriler HTTP adlı bir protokol kullanılarak aktarılır (evet, bu yüzden sık sık http://URL'lerin başında görürsünüz ).

HTTP, metin tabanlı bir protokoldür. Bilgi, istemci ve sunucu arasında, üstbilgileri ve ardından istek gövdesini göndererek paylaşılır. Üstbilgiler, istek ve aktarılan bilgiler hakkında birçok durum bilgisi içerir. Sorununuzda size yardımcı olmak için ilginizi çekeceğiniz başlık gerçekten de bir başlık değildir - aktarılan ilk satırdır ve durum kodu adı verilen bir sayı içerir. Bu sayı 3 basamaklıdır ve durum bilgilerini aktarır. Bir istek başarılı olursa, sonuç genellikle 200 olur (her zaman değil - istisnalar vardır).

Kesin olan bir şey var - istediğiniz dosya web sunucusunda yoksa, sunucu 404 durum koduyla yanıt vermelidir. Bu, kaynağın bulunamadığını gösterir. (Merak için buraya HTTP durum kodları ve anlamlarını listesidir.)

Yeterli teori. Bunu terminalde nasıl yapabileceğimizi görelim. HTTP'yi kullanarak durum kodunu inceleme olanağı sağlayan istekleri almak için harika bir araç, Ubuntu depolarında bulunan cURL'dir. Şunlarla kurabilirsiniz:

sudo apt-get install curl

Yükledikten sonra, aşağıdaki gibi çağırabilirsiniz:

curl [website]

... ve belirtilen URL'nin içeriği terminale yazdırılacaktır. Bu, web tarayıcınızın söz konusu URL'yi ziyaret ettiğinde gördüğü bilgidir. Bu bize nasıl yardımcı oluyor? Komuta ait bayraklaracurl yakından bakın . Parametreyi --headiletirsek, cURL yalnızca istekteki başlıkları döndürür . Bir URL ile deneyin. Formun satırlarının bir listesini alırsınız:

header-name: header-value

Tabii ki, ilk satırın böyle görünmediğine dikkat edin. Daha önce bahsettiğimiz durum kodunu hatırlıyor musunuz? İlk satırda üç basamaklı sayı olarak göreceksiniz. Şimdi yapmamız gereken Perl kullanarak ilk satırdan çıkartmaktır - ve -ePerl kodunu doğrudan Perl yorumlayıcısına geçirmemize izin veren Perl bayrağını kullanarak terminalde yapabiliriz . Ayrıca --silent, bir ilerleme çubuğu görüntülemesini ve Perl betiğimizi bozmasını önlemek için cURL ( ) öğesine fazladan bir bayrak eklememiz gerekecek .

İşte ihtiyacımız olan şey ... birçoğu kabuktan kaçma ihtiyacı nedeniyle oldukça karmaşık:

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

Bunun temel olarak yaptığı şey, URL'yi cURL ile almak ve bunu durum kodunu çıkaran ve çıktısını alan bir Perl düzenli ifadesi aracılığıyla çalıştırmaktır.

Şimdi tek yapmanız gereken kontrol etmekte olduğunuz dosyanın URL'sine koymak ve '404' ile karşılaştırmak. Eğer '404' alırsanız, dosyanın mevcut olmadığını varsayabilirsiniz.

Tabii ki, bu terminalde manipüle etmek çok zor olabilir, bu yüzden bunu sadece daha kolay değil aynı zamanda yürütmeyi de kolaylaştıran küçük bir komut dosyası yazabilirsiniz:

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

Bunu kopyalayıp bir dosyaya yapıştırmanız yeterlidir. Bu örnek için dosyayı arayacağım url_check. Daha sonra dosyayı şununla çalıştırılabilir yapın:

chmod 755 url_check

Ardından, aşağıdaki basit komutla herhangi bir dosyayı kontrol edebilirsiniz:

./url_check [URL]

Sunucu 404 ve '1' döndürürse dönüş değeri '0' olur. Daha sonra bu komutu diğer komutlarda yaptığınız gibi kabukta zincirleyebilirsiniz.


teori ve çözüm hakkında çok teşekkürler, ... ama perl kısmı, .. ben sadece basit bir kabuk komut dosyası ile yapmak merak ediyorum, .. çalışma, ....
Egy Mohammad Erdin

@Warung: Şey ... bir kabuk betiğinin yalnızca uzak bir URL'yi sorgulamak için değil, aynı zamanda yanıtı ayrıştırmak için harici bir komut çağırması gerekir.
Nathan Osman

yups ... ve mybe ben cutkomutları ile cevap ayrıştırmak için deneyebilirsiniz ... ama yine de işe yaramaz, .. şimdilik, ben sadece senin yaptığın gibi yapıyorum ..
Egy Mohammad Erdin

@ WarungNasi49: benzeri bir şey curl $url --head --silent | head -n 1 | cut -d ' ' -f 2mi?
zpea

@GeorgeEdison: Güzel cevap! Perl kodunu bash'dan alıntılamaktan bahsettiğiniz gibi: perl ifadenizin etrafında 'çift ​​tırnak ( ") yerine tek tırnak ( ) kullanırsanız çok sayıda ters eğik çizgiden kurtulabilirsiniz .
zpea

13

--spiderDosyayı gerçekten indirmeyen, ancak orada olup olmadığını kontrol eden wget seçeneğini kullanabilirsiniz . Örneğinizde:

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

Bu 200 OK, dosyanın orada olup olmadığını içeren bir ileti veya örneğin 404 Not Foundorada 403 Forbiddendeğilse veya alma izniniz yoksa bir hata döndürür .


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

Sonuç kodu 0, evet anlamına gelir, başka bir şey - hayır.

Komut dosyasının içindeki sonuç kodunu $?değişkenle kontrol edebilirsiniz .


1
Merhaba Mikail! Dönüş değerlerini yorumlamak iyi bir fikirdir. Ancak bu komut sadece dosyanın mevcut olup olmadığını kontrol etmekle kalmaz, tüm dosyayı indirir.
zpea
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.