2012-09-01 3 views
-1

J'essaye d'écrire un script bash simple qui utilisera une liste d'un document de texte et boucle chaque URL qui est sur la liste afin de voir ce que le contenu de chaque URL est. Il me permet de cURL 2 sites et crée les documents texte pour le reste, mais il ne télécharge que le premier 2. J'ai déjà réussi à écrire le script qui tire ses IP et les place dans un fichier séparé en utilisant la commande grep. Au début j'ai essayéBash | curl | Curls 2 URL s'arrête puis

#!/bin/bash 
for var in `cat host.txt`; do 
curl -s $var >> /tmp/ping/html/$var.html 
done 

J'ai essayé avec et sans le commutateur silencieux. Je puis essayé ce qui suit:

#!/bin/bash 
for var in `head -2 host.txt`; do 
curl $var >> /tmp/ping/html/$var.html 
wait 
done 
for var in `head -4 host.txt | tail -2`; do 
curl $var >> /tmp/ping/html/$var.html 
done 

Cela essayer de les faire tout en même temps d'arrêt à nouveau après 2

#!/bin/bash 
for var in `head -2 host.txt`; do 
curl $var >> /tmp/ping/html/$var.html 
done 
wait 
for var in `head -4 host.txt | tail -2`; do 
curl $var >> /tmp/ping/html/$var.html 
done 

Cela ferait la même chose, je suis nouveau bash scripts et seulement savoir quelques-unes des bases, toute aide serait appréciée

+1

Est-ce que les URL ont des caractères &? Ou des espaces? – nalply

+0

Non, ils ne contiennent que des lettres, des chiffres et - – redratedcoding

+0

'| tail -2' lui dit d'utiliser seulement les lignes '2' de la sortie; Ce serait une très grande raison pour laquelle il s'arrête après seulement 2. La même chose vaut pour 'head -2'. – newfurniturey

Répondre

0

Commencez par simple: vérifiez que vous êtes en fait itérer sur la liste entière:

# This is the recommended way to iterate over the file. See 
# http://mywiki.wooledge.org/BashFAQ/001 
while read -r var; do 
    echo "$var" 
done < hosts.txt 

Puis ajouter dans l'appel à curl, en vérifiant son statut de sortie

while read -r var; do 
    echo "$var" 
    curl "$var" >> /tmp/ping/html/$var.html || echo "curl failed: $?" 
done < hosts.txt 
0

Vous canaliser dans $ var, ce qui pourrait entraîner un mauvais nom de fichier, en raison des deux barres obliques dans l'URL. De plus, je citerais l'URL. Par exemple, cela fonctionne avec le nom de base de l'URL.

#!/bin/bash 
for var in `cat host.txt`; do 
    name=$(basename $var) 
    curl -v -s "$var" -o "/tmp/ping/html/$name.html" 
done 

Vous pouvez également sauter des lignes vides et commentaires (#)

#!/bin/bash 

file="host.txt" 
curl="curl" 

while read -r line 
    do 
    [[ $line = \#* ]] || [[ -z "${line}" ]] && continue 
    filename=$(basename $line) 
    $curl -s "$line" >> "/tmp/ping/html/$filename.html" 
done < "$file" 
+0

merci, mais cela ne corrige pas le problème que j'ai avec la commande de congélation gel après 2, si son aide il fera apparaître la barre de progression, mais ne téléchargera que le premier 2 et parfois un aléatoire dans la liste sera partiellement téléchargé. le script ne termine pas même avec seulement 3 urls – redratedcoding

+0

Essayez mon exemple verbeux. 'curl -v -s" $ var ">>" ./$ name.html "' Vos appels en tête et en queue limitent le nombre de téléchargements. – pce