PowerShell sous Linux

Introduction

PowerShell, initialement développé pour Windows, est désormais disponible sous Linux. Cette évolution permet aux administrateurs système et aux développeurs de bénéficier d'un outil puissant et cohérent à travers différents systèmes d'exploitation. PowerShell sur Linux est particulièrement utile dans les environnements hybrides, le cloud computing et les pratiques DevOps, où la gestion de multiples plateformes est courante.

Un peu d'histoire

PowerShell a été lancé par Microsoft en 2006 en tant que composant de Windows. À titre de comparaison, le shell natif de Linux, bash, existe depuis les années 1980. PowerShell a donc été inventé bien après bash, afin d'offrir une interface de ligne de commande plus puissante et orientée objet pour les administrateurs Windows. De 2006 à 2016, PowerShell est resté un outil exclusif à Windows, avec des versions successives (PowerShell 1.0 à 5.1) qui ont ajouté des fonctionnalités et amélioré les performances. En 2016, Microsoft a décidé de rendre PowerShell open source et multi-plateforme, ce qui a conduit à la création de PowerShell Core, qui correspondait à la version 6.x de PowerShell.

Décortiquons ce que ces deux termes signifient :

  • Open source : Le code source de PowerShell est désormais accessible au public, permettant à la communauté de contribuer à son développement, de signaler des bugs et de proposer des améliorations. Le projet est hébergé sur GitHub (https://github.com/PowerShell/PowerShell), et est public sous la licence MIT, une licence permissive qui permet une utilisation, une modification et une distribution larges.
  • Multi-plateforme : PowerShell n'est plus limité à Windows. Il est désormais disponible sur plusieurs systèmes d'exploitation, notamment Linux et macOS, en plus de Windows. Cela permet aux utilisateurs de bénéficier des mêmes fonctionnalités et de la même syntaxe de script, quel que soit le système d'exploitation utilisé.

Quelle était la motivation de Microsoft pour ce changement ? Microsoft a reconnu l'importance croissante de Linux dans les environnements informatiques modernes, en particulier dans le cloud computing et les infrastructures hybrides. En rendant PowerShell open source et multi-plateforme, Microsoft a pu attirer une communauté plus large d'utilisateurs et de développeurs, tout en facilitant l'intégration de PowerShell dans des environnements diversifiés. En effet, une grande partie des serveurs dans le cloud fonctionnent sous Linux, et pour rester compétitif, il était essentiel de soutenir cette plateforme dans ses outils et services.

Un événement marquant dans cette transition a été la conférence de Satya Nadella en 2015, où il a déclaré : "Microsoft loves Linux". (https://www.microsoft.com/en-us/windows-server/blog/2015/05/06/microsoft-loves-linux/) Cette déclaration a surpris de nombreux observateurs, mais elle a clairement indiqué la nouvelle direction de l'entreprise: embrasser l'open source et les technologies multi-plateformes. Cette décision faisait partie d'une stratégie plus large visant à intégrer Linux et d'autres technologies open source dans l'écosystème Microsoft, notamment avec Azure, le service cloud de Microsoft, qui prend en charge une variété de systèmes d'exploitation, y compris Linux. En effet, Microsoft a reconnu que la majorité des serveurs dans le cloud fonctionnent sous Linux, et pour rester compétitif, il était essentiel de soutenir cette plateforme dans ses outils et services.

Installation et lancement

PowerShell peut être installé sur diverses distributions Linux via des gestionnaires de paquets comme apt pour Debian/Ubuntu, dnf pour Fedora, ou brew pour macOS. Il est également possible d'utiliser PowerShell dans le Windows Subsystem for Linux (WSL) sur les machines Windows. Une fois installé, PowerShell peut être lancé en tapant pwsh dans le terminal. La commande pwsh --version permet de vérifier la version installée.

Différences majeures avec Windows

La principale différence entre powershell.exe (Windows) et pwsh (Linux) réside dans leur environnement d'exécution et les fonctionnalités spécifiques à chaque système d'exploitation. Notons quelques différences majeures entre les systèmes d'exploitation Windows et Linux, et comment PowerShell s'adapte à ces environnements.

Les différences de technologies

  • Linux n'a pas de registre Windows
  • Les services et événements sont gérés différemment
  • Linux n'a pas les technologies WMI, CIM, Active Directory, GPO, Exchange On-Prem, etc. Conséquences pour certaines cmdlets:
  • Certaines commandes PowerShell spécifiques à Windows, comme Get-Service, Get-WmiObject, et Get-EventLog, ne sont pas disponibles sous Linux.
  • D'autres cmdlets, comme Get-Process et Get-ChildItem, sont disponibles mais avec des comportements adaptés à Linux.

Le système de fichiers

  • Windows utilise des chemins comme C:\Users\...
  • Linux utilise des chemins comme /home/...
  • PowerShell accepte les chemins avec / partout, même sous Windows. Conséquences:
  • Les scripts doivent être adaptés pour gérer les différences de chemins.

Interopérabilité avec les commandes Linux

L'un des grands avantages de PowerShell sous Linux est sa capacité à interagir avec les commandes et scripts natifs de Linux. Cette interopérabilité permet de combiner la puissance orientée objet de PowerShell avec l'écosystème riche des outils Linux traditionnels.

Les commandes bash sur PowerShell

PowerShell sous Linux peut exécuter directement la plupart des commandes Linux natives. Lorsqu'une commande est tapée dans PowerShell, le shell vérifie d'abord si c'est une cmdlet PowerShell, puis si c'est un alias, une fonction, ou finalement une commande externe disponible dans le PATH.

Cela signifie que des commandes comme ls, grep, awk, sed, curl, etc., peuvent être exécutées directement depuis PowerShell. Cependant, il y a quelques nuances importantes à comprendre:

Résolution de noms: PowerShell possède ses propres alias pour certaines commandes. Par exemple, ls dans PowerShell est un alias pour Get-ChildItem. Pour forcer l'utilisation de la commande Linux native, on peut utiliser le chemin complet /bin/ls ou désactiver l'alias temporairement.

Passage de paramètres: Les commandes Linux natives s'attendent à recevoir du texte, pas des objets PowerShell. PowerShell convertit automatiquement les objets en texte lorsqu'ils sont passés à des commandes externes, mais il faut parfois être explicite sur cette conversion.

Gérer les différences de sortie

L'une des différences fondamentales entre PowerShell et bash réside dans la nature de leurs sorties. Bash et les commandes Linux traditionnelles produisent du texte brut, tandis que PowerShell manipule des objets structurés.

Lorsqu'une commande Linux native est exécutée dans PowerShell, sa sortie est capturée comme un tableau de chaînes de caractères. Chaque ligne de sortie devient un élément du tableau. Cela permet d'utiliser les capacités de manipulation de PowerShell sur cette sortie texte, comme le filtrage avec Where-Object ou la sélection avec Select-Object.

Cas d'utilisation de PowerShell sous Linux

PowerShell sous Linux brille particulièrement dans certains scénarios où ses capacités orientées objet et sa syntaxe cohérente apportent une valeur ajoutée par rapport aux outils traditionnels de Linux.

Environnements hybrides Windows/Linux: Dans les organisations qui gèrent à la fois des serveurs Windows et Linux, PowerShell permet d'utiliser un langage de script unique pour l'automatisation sur les deux plateformes. Cela réduit la courbe d'apprentissage pour les équipes, facilite le partage de code, et permet de créer des workflows d'automatisation qui traversent les frontières entre systèmes d'exploitation.

Gestion du cloud: Les principaux fournisseurs de cloud (Azure, AWS, Google Cloud) offrent des modules PowerShell pour gérer leurs services. Les administrateurs peuvent utiliser PowerShell sous Linux pour automatiser la gestion des ressources cloud, indépendamment de leur système d'exploitation local.

Administration à distance: PowerShell remoting offre une alternative puissante pour gérer à distance des systèmes Linux. Comparativement au SSH traditionnel, PowerShell remoting permet de travailler avec plusieurs sessions simultanément, de transférer des objets complexes, et d'exécuter des scripts à distance avec une syntaxe cohérente.

Manipulation avancée des données: PowerShell excelle dans la manipulation de données structurées, comme les fichiers JSON, XML, et CSV. Sous Linux, cela permet aux administrateurs de traiter facilement des données provenant de diverses sources, comme des API web, des fichiers de configuration, ou des journaux système.

Intégration avec des outils DevOps: PowerShell s'intègre bien avec des outils DevOps populaires comme Jenkins, Azure DevOps, et GitHub Actions. Les scripts PowerShell peuvent être utilisés pour automatiser les pipelines de déploiement, gérer les configurations d'infrastructure, et orchestrer des workflows complexes.

Interaction avec des APIs REST: L'un des cas d'usage les plus courants de PowerShell sous Linux est l'automatisation d'interactions avec des APIs REST. Les cmdlets Invoke-RestMethod et Invoke-WebRequest permettent d'interroger facilement des APIs, et la conversion automatique entre JSON et objets PowerShell rend le traitement des réponses très intuitif. Que ce soit pour gérer des ressources cloud, interroger des services web, ou automatiser des workflows DevOps, PowerShell offre une expérience fluide pour travailler avec des APIs modernes.

Scripts portables

L'un des défis lors de l'écriture de scripts PowerShell est de les rendre portables entre Windows et Linux. Bien que PowerShell soit multi-plateforme, certaines différences entre les systèmes d'exploitation nécessitent une attention particulière pour garantir qu'un script fonctionne correctement sur les deux plateformes.

Détection de la plateforme: Sous PowerShell 6.x et supérieur, la variable automatique $PSVersionTable contient des informations sur la version de PowerShell et le système d'exploitation. Par exemple, $PSVersionTable.Platform peut être utilisé pour détecter si le script s'exécute sous Windows ou Linux. De plus, les variables $IsWindows, $IsLinux, et $IsMacOS sont disponibles pour simplifier cette détection. Sous PowerShell 5.1 (Windows uniquement), il est possible d'utiliser [System.Environment]::OSVersion.Platform pour détecter le système d'exploitation.

Gestion des chemins: L'utilisation de chemins absolus en dur (comme C:\Users\... ou /home/...) rend les scripts non portables. PowerShell offre plusieurs solutions pour gérer les chemins de manière portable. La cmdlet Join-Path combine des segments de chemin en respectant le séparateur approprié pour le système d'exploitation. Les variables automatiques comme $HOME (répertoire personnel de l'utilisateur) et $PSScriptRoot (répertoire contenant le script en cours d'exécution) permettent de construire des chemins relatifs qui fonctionnent partout.

Commandes spécifiques à la plateforme: Certaines cmdlets ou fonctionnalités ne sont disponibles que sur certaines plateformes. Par exemple, les cmdlets liées au registre Windows n'existent pas sous Linux. Pour gérer cela, on peut tester l'existence d'une commande avec Get-Command -ErrorAction SilentlyContinue avant de l'utiliser, ou encadrer le code spécifique à une plateforme dans des blocs conditionnels basés sur $IsWindows ou $IsLinux.

Gestion des permissions et exécution: Les permissions d'exécution sont gérées différemment entre Windows (Execution Policy) et Linux (permissions de fichiers). Un script portable doit documenter les prérequis de permissions pour chaque plateforme. Sous Windows, il faut potentiellement définir la politique d'exécution avec Set-ExecutionPolicy, tandis que sous Linux, il faut donner les permissions d'exécution avec chmod +x.

Variables d'environnement: Les noms de variables d'environnement diffèrent souvent entre Windows et Linux. Par exemple, le répertoire temporaire est accessible via $env:TEMP sous Windows et $env:TMPDIR ou /tmp sous Linux. Pour écrire du code portable, on peut utiliser [System.IO.Path]::GetTempPath() qui retourne le répertoire temporaire approprié pour la plateforme.

Conclusion

PowerShell sous Linux n'est pas là pour remplacer bash. Il est là pour compléter l'écosystème Linux avec un outil moderne, orienté objet, et multi-plateforme, particulièrement adapté à l'automatisation cloud et DevOps moderne. Pour plusieurs tâches administratives, bash demeure plus simple et léger. Cependant, pour des scénarios complexes impliquant la gestion de multiples plateformes, l'interaction avec des APIs, ou la manipulation avancée de données, PowerShell offre une puissance et une flexibilité inégalées.

Il faut savoir choisir le bon outil pour le bon travail!