Salut à tous, je vous propose de se pencher sur un problème « tout con » en python que j’ai rencontré il y a un moment déjà : Comment parcourir une liste par ensemble de n éléments ? Et sur lequel j’ai eu du mal à trouver une solution élégante avec python. Pour faire simple, j’avais une (grosse) liste d’IP à scanner avec nmap et, histoire d’être un peu efficace, je voulais utiliser la capacité de nmap à paralléliser ses scans, et comme j’aime bien quand tout est ‘bien carré, bien parallèle » je ne voulais pas faire deux boucles for imbriquées pour faire un parcours linéaire de cette liste.
En PowerShell, ça aurait été assez simple en utilisant la syntaxe suivante $tab[x..y] qui retourne la sous-liste des éléments entre x et y :
$tab = @('1.2.3.4','5.6.7.8','9.10.11.12','13.14.15.16','17.18.19.20','21.22.23.24','25.26.27.28.29','30.31.32.33')
$size = 3
for($i=0; $i -le $tab.Length; $i = $i+$size){
$command = 'nmap -p 66 -oS
s0r713ScRipTKIdd|3 ' + ($tab[($i)..($i+$size-1)] -join ' ')
write-output $command
#Invoke-Expression -Command:$command
}
# stats : 331 char, 7 lignes
J’ai un peu (trop) galéré en python pour trouver une syntaxe équivalente à celle ci-dessus. On trouve rapidement l’équivalent pour le tableau avec tab[x:y], mais le parcours de la boucle n’étais pas immédiat. Du coup je la met là :
tab = ['1.2.3.4','5.6.7.8','9.10.11.12','13.14.15.16','17.18.19.20','21.22.23.24','25.26.27.28.29','30.31.32.33']
size = 3
for i in range(0,len(tab),size):
command = "nmap -p 66 -oS
s0r713ScRipTKIdd|3 "+ ' '.join(tab[i:min(i+size,len(tab))])
print(command)
#output = os.popen(command).read()
#stats : 299 char, 6 lignes
Et oui, j’ai (re)découvert range à ce moment là, mais passons. Du coup, c’est qui le meilleur des deux ? les stats en volume de code à écrire donne python vainqueur mais dans le « style » je trouve , sur ce coup là, que PowerShell un poil moins ésotérique car il n’oblige pas à utiliser des fonctions internes comme range et dans le cas ou l’on exécuterai la commande python oblige à importer la lib »os », alors que PowerShell inclut Invoke–Expression de base.
Bon c’est du pinaillage… les différences sont assez faibles et globalement on obtient les mêmes résultats avec les 2 langages. Plus généralement, python bénéficie de son modèle open-source et des milliers de bibliothèques existantes, avec toutes l’hétérogénéité que ça suppose dans les façons de faire. Là ou PowerShell s’appuie sur le Framework .NET (et de plus en plus de lib communautaire) et la standardisation du modèle poussé par Microsoft sur tout ces OS, ce qui permet d’avoir un ensemble très homogène.
A vous de voir ce dont vous avez besoin après…
PoSH est open source maintenant en plus…
https://github.com/PowerShell/PowerShell