Posh-SSH : Connexion SSH depuis PowerShell sous Windows
Sommaire
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. Ne 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
Sur le site PowerShell Gallery : Module 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 :
Install-Module -Name Posh-SSH
Cette commande déclenchera le téléchargement du module et l'installation du module.
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
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 :
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 :
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.
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
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"
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
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.
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 :
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 ! 🙂
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…
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?
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.
Merci pour cet excellent article.
ça marche niquel !
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
dommage de pas pouvoir copier un dossier venant d’un sftp, ou alors j’ai pas trouvé
Bonjour et merci,
Comment faire pour transférer le contenu d’un dossier ? *.* ne fonctionne pas
Bonjour,
Lorsque que j’utilise le commande Invoke-SSHCommand -SSHSession $session -Command « write memory » par exemple. J’obtiens l’erreur suivante qui semble être lié au module en lui même.
Avez-vous une piste de recherche ?
Exception lors de l’appel de « EndExecute » avec « 1 » argument(s) : « An established connection was aborted by the server. »
Au caractère C:\Program Files\WindowsPowerShell\Modules\Posh-SSH\3.1.3\Posh-SSH.psm1:294 : 25
+ $Output = $_.cmd.EndExecute($_.Async)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SshConnectionException