Posh-SSH : Connexion SSH depuis PowerShell sous Windows

I. Présentation

Le module Posh-SSH pour PowerShell permet de se connecter en SSH sur une machine Linux/Unix pour exécuter des commandes et transférer des fichiers via SCP/SFTP. Une vingtaine de commandes sont présentes dans ce module.e vous emballez pas, ce module ne permettra de remplacer Putty (ou autre), car on ne se retrouve pas dans un véritable Shell interactif.

Par ailleurs, vous pourrez établir de multiples connexions vers des hôtes via SSH, et invoquer des commandes et en obtenir la sortie. Ainsi, ce module s'avère surtout intéressant pour automatiser des tâches sur des hôtes Linux, il pourrait remplacer Putty mais comme il faut invoquer les commandes tour à tour, ce n'est pas pratique.

Ce module supporte d'autres actions comme les connexions SFTP et SCP. Nous verrons la liste complète des modules toute à l'heure.

II. Qu'est-ce que Posh-SSH ?

Le module Posh-SSH est développé pour PowerShell v2.0 et les versions supérieures. Il permet de se connecter en SSH sur différents hôtes et d'invoquer (exécuter) des commandes sur l'hôte et obtenir le résultat en retour. D'autres fonctionnalités sont incluses :

  • Utilisation de clés SSH pour l'authentification
  • Envoyer et télécharger des fichiers via SCP et SFTP
  • Support des proxy HTTP
  • Gestion des connexions établies

Son code est une réadaptation du framework SSH.NET, et requiert pour fonctionner le .NET Framework 4.0. Il ne supporte pas toutes possibilités offertes par le SSH et référencées dans la RFC, mais il supporte des fonctionnalités intéressantes, et il est amené à être amélioré...

La page du projet : GitHub Posh-SSH

III. Installation de Posh-SSH

Pour installer le module Posh-SSH sur votre machine, il suffit d'utiliser la commande fournit sur le GitHub de l'outil, à savoir :

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")

Cette commande déclenchera le téléchargement du module, la décompression de l'archive ZIP obtenue et de l'installation du module.

Installation de Posh-SSH
Installation de Posh-SSH

En cas de problème lors de l'installation...

Si vous obtenez l'erreur "Import-Module : Le module « posh-ssh » spécifié n'a pas été chargé, car aucun fichier de module valide n'a été trouvé dans un répertoire de module", c'est que le répertoire où est installé le module ne correspond pas au répertoire où votre système vérifie la présence des modules.

En fait, l'installation ira systématiquement positionner le module dans le répertoire :

C:\Users\votre-utilisateur\Documents\WindowsPowerShell\Modules

Sauf que, si comme moi votre profil utilisateur est déporté vers une autre partition, vous obtiendrez cette erreur. Pour corriger le problème, il suffit de copier le dossier "Posh-SSH" du module vers le répertoire "Modules" correspondant réellement à votre profil (et qui est vérifié par PowerShell lors d'un Import-Module).

Pour savoir où PowerShell vérifie la présence d'un module lors d'un "Import-Module", saisissez la commande suivante :

$env:PSModulePath
Exemple de sortie de $env:PSModulePath
Exemple de sortie de $env:PSModulePath

IV. Les commandes de Posh-SSH

Pour lister les commandes intégrées au module Posh-SSH, ouvrez une console PowerShell et saisissez :

Get-Command -Module Posh-SSH

On obtiendra en sortie :

Commandes disponibles dans le module Posh-SSH
Commandes disponibles dans le module Posh-SSH

Pour obtenir de l'aide quant à l'utilisation d'une de ces commandes, faite comme ceci :

help New-SSHSession

Par exemple, pour le SFTP, on trouve quatre commandlets dédiés à cette utilisation :

- Get-SFTPFile : Télécharger un fichier en SFTP.
- Move-SFTPFile : Déplacer ou renommer un fichier distant en SFTP
- Remove-SFTPFile : Supprimer un fichier distant en SFTP
- Set-SFTPFile : Envoyer un fichier sur l'hôte distant en SFTP.

V. Créer et gérer les connexions SSH

Passons maintenant à l'utilisation du module, tout d'abord, pensez à l'importer grâce à la commande suivante :

Import-Module Posh-SSH

Pour créer une connexion SSH, on s'appuiera sur la commande "New-SSHSession" comme ceci :

New-SSHSession -ComputerName "<ip>" -Port <port-ssh>

Lorsque vous exécuterez cette commande, une fenêtre apparaîtra pour saisir vos identifiants de connexion sur le serveur distant, comme ceci :

Connexion SSH depuis Windows avec Posh-SSH
Connexion SSH depuis Windows avec Posh-SSH

Une fois la connexion établie, vous devez accepter le "fingerprint" du serveur SSH, ce qui est normal puisqu'il s'agit de la première connexion à destination de cet hôte. Indiquez "Y" pour accepter.

Connexion établie avec Posh-SSH
Connexion établie avec Posh-SSH

Sur la copie d'écran ci-dessus, on remarque la présence d'un champ "Index". En effet, chaque connexion SSH se verra attribuer un numéro d'index, qu'il faudra spécifier lors des différentes actions pour bien cibler la connexion (invoquer une commande, supprimer une connexion, etc.).

Pour lister toutes les connexions, exécutez la commande suivante :

Get-SSHSession

Note : Lorsque vous aurez établi une connexion SSH à destination d'un hôte, une entrée est générée dans le registre au sein de "HKEY_CURRENT_USER\Software\PoshSSH". Elle contient l'adresse IP de l'hôte et la valeur du fingerprint.

Pour supprimer une connexion SSH (déconnexion de l'hôte distant), on utilisera la commande suivante :

Remove-SSHSession -Index <numero-index> -Verbose
Déconnexion d'un hôte SSH via Posh-SSH
Déconnexion d'un hôte SSH via Posh-SSH

La sortie ci-dessus montre la déconnexion d'un hôte, et on peut être sûr que la déconnexion est réussie, car la commande "Get-SSHSession" ne retourne pas la connexion.

J'espère que vous n'avez pas fermé la session SSH, sinon reconnectez l'hôte afin de pouvoir suivre la prochaine partie.

VI. Invoquer une commande

Pour exécuter une commande sur l'hôte distant via SSH, on utilisera tout simplement le commandlet "Invoke-SSHCommand". Il faudra penser à préciser l'index de connexion cible, par exemple, dans ce cas l'index de la connexion est "0".

Le paramètre "Command" quant à lui permettra d'indiquer la commande à exécuter sur l'hôte Linux. En retour, le résultat de la commande sera retourné dans l'Output.

Voici un exemple et la copie d'écran correspondante :

Invoke-SSHCommand -Index 0 -Command "uname -a"
Exécuter une commande avec Posh-SSH
Exécuter une commande avec Posh-SSH

Comme je suis sympa avec vous, ci-dessous, vous trouverez différentes commandes et les sorties obtenues. Pour info, je me connecte sur l'adresse IP de boucle locale 127.0.0.1:22, car j'utilise une machine virtuelle en NAT et je redirige le flux vers cette machine virtuelle. Cette VM étant sous Debian 8 (Jessie).

PS C:\> New-SSHSession -ComputerName "127.0.0.1" -Port 22

applet de commande New-SSHSession à la position 1 du pipeline de la commande
Fournissez des valeurs pour les paramètres suivants :
Credential

Server SSH Fingerprint
Do you want to trust the fingerprint 54:f5:f9:b4:d:d0:a6:7a:4:93:6b:d2:54:33:9a:2b
[] Y  [] N  [?] Aide (la valeur par défaut est « N ») : Y

Index Host                                                        Connected
----- ----                                                        ---------
  0   127.0.0.1                                                      True


PS C:\> Invoke-SSHCommand -Index 0 -Command "pwd"

Host       : 127.0.0.1
Output     : /root
ExitStatus : 0

PS C:\> Invoke-SSHCommand -Index 0 -Command "cd /var/log"

Host       : 127.0.0.1
Output     :
ExitStatus : 0

PS C:\> Invoke-SSHCommand -Index 0 -Command "uname -a"

Host       : 127.0.0.1
Output     : Linux JESSIE-01 3.16-2-amd64 #1 SMP Debian 3.16.3-2 (2014-09-20) x86_64 GNU/Linux
ExitStatus : 0

PS C:\> Invoke-SSHCommand -Index 0 -Command "whoami"

Host       : 127.0.0.1
Output     : root
ExitStatus : 0

PS C:\> Invoke-SSHCommand -Index 0 -Command "cd /var/log; ls"

Host       : 127.0.0.1
Output     : alternatives.log
             apt
             auth.log
             btmp
             daemon.log
             debug
             dmesg
             kern.log
             lastlog

ExitStatus : 0


PS C:\> Invoke-SSHCommand -Index 0 -Command "cd /var/log; cat auth.log"

Host       : 127.0.0.1
Output     : Oct 30 16:59:44 JESSIE-01 sshd[2510]: Accepted password for root from 192.168.154.2 port 57708 ssh2
             Oct 30 16:59:44 JESSIE-01 sshd[2510]: pam_unix(sshd:session): session opened for user root by (uid=0)
             Oct 30 17:01:47 JESSIE-01 sshd[2521]: Connection closed by 192.168.154.2 [preauth]
             Oct 30 17:02:07 JESSIE-01 sshd[2523]: Accepted password for root from 192.168.154.2 port 57745 ssh2
             Oct 30 17:02:07 JESSIE-01 sshd[2523]: pam_unix(sshd:session): session opened for user root by (uid=0)
ExitStatus : 0

VII. Les hôtes de confiance

Il est possible de visualiser les hôtes de confiance avec lesquelles vous avez déjà établies une connexion grâce à la commande suivante :

Get-SSHTrustedHost
Posh-SSH - Hôtes de confiance
Posh-SSH - Hôtes de confiance

Passons maintenant au transfert de fichiers via SCP.

VIII. Transfert de fichiers via SCP

Le SCP étant fréquemment utilisé pour du transfert de fichiers, il est intéressant de s'intéresser aux commandlets qui permettent d'envoyer et de télécharger des fichiers par cette méthode.

A. Envoyer un fichier

Pour envoyer un fichier, on utilise "Set-SCPFile" avec plusieurs arguments : le chemin vers le fichier local (LocalFile), le chemin de stockage distant (RemoteFile) et la cible (ComputerName).

Voici un exemple pour illustrer mes propos :

Set-SCPFile -LocalFile "E:\Florian_Profil\Téléchargements\mvmc_setup.msi" -RemoteFile "/tmp/mvmc_setup.msi" -ComputerName "127.0.0.1"

Ce qui aura pour effet d'afficher dans la console PowerShell une barre de progression.

Posh-SSH Set-SCPFile
Posh-SSH Set-SCPFile

Voici la sortie de la commande et une seconde commande qui permet de vérifier que le fichier est bien envoyé, avec un simple "ls".

 

PS C:\> Set-SCPFile -LocalFile "E:\Florian_Profil\Téléchargements\mvmc_setup.msi" -RemoteFile "/tmp/mvmc_setup.msi" -ComputerName "127.0.0.1"

applet de commande Set-SCPFile à la position 1 du pipeline de la commande
Fournissez des valeurs pour les paramètres suivants :
Credential
PS C:\> Invoke-SSHCommand -Index 0 -Command "cd /tmp; ls -l"

Host       : 127.0.0.1
Output     : total 24380
             -rw-r--r-- 1 root root 24965120 oct.  30 10:24 mvmc_setup.msi
ExitStatus : 0

Maintenant, on va s'attaquer au téléchargement d'un fichier.

B. Télécharger un fichier

Nous allons retélécharger le fichier que nous venons d'envoyer. Pour le téléchargement, le commandlet "Get-SCPFile" est utilisé avec les mêmes arguments que pour envoyer, comme ceci :

Get-SCPFile -LocalFile "E:\Florian_Profil\Téléchargements\mvmc_setup_bis.msi" -RemoteFile "/tmp/mvmc_setup.msi" -ComputerName "127.0.0.1"

On remarque la barre de progression qui indique l'avancement du téléchargement :

Posh-SSH Get-SCPFile
Posh-SSH Get-SCPFile

Ce tutoriel touche à sa fin, si vous rencontrez des problèmes dans l'utilisation de ce module, ou si vous avez des questions : utilisez notre forum ! 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Co-Fondateur d'IT-Connect, je souhaite partager mes connaissances et expériences avec vous, et comme la veille techno' est importante je partage aussi des actus.

florian a publié 1601 articles sur IT-Connect.See all posts by florian

6 réactions sur “Posh-SSH : Connexion SSH depuis PowerShell sous Windows

  • 23/05/2016 à 12:11
    Permalink

    petit problème pour moi ca ne fonctionne pas.

    PS C:\Users\ssa\Documents\WindowsPowerShell\Modules\Posh-SSH> New-SSHSession -ComputerName 192.168.92.133

    applet de commande New-SSHSession à la position 1 du pipeline de la commande
    Fournissez des valeurs pour les paramètres suivants :
    Credential
    New-SSHSession : Permission denied (password).
    Au niveau de ligne : 1 Caractère : 15
    + New-SSHSession <<<< -ComputerName 192.168.92.133
    + CategoryInfo : NotSpecified: (:) [New-SSHSession], SshAuthenticationException
    + FullyQualifiedErrorId : Renci.SshNet.Common.SshAuthenticationException,SSH.NewSshSession

    sur le linux :

    May 23 12:17:50 srvdeb8omd sshd[9439]: Invalid user \\root from 192.168.92.1
    May 23 12:17:50 srvdeb8omd sshd[9439]: input_userauth_request: invalid user \\\\root [preauth]
    May 23 12:17:50 srvdeb8omd sshd[9439]: pam_unix(sshd:auth): check pass; user unknown
    May 23 12:17:50 srvdeb8omd sshd[9439]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.92.1
    May 23 12:17:52 srvdeb8omd sshd[9439]: Failed password for invalid user \\root from 192.168.92.1 port 55707 ssh2

    si quelqu'un à une idée…

    Répondre
  • 01/06/2016 à 18:36
    Permalink

    tu as checké que tes ports étaient bien ouverts? question bête
    si tu fais un netstat -ano sur ta machine windows , vois tu la connexion en listening?

    Répondre
  • 02/08/2016 à 14:13
    Permalink

    J’ai aussi un problème identique d’authentification.
    Voici la console que j’obtiens en utilisant la commande suivante :
    Set-SCPFile -LocalFile « C:\tmp\5942612113.zip » -RemotePath « /data/ » -ComputerName « xxx.xxx.xxx.xxx » -Port 22 -Credential (Get-Credential admin) -Verbose

    VERBEUX: Using SSH Username and Password authentication for connection.
    VERBEUX: Fingerprint for ds-app.no-ip.org: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
    VERBEUX: Fingerprint matched trusted fingerprint for host xxx.xxx.xxx.xxx
    Set-SCPFile : Permission denied (password).
    Au caractère C:\test.ps1:12 : 1
    + Set-SCPFile -LocalFile « C:\tmp\5942612113.zip » -RemotePath …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : Erreur de sécurité : (Renci.SshNet.ScpClient:ScpClient) [Set-SCPFile], SshAuthenticationException
    + FullyQualifiedErrorId : SSH.SetScpFile

    Afin de vérifier que les ports sont bien ouvert et que je peux faire du SFTP, j’ai fait un test de connexion avec Filezilla qui arrive à se connecter, à uploader et downloader des fichiers sans soucis.

    Merci d’avance pour votre aide.

    P.S. : xxx sont là pour remplacer des adresses ou des valeurs privés. Mais dans mes tests, les valeurs sont exactes.

    Répondre
  • 18/10/2017 à 13:09
    Permalink

    Bonjour,

    je me suis connecté via SSH à un hôte distant pour effectuer un point de restauration sur celui-ci, cependant quand j’exécute cette commande pour lister les points de restauration présent sur la machine avec cette commande:
    Invoke-SSHCommand -Index 1 -Command « Get-computerRestorePoint »

    J’obtiens ce message d’erreur:
    Host: Slave1
    Output: {Unable to execute command or shell on remote system: Failed to Execute process.}
    ExitStatus: -1

    Répondre
  • 20/10/2017 à 08:46
    Permalink

    dommage de pas pouvoir copier un dossier venant d’un sftp, ou alors j’ai pas trouvé

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *