OVH Cloud OVH Cloud

Un super script promotionnel (et trollesque) Batch

44 réponses
Avatar
Do Re Mi chel La Si Do
Bonjour !

Je vous ai concocté le script ci-dessous, pour montrer l'incroyable
supériorité du Batch, sur tous les autres langages de script (y compris le
Verlan). Seul Python, AutoIt! et l'Occitan peuvent faire aussi bien.

J'attend, d'ailleurs, les réactions épidermiques, et, forcément partiales
(normal ; yakemoi qui suis, par hypothèse, impartial).

Bref, que fait ce script ? Hé bien, il verrouille un site, par son adresse
IP et un port. Dès que l'on veut s'y connecter, le process est tué (dans les
2 secondes).

Pour tester, j'ai mis l'adresse IP d'un de mes sites : http://ponx.org
Lancez le script dans une invite de commande ; lancez I.E. ; allez sur
http://ponx.org ; constatez.

@+

MCI

PS : le script est prévu pour Windows-XP-Pro en français.





Voilà le script :



@echo off
:: Supprime les process qui se connectent à une adresse IP

set IPDEL=213.186.47.206:80
:: pour tester : http://ponx.org

:SCAN
set PID=
netstat -ano |find "%IPDEL%" >TEMP.TXT
for /F "usebackq tokens=*" %%i in (TEMP.TXT) do (call :STO %%i)
if X%PID%X==XX goto :CONTINUE
call :TRAIT %PID%
:CONTINUE
sleepm 2000
goto :SCAN

:STO
set PID=%5
goto :EOF

:TRAIT
@taskkill /PID %1
goto :EOF

10 réponses

1 2 3 4 5
Avatar
Do Re Mi chel La Si Do
Bon dimanche !


Effectivement, il y a plein d'accolades. Il y a aussi beaucoup de dollars.
On voit bien que Bill Gates ne sait pas quoi en faire (de ses dollars) ;-)

Pour Python, je l'ai fait (voir le message de 19h.37)

Je vais le ré-écrire en AutoIt! pour voir

Sinon, pour les expressions régulières, moi non plus, je ne suis pas très à
l'aise (je n'ai toujours pas pigé le principe de gloutonnerie des
algorithmes).

Et, pour VBS, il y aura bien quelqu'un qui n'a pas d'ampoule grillée...


@-salutations

Michel Claveau
Avatar
Jacques Barathon [MS]
"Do Re Mi chel La Si Do" wrote in message
news:%
Bon dimanche !


Effectivement, il y a plein d'accolades. Il y a aussi beaucoup de dollars.
On voit bien que Bill Gates ne sait pas quoi en faire (de ses dollars) ;-)


En effet, le $ est notamment utilisé pour préfixer les variables, c'est un
peu comme % dans les fichiers de commandes batch. Et pourtant Microsoft
n'est pas payé au pourcentage sur le nombre de variables utilisées dans les
batch, sinon Bill serait ENCORE plus riche qu'il ne l'est! :-)

Pour Python, je l'ai fait (voir le message de 19h.37)


Ah je vois, tu as un peu triché en déléguant quelques tâches à l'invite de
commandes... Pourquoi pas.
D'ailleurs en relisant le mien de script, je me rends compte qu'il n'était
vraiment pas optimisé. On peut le réécrire ainsi:

for (;;) {
$myline=$(netstat -ano|where {$_ -match $ipdel})
if ($myline) {
$procid=$($myline.split()[-1]
if ($procid) {(gps -id $procid).kill()}
}
start-sleep 20
}

Je vais le ré-écrire en AutoIt! pour voir


Ca m'intéresserait de voir.

Jacques

Avatar
~Jean-Marc~ [MVP]
Salutations *Jacques Barathon [MS]* !
Dans <news:
tu nous disais :
Qui le fait en VBS et en Python, qu'on puisse comparer?


OK pour le VBS :

' Uniquement avec cscript

On error resume next

Const IPDel = "213.186.47.206:80"

Set Shell = CreateObject("WScript.Shell")

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!.rootcimv2")

Do While True

Set oExec = Shell.Exec("netstat -no")

Do While Not oExec.StdOut.AtEndOfStream
NStat = oExec.StdOut.ReadLine
if instr(1, NStat, IPDel,1) then
NStat = split(NStat," ")
KillID = NStat(UBound(Nstat))
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where " & _
"Name = 'iexplore.exe' AND " & _
"ProcessID = " & KillID)
For Each objProcess in colProcessList
objProcess.Terminate()
Next
end if
Loop

WScript.Sleep 2000
Loop

Cordialement

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
Jacques Barathon [MS]
Hé oui, c'est très verbieux VBS...

Merci Jean-Marc.

Jacques

"~Jean-Marc~ [MVP]" wrote in message
news:u%
Salutations *Jacques Barathon [MS]* !
Dans <news:
tu nous disais :
Qui le fait en VBS et en Python, qu'on puisse comparer?


OK pour le VBS :

' Uniquement avec cscript

On error resume next

Const IPDel = "213.186.47.206:80"

Set Shell = CreateObject("WScript.Shell")

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!.rootcimv2")

Do While True

Set oExec = Shell.Exec("netstat -no")

Do While Not oExec.StdOut.AtEndOfStream
NStat = oExec.StdOut.ReadLine
if instr(1, NStat, IPDel,1) then
NStat = split(NStat," ")
KillID = NStat(UBound(Nstat))
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where " & _
"Name = 'iexplore.exe' AND " & _
"ProcessID = " & KillID)
For Each objProcess in colProcessList
objProcess.Terminate()
Next
end if
Loop

WScript.Sleep 2000
Loop

Cordialement

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/



Avatar
Do Re Mi chel La Si Do
Bonjour !


Intéressant. Mais, au lieu d'utiliser WMI, tu aurais pu wrapper TaskKill ;
cela aurait été plus court et plus lisible (mais moins techno-frime).

Sinon, je pense qu'une sélection sur le PID seul, aurait été suffisante (et
plus générale) ; au lieu d'utiliser 'iexplore.exe' comme critère (il paraît
qu'il y a des gens qui utilisent d'autres navigateurs...)


@-salutations

Michel Claveau
Avatar
Jacques Barathon [MS]
"Do Re Mi chel La Si Do" wrote in message
news:
Bonjour !


Intéressant. Mais, au lieu d'utiliser WMI, tu aurais pu wrapper TaskKill
; cela aurait été plus court et plus lisible (mais moins techno-frime).



L'avantage de la solution vbs+WMI est qu'elle est la plus compatible en
nombre de plateformes supportées. Si tu utilises taskkill, tu te restreins à
XP ou Server 2003.

Sinon, je pense qu'une sélection sur le PID seul, aurait été suffisante
(et plus générale) ; au lieu d'utiliser 'iexplore.exe' comme critère (il
paraît qu'il y a des gens qui utilisent d'autres navigateurs...)


Il paraît :-)

Avatar
Do Re Mi chel La Si Do
Re

Voilà une version en AutoIt! :


#include <Process.au3>
While True
_RunDos("netstat -ano |find ""213.186.47.206:80"" >TEMP.TXT")
$arr=StringSplit (FileRead("TEMP.TXT",512)," ")
$pid=StringTrimRight ($arr[$arr[0]],2)
if $pid<>"" then
ProcessClose($pid)
endif
sleep(2000)
WEnd


Ce script n'est certainement pas optimisé. Mais je ne pratique AutoIt!
qu'occasionnellement.


A cette occasion, je, à nouveau, réalisé que AutoIt! n'est pas fait pour
scripter de la ligne de commande, mais plutôt, pour automatiser l'interface
graphique de Windows. En témoigne, le nombre de fonctions pour identifier
les fenêtres, leur contenu, leurs contrôles, etc.

Par contre, au script ci-dessus, on peut ajouter, assez facilement, des
fioritures, comme :
- le "compiler" en .exe
- choisir l'icône de la barre des tâches, et gérer un menu sur cet icône
(pour arrêter le script, par exemple)
- afficher les blocages, dans un "tooltip" transparent, durant quelques
secondes.



Bon dimanche

Michel Claveau
Avatar
~Jean-Marc~ [MVP]
Salutations *Do Re Mi chel La Si Do* !
Dans <news:
tu nous disais :
Intéressant. Mais, au lieu d'utiliser WMI, tu aurais pu wrapper
TaskKill ; cela aurait été plus court et plus lisible (mais moins
techno-frime).
Sinon, je pense qu'une sélection sur le PID seul, aurait été
suffisante (et plus générale) ; au lieu d'utiliser 'iexplore.exe'
comme critère (il paraît qu'il y a des gens qui utilisent d'autres
navigateurs...)


Effectivement... Mais j'avais un bout de code qui trainait avec
du WMI... ;-)

Allez, pour te faire plaisir :

' Uniquement avec cscript

On error resume next

Const IPDel = "213.186.47.206:80"

Set Shell = CreateObject("WScript.Shell")

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!.rootcimv2")

Do While True

Set oExec = Shell.Exec("netstat -no")

Do While Not oExec.StdOut.AtEndOfStream
NStat = oExec.StdOut.ReadLine
if instr(1, NStat, IPDel,1) then
NStat = split(NStat," ")
KillID = NStat(UBound(Nstat))
Set Ex = Shell.Exec("taskkill /PID " & KillID)
end if
Loop

WScript.Sleep 2000
Loop

@+

--
~Jean-Marc~ MSAE & MVP Windows XP Fr
M'écrire : http://msmvps.com/docxp/contact.aspx
- http://docxp.mvps.org - http://msmvps.com/docxp/ -
Aide en DIRECT sur Internet : http://communautes-ms.akro-net.org/

Avatar
Do Re Mi chel La Si Do
Re

Deux questions :
- pourquoi dis-tu "seulement avec cscript ?" ; ça fonctionne bien en
wscript...
- avec netstat -no, au lieu de -ano, tu "sautes" UDP ; c'est voulu ?
- l'utilisation de ReadLine est intéressante, car elle élimine le
séparateur de ligne final ; mais tous les langages ne se comportent pas
pareillement.
- pourquoi ai-je parlé de "deux" questions ?


MCI
Avatar
Do Re Mi chel La Si Do
Re-re


Une autre version en AutoIt! :

#include <Process.au3>
while True
_RunDos("netstat -ano |find ""213.186.47.206:80"" >TEMP.TXT")
$arr=StringSplit (FileReadLine("TEMP.TXT")," ")
$pid=$arr[$arr[0]]
if $pid<>"" then
ProcessClose($pid)
endif
sleep(2000)
WEnd


J'ai simplement utilisé FileReadLine (idée de Jean-Marc), qui élimine le
CR/LF final, comme en VBS. A noter que Python, avec readline() récupère la
ligne AVEC le CRLF final, et donc n'est pas très intéressant.

MCI
1 2 3 4 5