Comment créer des outils PowerShell pour configurer SFTP

Lorsque vous utilisez plusieurs machines fonctionnant sous Windows, vous pouvez avoir besoin d’accéder à des ressources partagées à l’aide de différents protocoles. Lorsqu’un partage de fichiers est créé sur une machine Windows, le protocole SMB est généralement utilisé. Cependant, les fichiers peuvent être partagés sur des machines non Windows par les protocoles NFS, FTP, SFTP, FTPS, SCP et autres. Si vous utilisez uniquement PowerShell, par exemple, sur Windows Server sans interface graphique, la connexion au partage SFTP pour la première fois peut sembler difficile. Cet article de blog explique comment utiliser SFTP dans Windows avec PowerShell.

NAKIVO for Windows Backup

NAKIVO for Windows Backup

Fast backup of Windows servers and workstations to onsite, offiste and cloud. Recovery of full machines and objects in minutes for low RTOs and maximum uptime.

Qu’est-ce que SFTP ?

SFTP signifie SSH File Transfer Protocol ou Secure File Transfer Protocol. Le SFTP est une alternative sécurisée au protocole FTP (File Transfer Protocol) traditionnel, avec des fonctionnalités similaires. Le SFTP fonctionne sur la couche application du modèle OSI (couche 7), utilise la connexion SSH et est particulièrement populaire sur les machines Linux qui disposent généralement d’un client SFTP en ligne de commande intégré. Si vous utilisez Windows, installez un client SSH gratuit tel que WinSCP, qui dispose d’une interface graphique et prend en charge plus que le SFTP, ou configurez les outils PowerShell si vous devez utiliser la ligne de commande. Windows et PowerShell ne prennent pas en charge SFTP en natif, vous devrez donc installer des composants supplémentaires.

Lorsque vous utilisez une connexion SSH, les transferts de données sur le réseau sont cryptés et la connexion est sécurisée, contrairement au protocole FTP traditionnel non crypté où les données peuvent être interceptées par des pirates. SSH est utilisé pour l’authentification. Si vous disposez d’identifiants de connexion utilisateur Linux, vous pouvez accéder aux fichiers sur une machine Linux cible après avoir passé l’authentification à partir de votre client SFTP en ligne de commande ou d’un client GUI. Il vous permet également de copier des fichiers depuis/vers une machine Linux distante vers votre machine Linux ou Windows locale. La configuration du serveur SFTP sur Linux n’est pas difficile : vous installez le serveur SSH, créez des utilisateurs et accordez les autorisations nécessaires aux utilisateurs et aux fichiers/répertoires.

Ne confondez pas SFTP et FTPS. Ces deux protocoles sont utilisés à des fins similaires. Cependant, SFTP utilise un seul numéro de port pour une connexion et FTPS utilise plusieurs numéros de port pour les canaux de contrôle et de données (ce qui peut être plus difficile à configurer du point de vue de la sécurité, notamment en ce qui concerne les pare-feu). FTPS est un protocole FTP avec SSL (Secure Socket Layer). Je ne vais pas aborder la configuration du serveur SFTP dans cet article. À propos de l’installation et de la configuration de Linux (y compris le serveur SSH) sur Hyper-V, consultez ici.

Installation du module Posh-SSH

Afin d’effectuer des opérations sur des fichiers (copier des fichiers, supprimer des fichiers) sur des machines distantes par l’intermédiaire de SFTP et SCP dans PowerShell, vous devez installer le module Posh-SSH dans PowerShell. L’installation de ce module vous permet également d’exécuter des commandes à distance sur un ordinateur distant par l’intermédiaire de la session SSH. Pour installer et utiliser Posh-SSH, il faut PowerShell 3.0 et .NET Framework 4.0. Vous pouvez donc installer ce module sur Windows 8 ou les versions plus récentes de Windows. Vous pouvez également mettre à jour manuellement PowerShell et .NET Framework sur Windows 7 SP1. Exécutez cette commande pour installer le module SFTP PowerShell (Posh-SSH) :

install-module posh-ssh

Posh PowerShell – installing the PowerShell SFTP module

Vous pouvez également utiliser cette commande pour installer le module Posh-SSH pour PowerShell :

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

Une connexion Internet est nécessaire pour installer Posh-SSH à l’aide des commandes ci-dessus. Dans mon cas, j’ai installé le module Posh-SSH dans PowerShell et je peux passer aux étapes de configuration suivantes.

Connexion à un hôte distant dans PowerShell

Dans cet article de blog, j’utilise un environnement avec une machine Windows locale et une machine Linux distante, qui sont connectées au même réseau :

  • 192.168.101.210 est une machine Windows locale équipée de Windows 10 version 20H2
  • 192.168.101.209 est une machine Linux distante sur laquelle le serveur SSH (SFTP) est en cours d’exécution
  • user1 est le nom de l’utilisateur Linux

Ces adresses IP sont utilisées dans mes exemples. Entrez vos adresses IP et vos identifiants de connexion dans les commandes et les fichiers de configuration appropriés.

Vérifions notre partage SFTP en nous connectant au serveur Linux via SFTP par WinSCP, le client SFTP gratuit pour Windows. La connexion à un serveur SFTP est très simple. Entrez l’adresse IP de l’hôte cible, le numéro de port (TCP 22 est le numéro de port par défaut, mais vous pouvez configurer un serveur SSH pour utiliser un numéro de port personnalisé), le nom d’utilisateur et le mot de passe pour vous connecter. N’oubliez pas de sélectionner le protocole SFTP.

How to use SFTP – connecting to a remote machine in WinSCP

La connexion SFTP fonctionne dans mon cas. Nous avons copié deux fichiers dans le dossier partagé (l’emplacement des fichiers est /home/user1/shared/ sur la machine Linux distante). Voyons comment se connecter au dossier partagé à partir de Windows et comment utiliser SFTP avec Posh-SSH dans PowerShell.

How to use SFTP in Windows

Pour travailler avec des fichiers via SFTP, vous devez d’abord établir une session. Pour ce faire, exécutez cette commande dans PowerShell :

New-SFTPSession -Computername 192.168.101.209

La fenêtre d’authentification s’affiche après l’exécution de la commande. Saisissez un nom d’utilisateur et un mot de passe pour accéder à la machine Linux distante contenant les fichiers auxquels vous devez accéder via SFTP. Si vous avez saisi les identifiants de connexion corrects, vous devriez voir s’afficher dans PowerShell le numéro de session SFTP, l’adresse IP de l’hôte distant et le statut de la connexion. Une fois la session créée, un numéro d’index lui est attribué.

How to use SFTP in PowerShell – connecting to a server and creating a new session

Vous pouvez toujours saisir la commande d’aide avec les arguments appropriés pour afficher une brève aide sur la syntaxe d’utilisation des commandes PowerShell :

help New-SFTPSession

Listez toutes les commandes PowerShell posh disponibles :

Get-Command -Module Posh-SSH

ou

Get-command -Name * -module *posh-ssh

Voici la méthode pour créer une session SSH qui vous permet d’exécuter une commande sur un hôte distant, par exemple pour lister les fichiers dans le répertoire :

Import-Module Posh-SSH

$SSHSession = New-SSHSession -ComputerName 192.168.101.209 -Credential $(Get-Credential) -Verbose

$SSH = $SSHSession | New-SSHShellStream

Invoke-SSHCommand -Index 0 -Command "ls -l /home/user1/shared"

PowerShell SFTP – listing files in a directory of an SFTP server

Création d’un script PowerShell

Créons un script de test pour explorer les opérations de base que vous pouvez effectuer dans PowerShell lorsque vous travaillez avec des ressources SFTP. Il ne s’agit pas d’un script SFTP, mais d’un script PowerShell permettant de travailler avec SFTP. Ce script de test doit copier le fichier d’installation .NET Framework from a remote Linux machine to a local Windows machine.

Créez un fichier de script test-PS.ps1 avec le contenu affiché ci-dessous.

#Creating a folder to store files downloaded from the SFTP share

New-item -itemtype directory -force -path c:tempps

#Setting credentials for the user account

$password = ConvertTo-SecureString "My_Password000" -AsPlainText -Force

$creds = New-Object System.Management.Automation.PSCredential ("user1", $password)

#Establishing an SFTP session

$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds

#Downloading the .NET installer file by using the established SFTP session

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps

Ouvrez PowerShell sur un ordinateur Windows, accédez au dossier dans lequel ce script de test est stocké, puis exécutez le script

.test-PS.ps1

Le fichier NetFrameworkNDP462.exe doit être copié depuis /home/user1/shared/ (sur une machine Linux distante) vers C:tempps (sur une machine Windows locale). Comme vous pouvez le voir sur la capture d’écran ci-dessous, le fichier a été copié avec succès dans mon cas.

PowerShell SFTP – copying a file from an SFTP server in PowerShell

Pour répertorier les fichiers d’un répertoire dans la ressource SFTP, vous pouvez créer un script PowerShell avec le contenu suivant :

$passwordTest = "Your_Password000"

$securePasswordTest = ConvertTo-SecureString $passwordTest -AsPlainText -Force

$credentialsTest = New-Object System.Management.Automation.PSCredential ("user1", $securePasswordTest)

$sessionTest = New-SFTPSession -ComputerName 192.168.101.209 -Credential $credentialsTest -AcceptKey

$sourceTest = "/home/user1/shared/"

$destinationTest= "c:tempps"

Get-SFTPChildItem -Recursive $sessionTest -Path $sourceTest | ForEach-Object{

   if ($_.Fullname -like '*.csv')

   {

      Get-SFTPFile $sessionTest -RemoteFile $_.FullName -LocalPath $destinationTest -Overwrite

   }

   write-output $_.FullName

}

Remove-SFTPSession $sessionTest -Verbose

Où :

Your_Password000 est le mot de passe du compte utilisateur utilisé pour se connecter via SSH au partage SFTP ;

user1 est le nom de l’utilisateur ;

192.168.101.209 est l’adresse IP de l’hôte distant auquel nous nous connectons pour accéder aux fichiers via SFTP.

Enregistrez le script sous list-files.ps1 et exécutez ce script dans PowerShell sur votre machine locale à partir d’un dossier où ce fichier script est stocké.

.list-files.ps1

Faites attention au paramètre -Recursive défini dans le script de test. Sur la capture d’écran ci-dessous, vous pouvez voir les résultats obtenus en utilisant le paramètre -Recursive et sans ce paramètre.

How to use SFTP in PowerShell – checking contents of a directory on a remote server

L’un des inconvénients de l’exécution de scripts tels que ceux présentés dans les exemples ci-dessus est que les identifiants de connexion sont stockés en texte clair dans un script, ce qui n’est pas sécurisé. Un utilisateur capable d’ouvrir un script (même avec des autorisations en lecture seule) peut voir un mot de passe et l’utiliser pour obtenir un accès non autorisé.

Il existe une méthode pour améliorer le niveau de sécurité et stocker un mot de passe dans une vue cryptée dans un fichier. L’API Windows de protection des données est utilisée pour crypter un mot de passe, qui n’est accessible qu’à partir du compte utilisateur et de l’ordinateur utilisés pour créer ce fichier de mot de passe.

(get-credential).password | ConvertFrom-SecureString | set-content "C:temppassword.txt"

How to use SFTP in PowerShell – saving an encrypted password to a file

Le mot de passe est ensuite enregistré sous forme cryptée dans le fichier texte. Si quelqu’un voit le contenu de ce fichier, le mot de passe n’est pas affiché en texte clair.

A password for an SFTP user account is encrypted and saved in the text file

Lorsque vous devez entrer le mot de passe, définissez le fichier contenant le mot de passe crypté enregistré (C:temppassword.txt dans notre cas).

$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString

$credential = New-Object System.Management.Automation.PsCredential("user1",$password)

Cette méthode de définition d’un mot de passe est plus sécurisée. Vous pouvez modifier votre script dans lequel vous avez défini le mot de passe. Au lieu d’ouvrir un script dans un éditeur de texte, vous pouvez cliquer avec le bouton droit sur le fichier ps1 et, dans le menu contextuel, cliquer sur Modifier.

PowerShell SFTP automation – editing a script file

Windows PowerShell ISE s’ouvre. Il s’agit d’un outil Windows natif qui colore la syntaxe pour plus de commodité et affiche les commandes PowerShell disponibles dans le volet droit.

SFTP script editing for running in PowerShell

Les commandes du script de test sont désormais les suivantes :

New-item -itemtype directory -force -path c:tempps

$password = Get-Content "C:temppassword.txt" | ConvertTo-SecureString

$creds = $credential = New-Object System.Management.Automation.PsCredential("user1",$password)

$Session = New-SFTPSession -Computername 192.168.101.209 -credential $creds

Get-SFTPFile -SessionId $session.SessionID -RemoteFile /home/user1/shared/NetFrameworkNDP462.exe -LocalPath c:tempps

Vous pouvez modifier à nouveau votre script et le configurer pour qu’il exécute le fichier d’installation téléchargé sur la machine Windows. La commande permettant d’installer .NET Framework en mode silencieux (from le répertoire où se trouve le fichier d’installation) est la suivante :

.NetFrameworkNDP462.exe /q /norestart

Entrez le nom de votre fichier d’installation si celui-ci est différent.

Ajoutez la ligne à la fin du script :

Start-process "C:temppsNetFrameworkNDP462.exe" -argumentlist /q /norestart

Si vous souhaitez supprimer le fichier d’installation après l’installation terminée, pensez à ajouter cette ligne à la fin du script :

remove-item -path "C:temppsNetFrameworkNDP462.exe" -recurse -force

L’utilisation de PowerShell et Posh-SSH vous permet d’automatiser les opérations dans PowerShell à l’aide du protocole SFTP pour copier des fichiers entre les hôtes du réseau. Vous pouvez créer un script pour télécharger des fichiers et les exécuter afin de gagner du temps lorsque vous devez effectuer une installation massive de logiciels sur un grand nombre d’ordinateurs.

Conclusion

Vous pouvez désormais copier des fichiers vers/depuis des machines Linux via SFTP si un serveur SSH est configuré sur les machines Linux. Posh-SSH est un module PowerShell nécessaire pour utiliser SFTP sur les machines Windows à partir desquelles vous souhaitez accéder à des serveurs SFTP distants et effectuer des tâches d’automatisation SFTP. PowerShell et SFTP peuvent être utilisés par les fournisseurs de services gérés et les administrateurs système dans les organisations.

PowerShell est souvent utilisé pour gérer les machines virtuelles Hyper-V et VMware (dans PowerCLI). N’oubliez pas de sauvegarder les machines virtuelles Hyper-V. Tout comme PowerShell est utilisé pour automatiser l’exécution de commandes, NAKIVO Backup & Replication automatise la sauvegarde des machines virtuelles et offre de nombreuses fonctionnalités supplémentaires de protection des données. De plus, le produit prend en charge l’installation en Mode multitenant, ce qui est particulièrement utile pour les fournisseurs de services gérés. Téléchargez l’Édition gratuite de NAKIVO Backup & Replication et commencez dès aujourd’hui à protéger vos machines virtuelles et physiques.

Try NAKIVO Backup & Replication

Try NAKIVO Backup & Replication

Get a free trial to explore all the solution’s data protection capabilities. 15 days for free. Zero feature or capacity limitations. No credit card required.

Les gens qui ont consulté cet article ont également lu