Comment tester une liste d'URLs en batch ou PS avec log ?

Comment tester une liste d'URLs en batch ou PS avec log ? - Shell/Batch - Programmation

Marsh Posté le 19-04-2021 à 18:34:35    

Bonsoir à toutes et à tous,  
 
Je dois tester pour un client une liste d'une grosse centaine d'URLs pour voir si les liens sont actifs, avec sortie vers un log ou un fichier txt (ou csv) récapitulatif, et je cherche à automatiser le truc parce que j'ai en gros une soixantaine d'UO depuis lesquelles je dois faire ce test, histoire d'être sûr que tous les utilisateurs pourront se connecter aux sites en question.  
 
J'ai trouvé quelques idées de batch ou de PowerShell ici ou là, mais rien qui me permette, et de tester les URLs, et de renvoyer leur statut HTML (200, 403, 404, etc...), et de faire ressortir tout ça sous forme de fichier txt, log ou csv.  
 
Idéalement, il faudrait que pour chaque URL testée, le code HTML renvoyé apparaisse en bout de ligne, mais que le script ne s'interrompe pas en cas d'erreur (404 ou autre).  
 
Je maîtrise un tout petit peu batch, très peu PowerShell, mais j'ai envie d'apprendre. En revanche, je suis un peu pris par le temps pour ce job...  :ange:  
 
J'attends avec impatience de vous lire !

Reply

Marsh Posté le 19-04-2021 à 18:34:35   

Reply

Marsh Posté le 19-04-2021 à 20:27:07    

Python3, soit en natif soit en s'appuyant sur wget/curl. A voir ce qui est plus facile à coder.

Reply

Marsh Posté le 19-04-2021 à 22:08:05    

Bonjour,
 
Voilà une solution en batch basée sur curl :
 

Code :
  1. @echo off
  2. mode con cols=160
  3. setlocal enabledelayedexpansion
  4. if not exist "liste_url.txt" (exit /b 1)
  5. for /f "delims=" %%E in (liste_url.txt) do (
  6. set "result="
  7. for /f "delims=" %%A in ('curl --max-time 30 -I -s -S -k "%%~E" 2^>^&1') do if not defined result (set "result=%%A" )
  8. echo. & echo.%%~E ##### !result! #####
  9. )
  10. echo. & pause
  11. exit


 
Le fichier liste_url.txt doit se trouver dans le même dossier que le script.
 
Après avoir testé si tout fonctionne comme tu le souhaites, tu auras juste à ajouter une redirection vers un fichier texte ou un fichier .csv

Message cité 1 fois
Message édité par kyurakushunsui le 19-04-2021 à 22:18:10
Reply

Marsh Posté le 19-04-2021 à 22:35:55    

kyurakushunsui a écrit :

Bonjour,
 
Voilà une solution en batch basée sur curl :
 

Code :
  1. @echo off
  2. mode con cols=160
  3. setlocal enabledelayedexpansion
  4. if not exist "liste_url.txt" (exit /b 1)
  5. for /f "delims=" %%E in (liste_url.txt) do (
  6. set "result="
  7. for /f "delims=" %%A in ('curl --max-time 30 -I -s -S -k "%%~E" 2^>^&1') do if not defined result (set "result=%%A" )
  8. echo. & echo.%%~E ##### !result! #####
  9. )
  10. echo. & pause
  11. exit


 
Le fichier liste_url.txt doit se trouver dans le même dossier que le script.
 
Après avoir testé si tout fonctionne comme tu le souhaites, tu auras juste à ajouter une redirection vers un fichier texte ou un fichier .csv


 
Merci, je vais tester ça demain !

Reply

Marsh Posté le 20-04-2021 à 06:44:17    

UglyStuff a écrit :


 
Merci, je vais tester ça demain !


 
Hello !  
 
Bon, je teste en ce moment-même, mais j'ai un problème quand il s'agit d'exporter l'output vers un fichier que j'ai appelé "results.txt" : que je mette "> results.txt" ou ">> results.txt" (après avoir manuellement créé le fichier à la racine du dossier d'où je lance le script), le fichier "results.txt" reste vierge...  
 
(Je précise que je ne mets pas de guillemets autour du nom dans le script.)  
 
Comment faire pour exporter le résultat du cURL ?

Reply

Marsh Posté le 20-04-2021 à 09:23:20    

L'url se trouve dans la variable %%E, le résultat de curl se trouve dans la variable %%A puis dans la variable !result!
 
Il suffit donc de rediriger comme ceci :

Code :
  1. @echo off
  2. mode con cols=160
  3. setlocal enabledelayedexpansion
  4. if not exist "liste_url.txt" (exit /b 1)
  5. type nul >results.txt
  6. for /f "delims=" %%E in (liste_url.txt) do (
  7. set "result="
  8. for /f "delims=" %%A in ('curl --max-time 30 -I -s -S -k "%%~E" 2^>^&1') do if not defined result (set "result=%%A" )
  9. echo. & echo.%%~E ##### !result! #####
  10. echo.%%~E ##### !result! #####>>results.txt
  11. )
  12. echo. & pause
  13. exit


 
Pas besoin de créer à la main le fichier results.txt il se crée tout seul.
 
Si jamais tu as besoin de tester le certificat SSL/TLS associé au domaine de l'url, tu peux supprimer l'option -k de curl, ainsi il te signalera par exemple l'utilisation d'un certificat auto signé mais en contrepartie tu n'auras plus le status HTML du site.

Message cité 1 fois
Message édité par kyurakushunsui le 20-04-2021 à 09:36:18
Reply

Marsh Posté le 20-04-2021 à 18:24:26    

kyurakushunsui a écrit :

L'url se trouve dans la variable %%E, le résultat de curl se trouve dans la variable %%A puis dans la variable !result!
 
Il suffit donc de rediriger comme ceci :

Code :
  1. @echo off
  2. mode con cols=160
  3. setlocal enabledelayedexpansion
  4. if not exist "liste_url.txt" (exit /b 1)
  5. type nul >results.txt
  6. for /f "delims=" %%E in (liste_url.txt) do (
  7. set "result="
  8. for /f "delims=" %%A in ('curl --max-time 30 -I -s -S -k "%%~E" 2^>^&1') do if not defined result (set "result=%%A" )
  9. echo. & echo.%%~E ##### !result! #####
  10. echo.%%~E ##### !result! #####>>results.txt
  11. )
  12. echo. & pause
  13. exit


 
Pas besoin de créer à la main le fichier results.txt il se crée tout seul.
 
Si jamais tu as besoin de tester le certificat SSL/TLS associé au domaine de l'url, tu peux supprimer l'option -k de curl, ainsi il te signalera par exemple l'utilisation d'un certificat auto signé mais en contrepartie tu n'auras plus le status HTML du site.


 
Je viens juste de lire ta réponse, mais entre temps, j'avais un peu modifié le script en y ajoutant un ">results.txt" à la fin et en supprimant "echo. & pause" et "exit".  
 
Ça marche très bien... Quand cURL est installé sur les machines... On a un parc mixte W10 et W7, et sur ces dernières, cURL n'est pas installé, et l'installer au cas par cas serait trop compliqué.  
 
Va falloir que je trouve une parade à ça demain. Y'a bien un cURL portable sur GitHub, je crois, mais j'aimerais éviter de soulever quelques drapeaux chez les admins...  :D

Reply

Marsh Posté le 20-04-2021 à 21:10:59    

Dommage j'avais fait il y a quelques semaines un script pour justement telecharger et decompresser la derniere version de curl automatiquement, malheureusement mon ssd intel vient de me lacher cet apres-midi apres 7 ans de service. Je re-ecrirai le script quand j'aurai un windows sous la main (normalement ce week-end si tout va bien)

Reply

Marsh Posté le 20-04-2021 à 22:03:04    

kyurakushunsui a écrit :

Dommage j'avais fait il y a quelques semaines un script pour justement telecharger et decompresser la derniere version de curl automatiquement, malheureusement mon ssd intel vient de me lacher cet apres-midi apres 7 ans de service. Je re-ecrirai le script quand j'aurai un windows sous la main (normalement ce week-end si tout va bien)


 
Je serais preneur, même si je pense que le proxy va probablement bloquer ce genre de requête. C'est vraiment dommage que cURL ne soit pas installé de base dans W7.

Reply

Marsh Posté le 21-04-2021 à 22:59:26    

En utilisant AutoIt et le composant soit internet explorer soit le composant network (de mémoire), doit y avoir moyen de faire la même chose je pense.
Sinon, via du PHP avec un environnement uWamp portable qui intègre cUrl. Même principe que proposé : un fichier txt qui contient les urls à tester, une boucle for et le résultat dans un autre fichier txt.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-04-2021 à 22:59:26   

Reply

Marsh Posté le 22-04-2021 à 06:57:31    

rufo a écrit :

En utilisant AutoIt et le composant soit internet explorer soit le composant network (de mémoire), doit y avoir moyen de faire la même chose je pense.
Sinon, via du PHP avec un environnement uWamp portable qui intègre cUrl. Même principe que proposé : un fichier txt qui contient les urls à tester, une boucle for et le résultat dans un autre fichier txt.


Merci pour l'info, je vais regarder tout ça. Je ne suis pas très fort en PHP, mais je vais voir s'il y a moyen de...

Reply

Marsh Posté le 24-04-2021 à 00:36:36    

Salut j'ai enfin pu réparer mon pc, si tu es toujours intéressé j'ai repris le script de mon précédent message mais en incorporant curl à l'intérieur, je pense que ce sera plus pratique pour toi plutôt que de devoir télécharger curl sur chaque poste windows 7.
Le script est trop long pour être posté sur le forum, je te donne un lien de téléchargement : https://we.tl/t-vZZ7NxqTnx
 
Si tu as des questions n'hésite pas.

Reply

Marsh Posté le 24-04-2021 à 08:23:20    

kyurakushunsui a écrit :

Salut j'ai enfin pu réparer mon pc, si tu es toujours intéressé j'ai repris le script de mon précédent message mais en incorporant curl à l'intérieur, je pense que ce sera plus pratique pour toi plutôt que de devoir télécharger curl sur chaque poste windows 7.
Le script est trop long pour être posté sur le forum, je te donne un lien de téléchargement : https://we.tl/t-vZZ7NxqTnx
 
Si tu as des questions n'hésite pas.


Salut !  
 
J'ai récupéré le script, je testerai ça au boulot lundi et je te dirai ce qu'il en retourne. Merci et bon week-end !

Reply

Marsh Posté le 24-04-2021 à 09:01:34    

J'ai oublié de préciser que c'est curl en version 64bits que j'ai incorporé, je vais préparer une version 32 bits ça pourrait être utile.  

Reply

Marsh Posté le 24-04-2021 à 10:06:17    

Voilà j'ai terminé, je mets les nouveaux liens :
 
- version 32 bits : https://we.tl/t-uFiv72qrih
 
- version 64 bits : https://we.tl/t-q0B0ouC3FP
 
Pour éviter d'éventuels problèmes de compatibilité, je te recommande la version 32 bits.

Message cité 1 fois
Message édité par kyurakushunsui le 24-04-2021 à 10:09:58
Reply

Marsh Posté le 24-04-2021 à 11:37:41    

Perso, je fais la même chose via un script bash (qui appelle Curl), dans un shell msys si je suis sur une bécane windows
J'ai des republications de tous les documents d'un certain type sur les 3 dernières années (entre 5000 et 6000 documents), le code de ma republication envoie les fichiers a republier dans un système qui va les publier sur plusieurs sites différents (en plus de générer plein d'indexation pour la recherche sur ces sites).
Pour voir si tous mes documents sont bien arrivés (j'ai une correspondance nom du fichier source, nom du fichier sur tel site, ça aide) un coup de curl -I pour vérifier que chaque document est la, en ne demandant que le header, avec détection des erreurs renvoyées par le serveur pour log.
Le script bash permet de m'abstraire de l’environnement win/lin
 
A+,


Message édité par gilou le 24-04-2021 à 11:45:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-04-2021 à 18:06:39    

kyurakushunsui a écrit :

Voilà j'ai terminé, je mets les nouveaux liens :
 
- version 32 bits : https://we.tl/t-uFiv72qrih
 
- version 64 bits : https://we.tl/t-q0B0ouC3FP
 
Pour éviter d'éventuels problèmes de compatibilité, je te recommande la version 32 bits.


Merci pour tous tes efforts ! Toutes les bécanes du parc sont en 64-bit, je pense, mais je testerai les deux au cas où. Encore merci, et profite de ce qu'il te reste de week-end !  :D  :bounce:

Reply

Marsh Posté le 26-04-2021 à 18:41:31    

rorosk a écrit :

J'arrive 10 ans après la bataille, mais il y a tout ce qu'il faut en PowerShell Core (donc version 7, pas la version 5 car le commutateur SkipHttpErrorCheck n'existe pas) :
 

gc ".\listes.txt" | % { [PSCustomObject]@{ URL = $_; Status = try { (Invoke-WebRequest $_ -SkipHttpErrorCheck).StatusCode } catch { $_ } } } | ConvertTo-Csv -Delimiter ";"


 
Edit : listes.txt : une URL par ligne.


Oui, ça fonctionne sur des postes sous W10, mais pas sur tous ceux encore en W7, et il y en a pas mal. J'avais testé un hybride batch-PS qui faisait très bien le job, en effet, mais uniquement sur les postes en W10, du coup j'ai dû changer mon fusil d'épaule.

Reply

Marsh Posté le 27-04-2021 à 12:00:43    

Un truc comme ça devrait le faire en Windows PS (pas core) :

Code :
  1. function Test-Url {
  2.     param (
  3.         [System.Uri]$Url,
  4.         [switch]$NoFollowRedirections
  5.     )
  6.     try {
  7.         if ($NoFollowRedirections) {
  8.             $r = (Invoke-WebRequest -Uri $Url -Method HEAD -MaximumRedirection 0 -ErrorAction Ignore -UseBasicParsing )
  9.         }
  10.         else {
  11.             $r = (Invoke-WebRequest -Uri $Url -Method HEAD -ErrorAction Stop -UseBasicParsing )
  12.         }
  13.         $r.StatusCode
  14.     }
  15.     catch [System.Net.WebException] {
  16.         if ($null -ne $_.Exception.Response) {
  17.             $_.Exception.Response.StatusCode.value__
  18.         }
  19.         else {
  20.             $_.Exception.Status
  21.         }
  22.     }
  23.     catch {
  24.         "ERROR"
  25.     }
  26. }
  27. gc '.\liste.txt' |% { [PSCustomObject]@{ URL = $_; Status = (Test-Url $_) } | ConvertTo-Csv -Delimiter ";"

Reply

Marsh Posté le 28-04-2021 à 07:05:28    

Je@nb a écrit :

Un truc comme ça devrait le faire en Windows PS (pas core) :

Code :
  1. function Test-Url {
  2.     param (
  3.         [System.Uri]$Url,
  4.         [switch]$NoFollowRedirections
  5.     )
  6.     try {
  7.         if ($NoFollowRedirections) {
  8.             $r = (Invoke-WebRequest -Uri $Url -Method HEAD -MaximumRedirection 0 -ErrorAction Ignore -UseBasicParsing )
  9.         }
  10.         else {
  11.             $r = (Invoke-WebRequest -Uri $Url -Method HEAD -ErrorAction Stop -UseBasicParsing )
  12.         }
  13.         $r.StatusCode
  14.     }
  15.     catch [System.Net.WebException] {
  16.         if ($null -ne $_.Exception.Response) {
  17.             $_.Exception.Response.StatusCode.value__
  18.         }
  19.         else {
  20.             $_.Exception.Status
  21.         }
  22.     }
  23.     catch {
  24.         "ERROR"
  25.     }
  26. }
  27. gc '.\liste.txt' |% { [PSCustomObject]@{ URL = $_; Status = (Test-Url $_) } | ConvertTo-Csv -Delimiter ";"



 
Je vais tester ça ce matin, je vous dis ce soir. Merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed