2010-01-11 7 views
4

J'utilise un script pour extraire des données XML sur une URL d'authentification requise avec WGET.Pourquoi WGET renvoie-t-il 2 messages d'erreur avant de réussir?

Ce faisant, mon script produit la sortie suivante pour chaque URL accessible (adresses IP et les noms d'hôtes modifiés pour protéger les coupables):

> Resolving host.name.com... 127.0.0.1 
> Connecting to host.name.com|127.0.0.1|:80... connected. 
> HTTP request sent, awaiting response... 401 Access denied 
> Connecting to host.name.com|127.0.0.1|:80... connected. 
> HTTP request sent, awaiting response... 401 Unauthorized 
> Reusing existing connection to host.name.com:80. 
> HTTP request sent, awaiting response... 200 OK 

Pourquoi WGET se plaignent que l'accès à l'URL échoue deux fois avant de se connecter avec succès? Y a-t-il un moyen de le fermer ou de le connecter correctement dès le premier essai?

Pour référence, voici la ligne que je me sers pour appeler WGET:

wget --http-user=USERNAME --password=PASSWORD -O file.xml http://host.name.com/file.xml 
+1

peut-il y avoir plus d'une méthode d'authentification .. la méthode un et deux échouent, la troisième tentative réussit? – lexu

+0

@lexu - Une possibilité, mais comment puis-je déterminer quelle méthode mon serveur utilise, et comment puis-je spécifier à WGET d'utiliser celui-là en premier? – Dinedal

+0

Si vous donnez wget le commutateur -d, il vous montrera le texte intégral de chaque demande et réponse. –

Répondre

4

Cela semble être par la conception. Suivant les conseils de @Wayne Conrad, j'ai ajouté le commutateur -d et j'ai pu constater que la première tentative échouait parce que NTLM était nécessaire, et la deuxième tentative échouait parce que la première tentative NTLM n'était que de niveau 1, où un défi NTLM de niveau 3 réponse était nécessaire. WGET fournit enfin l'authentification nécessaire à la troisième tentative. WGET obtient un cookie pour empêcher la ré-authentification pour la durée de la session, ce qui empêcherait cela si la connexion n'était pas terminée entre les fichiers. Je devrais passer WGET une liste de fichiers pour que cela se produise, mais je suis incapable de le faire parce que je ne connais pas les noms de fichiers à l'avance.

2

Vous semblez avoir une nouvelle version de wget. Après 1.10.2, wget n'enverra pas d'authentification à moins d'avoir été contestée par le serveur en premier. Et c'est pourquoi le premier échoue. La seconde est la cause défaillante de ce que vous avez décrit.

Vous pouvez réduire l'un d'eux en ajoutant le paramètre --auth-no-challenge. Cela envoie le premier en "basic" qui échouera et le second sera envoyé en mode "digest". Ce qui devrait fonctionner.