Écrit par Louis Jeanne-Julien
Avant de commencer
Ca y est, vous avez été placé sur le projet de vos rêves, qui va enfin vous permettre de laisser parler le génie qui est en vous! Mais… comment ? Pour des raisons de gestions d’équipe ou d’exigences du client, vous devez vous passer de votre système d’exploitation préféré pour travailler sur un système inconnu, et forcément moins pratique que celui auquel vous êtes habitués? Il est toujours possible d’effectuer des tâches similaires, mais il faut ré-apprendre à dire à la machine comment faire… Heureusement, cet ensemble d’équivalences d’instructions est là pour vous y aider!
De façon générale, les instructions par ligne de commande sont effectuées en bash (ou similaire) pour les distributions Linux, et en Dos (ou plus récemment Powershell) pour les distributions Windows. Ces systèmes d’exploitation et ces langages étant différents, il n’existe pas nécessairement d’équivalence directe entre deux commandes, et certains moyens détournés sont parfois nécessaires pour effectuer une opération particulière. C’est pourquoi cet petit manuel illustre plus différent moyens de parvenir à une même fin sur différents systèmes qu’une réelle “traduction” entre diverses commandes.
Il est avant tout utile d’avoir quelques généralités à l’esprit :
- les commandes bash, et le dialogue avec un système Linux de façon général sont sensibles à la casse. Ce n’est pas le cas des commandes Dos/Powershell.
- les wildcards sont généralement compris par les 2 systèmes d’exploitation. Par exemple, pour supprimer tous les fichiers textes d’un dossier, il est possible d’utiliser la commande de suppression sur
*.txt
. - lorsqu’une commande a pour résultat l’affichage d’informations dans la sortie standard (affichage du contenu d’un fichier, listage du contenu d’un dossier, etc…), il est possible sous Windows comme sous Linux d’enregistrer ces informations dans un fichier par l’utilisation de chevrons :
<commande> > fichier
: le résultat est enregistré dans le fichier, qui est écrasé/créé pour l’occasion.<commande> >> fichier
: le résultat est concaténé au fichier, qui est créé si besoin, sans être écrasé. - il est possible de consulter directement la documentation sur une commande dans la console d’instructions, avec
man <commande>
ou<commande> -h
sous Linux,<commande> /?
sous Windows, ou encore<commande> -whatif
en Powershell. - les commandes Dos sont souvent déclarées comme alias des commandes Powershell. Il est donc généralement possible d’utiliser les commandes Dos dans la console Powershell.
- certaines commandes peuvent être agrémentées d’une longue liste d’options, qui ne sont pas toutes présentées ici, certaines listes étant loin d’être exhaustives. Ainsi, pour une utilisation sur-mesure parfaitement adaptée à un script particulier, il est toujours recommandé de consulter la documentation des commandes que l’on souhaite utiliser.
- il est possible de cumuler différentes options sur une même commande :
bash :<commande> -option1option2
, par exemplels -lArth
(ls -l -A -r -t -h
fonctionne également)
Dos :<commande> /option1 /option2
Powershell :<commande> -option1 -option2
- afin d’éviter d’avoir à écrire l’intégralité d’une commande, l’autocomplétion est implémentée sous Linux comme sous Windows : après avoir tapé les premières lettres, la touche de tabulation complètera automatiquement avec le reste de la commande. Si les premières lettres rentrées peuvent potentiellement constituer le début de plusieurs instructions, l’autocomplétion se comporte différemment en bash et en Dos/Powershell :
bash : la ligne est complétée jusqu’au point où les diverses instructions potentielles divergent, et l’utilisateur doit entrer une lettre supplémentaire avant de ré-utiliser l’autocomplétion. Appuyer 2 fois successives sur la touche de tabulation permet d’obtenir la liste des instructions possibles.
Dos / Powershell : la ligne est complétée avec la totalité de la première instruction valide. Appuyer à nouveau sur la touche de tabulation changera la ligne pour qu’elle corresponde à la deuxième instruction valide, etc… La liste des diverses instructions potentielles est parcourue dans l’ordre alphabétique.
Ca y est, nous pouvons rentrer dans le vif du sujet! L’implémentation des tables étant compliquée sur Medium, les tables ci-dessous sont des images, donc…pas de copier-coller des commandes possibles.
Utilitaires généraux
Imprimer une phrase
Exécuter une commande en tant qu’admin
Sous Linux, un utilisateur non administrateur peut lancer les commandes en tant qu’administrateur s’il connaît le mot de passe admin, et qu’il fait partie du groupe des ‘sudoers’. Sous Windows, outre l’alternative ‘runas’ peu utilisée, il est possible de lancer toute une console en tant qu’administrateur, c’est pourquoi la commande Powershell n’est pas indiquée.
Recherche de texte
En bash comme en Dos ou Powershell, la liste des options pour affiner la recherche de texte est considérable. Les options présentées ici sont communes, mais cette liste est loin d’être exhaustive.
Concernant l’affichage des numéros de ligne en Powershell, deux options sont possibles :
(Get-Content <fichier> | Select-String <texte>).LineNumber
: cette option affiche uniquement le numéro des lignes, non les résultats eux-mêmes.$i=1; (Get-Content <fichier> | Select-String <texte>) | % {"$($i) `t $_"; $i++}
: cette option plus verbeuse permet d’afficher le numéro de ligne et la ligne en question, séparés par une tabulation.
Afficher l’historique des commandes utilisées
L’affichage de l’historique des commandes est souvent suivi d’une recherche de texte pour filtrer les résultats.
Effacer le contenu de la console
Fermer la console
Navigation
Afficher le répertoire courant
Changer de répertoire
En bash, la commande cd -
permet de se déplacer vers le répertoire précédent.
Sous Linux comme sous Windows, le répertoire courant est noté ./
, et le répertoire parent est noté ../
Manipulation de fichiers et de répertoires
Imprimer le contenu d’un fichier dans la console
En Powershell, l’affichage des numéros de lignes nécessite (tout comme lors de la recherche de texte) d’enchaîner plusieurs instructions, afin de générer ces numéros et de les afficher avant chaque ligne : $i=1; Get-Content <fichier> | % {"$($i) `t $_"; $i++}
Copier un ou plusieurs fichiers/répertoires
En Dos, la copie est récursive par défaut, mais seuls les fichiers contenus dans les différents répertoires sont copiés, et non les répertoires eux-mêmes.
Déplacer/renommer un ou plusieurs fichiers/répertoires
Créer un ou plusieurs nouveaux répertoires
Sous Linux comme sous Windows, il est possible de générer plusieurs niveaux de répertoires : <commande de création> <dossier>/<sous-dossier>
Créer un ou plusieurs nouveaux fichiers
En bash, la fonction de la commande touch
est en réalité de mettre à jour la date d’accès et de modification du fichier passé en paramètre. Se ledit fichier n’existe pas, il est créé. Cette commande est donc souvent utilisée pour créer un nouveau fichier, mais il est possible d’utiliser l’option touch -c
pour éviter de le créer s’il n’existe pas.
En Dos, on utilise simplement un chevron pour rediriger une impression nulle dans le nouveau fichier.
Supprimer un ou plusieurs fichiers/répertoires
En Dos, la commande est récursive par défaut, mais seuls les fichiers sont supprimés et non les dossiers : cela est dû au fait que le dossier doit être vide pour être supprimé. Il faut donc en premier lieu utiliser del
pour supprimer les fichiers, puis rd
pour supprimer le dossier vide. L’équivalent bash de cette commande de suppression de dossier vide, plus précautionneuse, est rmdir <dossier>
, utilisable également telle quelle en Dos et Powershell.
Rechercher un fichier/répertoire
En bash comme en Dos et Powershell, beaucoup d’options cumulables existent pour affiner la recherche, la liste ci-dessous est non exhaustive.
Attention, pour l’affinage selon une regex en bash, la regex doit correspondre au path complet, et donc inclure les caractères ‘^’ et ‘$’.
On remarque qu’en Powershell, l’affinage par nom ou regex est en fait constitué de 2 commandes jointes par un pipe.
En bash, il est possible d’utiliser des options pour effectuer directement des commandes sur chacun des résultats de la liste :
find <répertoire de départ> <options> -exec <commande>
: exécution de la commande<commande>
sur chaque résultat, désigné par la chaine “{}”. Exemple avec suppression de dossiers :find ./ -type d -exec rmdir {}
find <répertoire de départ> <options> -execdir <commande>
: idem que la commande précédente, mais l’instruction<commande>
est ici lancée depuis le répertoire contenant le résultat et non le répertoire courant.find <répertoire de départ> <options> -ok <commande>
: idem que précédemment, mais une confirmation est demandée systématiquement avant l’exécution de l’instruction<commande>
. La différence entre-ok
et-okdir
est la même qu’entre-exec
et-execdir
.
Lister des fichiers/répertoires
Le listage concerne les éléments du répertoire courant par défaut, mais il est possible de préciser un répertoire après la commande ls
, dir
ou Get-ChildItem -Path
pour préciser depuis quel répertoire doit être lancée l’instruction.
En bash, les résultats ne sont pas affichés sous forme de liste par défaut, il faut pour cela utiliser l’option -l
. Pour plus de commodité, la commande ls -l
est souvent enregistrée sous l’alias ll
.
En bash, ls -a
et ls -A
fournissent le même résultat, si ce n’est que l’utilisation de -a
affiche également les dossiers ./ et ../, à l’inverse de -A
.
Afficher une partie d’un fichier (pratique pour les logs)
En bash, les options des commandes head
et tail
sont semblables, mais seule l’une des deux commandes est affichée dans la liste ci-dessous pour plus de commodité.
Comparer deux fichiers ligne à ligne
Pour plus de commodité, dans les commandes ci-dessous, <fichier1>
et <fichier2>
ont été respectivement remplacés par <f1>
et <f2>
.
En Powershell, cette opération, bien que possible, est très verbeuse. C’est pourquoi elle ne figure pas dans la table, et est affichée ci-après : Compare-Object -ReferenceObject (Get-Content -Path <f1>) -DifferenceObject (Get-Content -Path <f2>
. Il est possible d’utiliser l’option -CaseSensitive
pour tenir compte des différences de casse, qui sont ignorées par défaut.
En bash, si la cible ou la source est un répertoire, la comparaison est faite avec le fichier contenu dans ce répertoire portant le même nom que le fichier à comparer. Si la source et la cible sont tous deux des répertoires, la comparaison est faite entre tous les fichiers portant le même nom dans les deux répertoires, dans l’ordre alphabétique. Cette comparaison n’est pas récursive par défaut, il faut utiliser l’option -r
pour cela.
Gestion de système
Informations sur l’utilisation du disque système par les différents systèmes de fichiers
En Powershell, à partir de Windows 10, il est possible d’utiliser la commande Get-Volume
, qui permet d’obtenir les informations (nom du lecteur, type de partition, taille disponible, taille totale) concernant tous les volumes de toutes les partitions.
Informations sur le volume occupé par un fichier/répertoire
Cette fonctionnalité n’existe pas par défaut en Dos ou Powershell, mais il est possible de créer un script en Powershell qui donne un résultat similaire. Ce script repose sur les commandes -Get-ChildItem
et Measure-Object
:
function du-equivalent($dir=".") {
get-childitem $dir |
% { $f = $_ ;
get-childitem -r $_.FullName |
measure-object -property length -sum |
select @{Name="Name";Expression={$f}},Sum}
}
Il doit être noté que la durée d’exécution de ce script peut être significative selon la taille du répertoire à analyser.
En bash, la commande du
peut s’appliquer à un fichier ou un dossier qu’il est possible de préciser (par exemple du <dossier>
). Par défaut, elle s’applique au répertoire courant.
Informations sur le système d’exploitation
L’obtention des informations sur le système d’exploitation peut être facilement soumise à un affinage en bash, mais la commande systeminfo
utilisée en Dos et Powershell donne directement toutes les informations disponibles. C’est pourquoi seul le langage bash figure dans la table ci-dessous.
Changer les permissions sur un fichier/répertoire
En bash, ‘xxx’ correspond aux autorisations attribuées au propriétaire du fichier, au groupe propriétaire, et aux autres utilisateurs, selon les sommes de numéros : 1 (exécution)-2 (écriture)-4 (lecture).
Exemple : si les droits sur le fichier fichier
sont :
- pour le propriétaire du fichier : exécution+lecture+écriture=1+2+4=7
- pour le groupe propriétaire : exécution+lecture=1+4=5
- pour n’importe quel autre utilisateur : exécution=1
Alors, ‘xxx’ vaut 751.
Il est possible de changer le propriétaire ou le groupe propriétaire d’un fichier avec les commandes chown
et chgrp
.
En Dos et Powershell, il est à chaque fois nécessaire préciser l’utilisateur pour qui les droits sont modifiés.
Afficher la liste des tâches/processus en cours
De (très) nombreuses options existent pour ces commandes, dont l’intérêt varie selon le contexte. Se reporter à la documentation de ces commandes pour une liste exhaustive.
Arrêter une tâche/un processus
Pour connaître l’identifiant du processus à arrêter qu’il faut passer en paramètre des commandes ci-dessous, il est possible d’utiliser la commande d’affichage des processus en cours (voir ci-dessus), et d’affiner la liste des résultats par une recherche de texte.
Exemple bash : ps | grep firefox
Exemple Powershell : tasklist | Select-String "firefox"
En Powershell, l’option -Force
se contente de ne pas demander de confirmation.
Informations sur les interfaces réseau de la machine
En bash, la commande ifconfig
permet également de configurer les différentes interfaces réseau selon les options utilisées.
Connectivité
Vérifier la connexion à un serveur
Pour des raisons de sécurité, le protocole utilisé par la commande ping
est souvent bloqué, mais d’autres commandes utilisant des protocoles différents sont disponibles.
En Dos, la commande telnet
doit être activée avant de pouvoir être utilisée.
En bash et en Dos, la commande telnet
utilise par défaut le port 23 quand aucun port n’est précisé. En Powershell, il est systématiquement nécessaire de préciser le port.
La commande netcat
est une boîte à outil comportant de nombreuses options pour interagir en utilisant les protocoles TCP et UDP. Cet outil n’est pas disponible par défaut sous Windows, bien qu’il soit possible d’installer ncat
, qui offre des fonctionnalités similaires.
Télécharger une URL
En bash, le téléchargement, et de façon générale l’interaction avec les pages web se font par l’intermédiaire de deux commandes principales : wget
et curl
.
Ces deux commandes sont en réalité deux vastes boites à outils, possédant de considérables listes d’options. C’est pourquoi la lecture de la documentation de ces commandes très polyvalentes est vivement conseillée, afin de pouvoir les adapter au mieux au contexte d’utilisation.
Il est possible sous Windows d’installer la commande wget
. En Powershell, il est possible d’utiliser une alternative indirecte de cette commande :
$client = New-Object System.Net.WebClient
$client.DownloadFile("<url>")
Informations détaillées sur une machine (ip, nom d’hôte…)
Sous Linux, utiliser simplement la commande nslookup
sans argument permet de lancer la console nslookup. Il suffit alors de rentrer une IP ou un nom d’hôte pour obtenir les informations disponibles. Cette console permet d’avoir accès à d’autres options dont l’implémentation dépend de la distribution Linux utilisée.
Les deux premières options de la table ci-dessous ne sont pas affichées en Powershell, car la commande Resolve-DnsName <ip> (ou <host>)
permet d’effectuer ces actions.