web-dev-qa-db-fra.com

Télécharger un fichier vers SFTP à l'aide de PowerShell

Nous avons été invités à configurer un téléchargement automatisé d'un de nos serveurs vers un site SFTP. Un fichier sera exporté d’une base de données vers un fichier tous les lundis matins et ils souhaitent que le fichier soit chargé dans SFTP mardi. La méthode d'authentification actuelle que nous utilisons est le nom d'utilisateur et le mot de passe (je crois qu'il y avait une option permettant également d'avoir un fichier de clé, mais l'option nom d'utilisateur/mot de passe a été choisie).

La façon dont je l’envisage est d’avoir un script assis sur un serveur qui sera déclenché par le planificateur de tâches Windows pour s’exécuter à une heure précise (mardi) qui saisira le fichier en question, le téléchargera vers le SFTP, puis le déplacera vers un fichier. emplacement différent à des fins de sauvegarde.

Par exemple:

  • Répertoire local: C:\FileDump

  • Répertoire SFTP: /Outbox/

  • Répertoire de sauvegarde: C:\Backup

J'ai essayé peu de choses à ce stade, WinSCP étant l'un d'entre eux ainsi que composant logiciel enfichable SFTP PowerShell mais rien n'a fonctionné pour moi jusqu'à présent.

Cela fonctionnera sur Windows Server 2012R2.
Quand je cours Get-Host La version de mon hôte console est 4.0.

Merci.

21
Konstantin V

Il n'y a pas actuellement de méthode PowerShell intégrée pour effectuer la partie SFTP. Vous devrez utiliser quelque chose comme psftp.exe ou un module PowerShell tel que Posh-SSH.

Voici un exemple utilisant Posh-SSH :

# Set the credentials
$Password = ConvertTo-SecureString 'Password1' -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ('root', $Password)

# Set local file path, SFTP path, and the backup location path which I assume is an SMB path
$FilePath = "C:\FileDump\test.txt"
$SftpPath = '/Outbox'
$SmbPath = '\\filer01\Backup'

# Set the IP of the SFTP server
$SftpIp = '10.209.26.105'

# Load the Posh-SSH module
Import-Module C:\Temp\Posh-SSH

# Establish the SFTP connection
$ThisSession = New-SFTPSession -ComputerName $SftpIp -Credential $Credential

# Upload the file to the SFTP path
Set-SFTPFile -SessionId ($ThisSession).SessionId -LocalFile $FilePath -RemotePath $SftpPath

#Disconnect all SFTP Sessions
Get-SFTPSession | % { Remove-SFTPSession -SessionId ($_.SessionId) }

# Copy the file to the SMB location
Copy-Item -Path $FilePath -Destination $SmbPath

Quelques notes supplémentaires:

  • Vous devrez télécharger le module Posh-SSH que vous pourrez installer dans votre répertoire de modules utilisateur (par exemple, C:\Utilisateurs\jon_dechiro\Documents\WindowsPowerShell\Modules) et charger simplement en utilisant le nom ou le placer n'importe où et le charger comme je avoir dans le code ci-dessus.
  • Si les informations d'identification dans le script ne sont pas acceptables, vous devez utiliser un fichier d'informations d'identification. Si vous avez besoin d’aide, je peux mettre à jour certains détails ou vous indiquer des liens.
  • Modifiez les chemins, les adresses IP, etc. selon vos besoins.

Cela devrait vous donner un bon point de départ.

22
Jon Dechiro

Vous ne nous avez pas dit quel problème particulier aviez-vous avec WinSCP, je ne peux donc que répéter ce qui est dans la documentation WinSCP.

  • Télécharger l'assemblage WinSCP .NET .
    Le dernier paquet en date est le WinSCP-5.15.4-Automation.Zip;
  • Extrait le .Zip archive le long de votre script;
  • Utilisez un code comme celui-ci (basé sur le texte officiel exemple de téléchargement de PowerShell ):

    # Load WinSCP .NET Assembly
    Add-Type -Path "WinSCPnet.dll"
    
    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = "example.com"
        UserName = "user"
        Password = "mypassword"
        SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx...="
    }
    
    $session = New-Object WinSCP.Session
    
    try
    {
        # Connect
        $session.Open($sessionOptions)
    
        # Upload
        $session.PutFiles("C:\FileDump\export.txt", "/Outbox/").Check()
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }
    

WinSCP peut générer pour vous le script PowerShell:

  • Connectez-vous à votre serveur avec l'interface graphique WinSCP.
  • Accédez au répertoire cible dans le panneau de fichier distant.
  • Sélectionnez le fichier à télécharger dans le panneau de fichiers local;
  • Appelez la commande Upload ;
  • Dans le boîte de dialogue des options de transfert , accédez à Paramètres de transfert> Générer du code ;
  • Dans la boîte de dialogue Générer le code de transfert, sélectionnez l'onglet . NET Assembly code ;
  • Choisissez la langue de PowerShell .

Vous obtiendrez un code comme ci-dessus avec tous les paramètres de session et de transfert renseignés.

Generate transfer code dialog

(je suis l'auteur de WinSCP)

49
Martin Prikryl

Utilisation de pscp.exe de PuTTY (que j'ai dans un $env:path répertoire):

pscp -sftp -pw passwd c:\filedump\* user@Host:/Outbox/
mv c:\filedump\* c:\backup\*
4