Télécharger le fichier vers SFTP en utilisant PowerShell

on nous a demandé de mettre en place un téléchargement automatisé d'un de nos serveurs vers un site SFTP. Il y aura un fichier exporté d'une base de données à un déclarant tous les lundis matin et ils veulent que le fichier soit téléchargé à SFTP le 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 pour avoir le fichier clé aussi bien que l'option Nom d'utilisateur/mot de passe a été choisie).

la façon dont j'envisage ceci est d'avoir un script Assis sur un serveur cela sera déclenché par le planificateur de tâches Windows à exécuter à un moment précis (mardi) qui saisira le fichier en question le télécharger dans la SFTP et ensuite le déplacer à un endroit différent pour les besoins de la 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 point WinSCP étant l'un d'eux ainsi que SFTP PowerShell Snap-In mais rien n'a fonctionné pour moi jusqu'à présent.

ce sera exécuté sur Windows Server 2012R2.

Quand je run Get-Host ma version hôte de la console est 4.0.

Merci.

17
demandé sur Martin Prikryl 2016-08-03 02:28:40

3 réponses

il n'y a pas actuellement de méthode PowerShell intégrée pour faire la partie SFTP. Vous devrez utiliser quelque chose comme psftp.exe ou un module PowerShell comme 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 pouvez installer dans le répertoire de votre module utilisateur (par exemple: C:\Users\jon_dechiro\Documents\WindowsPowerShell\Modules) et il suffit de charger à l'aide du le nom ou le mettre n'importe où et de le charger comme j'ai le code ci-dessus.
  • si la présence des justificatifs d'identité dans le script n'est pas acceptable, vous devrez utiliser un fichier de justificatifs d'identité. Si vous avez besoin d'aide avec cela, je peux mettre à jour avec quelques détails ou vous indiquer certains liens.
  • Modifier les chemins d'accès, IPs, etc. en tant que de besoin.

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

18
répondu Jon Dechiro 2018-04-10 23:39:17

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

  • Download WinSCP. net assembly.

    Le dernier train de mesures pour l'instant est WinSCP-5.13.4-Automation.zip;
  • Extrait.zip archive le long de votre script;
  • utilisez un code comme celui-ci (basé sur letéléchargement de PowerShell exemple):

    # 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 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
    }
    
    $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()
    }
    

vous pouvez demander à WinSCP de générer le script PowerShell pour le téléchargement:

  • Connexion à votre serveur avec WinSCP GUI;
  • Naviguer vers le répertoire cible dans le fichier distant panneau;
  • Sélectionner le fichier à télécharger dans le fichier local du panneau;
  • Invoquez le Télécharger commande;
  • Sur le dialogue D'options de transfert, aller à Paramètres De Transfert > Générer Du Code;
  • dans la boîte de dialogue Générer le code de transfert, sélectionnez .net code d'assemblage onglet;
  • Choisir PowerShell langue.

vous obtiendrez un code comme ci-dessus avec tous les paramètres de session et de transfert remplis.

Generate transfer code dialog

(je suis l'auteur de WinSCP)

33
répondu Martin Prikryl 2018-08-31 13:38:55

en utilisant Mastic de pscp.exe (que j'ai dans un $env:path répertoire):

pscp -sftp -pw passwd c:\filedump\* user@host:/Outbox/
mv c:\filedump\* c:\backup\*
3
répondu TessellatingHeckler 2016-08-03 05:09:07