2016-08-02 130 views
11

Wir wurden aufgefordert, einen automatisierten Upload von einem unserer Server auf eine SFTP-Site einzurichten. Es wird jeden Montagmorgen eine Datei geben, die aus einer Datenbank in einen Filer exportiert wird, und sie möchte, dass die Datei am Dienstag auf SFTP hochgeladen wird. Die aktuelle Authentifizierungsmethode, die wir verwenden, ist Benutzername und Passwort (ich glaube, es gab auch eine Option, eine Schlüsseldatei zu haben, aber die Option Benutzername/Passwort wurde gewählt).Datei mit PowerShell auf SFTP hochladen

Die Weise, die ich mir dies vorstellt, ist ein Skript auf einem Server sitzen, der von Windows Task Scheduler zu einer bestimmten Zeit (Dienstag) ausgeführt wird, die die fragliche Datei greifen wird, laden Sie es auf den SFTP und dann Verschieben Sie es zu Sicherungszwecken an einen anderen Ort.

Zum Beispiel:

  • Lokalverzeichnis: C:\FileDump

  • SFTP-Verzeichnis: /Outbox/

  • Backup-Verzeichnis: C:\Backup

ich diese paar Dinge ausprobiert Punkt WinSCP ist einer von ihnen sowie SFTP PowerShell Snap-In aber nichts hat für mich bisher funktioniert.

Dies wird auf Windows Server 2012R2 ausgeführt werden.
Wenn ich Get-Host ausführen, ist meine Konsole Host-Version 4.0.

Danke.

+0

Ich habe einen FTP-Skript das verwendet System.Net.WebRequestMethods + FTP Ich verwendete http://www.thomasmaurer.ch/2010/11/powershell-ftp-upload-and-download/ als Basis. Wenn Sie mehr Hilfe benötigen, kann ich meinen Code für die Veröffentlichung freigeben. –

+0

@GlenBuktenica Die Frage ist über SFTP, nicht FTP. –

Antwort

13

Derzeit gibt es keine integrierte PowerShell-Methode für den SFTP-Teil. Sie müssen etwas wie psftp.exe oder ein PowerShell-Modul wie Posh-SSH verwenden.

Hier ist ein Beispiel unter Verwendung von 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 
New-SFTPSession -ComputerName $SftpIp -Credential $Credential 

# Upload the file to the SFTP path 
Set-SFTPFile -SessionId 0 -LocalFile $FilePath -RemotePath $SftpPath 

# Disconnect SFTP session 
(Get-SFTPSession -SessionId 0).Disconnect() 

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

Einige zusätzliche Anmerkungen:

  • Sie finden das Posh-SSH-Modul herunterladen müssen, die Sie in Ihrem Benutzermodulverzeichnis installieren können (zB C: \ Benutzer \ jon_dechiro \ Dokumente \ WindowsPowerShell \ Module) und laden Sie einfach mit dem Namen oder legen Sie es überall und laden Sie es wie ich im obigen Code haben.
  • Wenn die Anmeldeinformationen im Skript nicht akzeptabel sind, müssen Sie eine Anmeldeinformationsdatei verwenden. Wenn Sie Hilfe benötigen, kann ich mit einigen Details aktualisieren oder Sie auf einige Links verweisen.
  • Ändern Sie die Pfade, IPs usw. nach Bedarf.

Das sollte Ihnen einen anständigen Ausgangspunkt geben.

19

Sie haben uns nicht sagen, was besonderes Problem haben Sie mit dem WinSCP haben, so kann ich wirklich nur wiederholen, was in WinSCP Dokumentation ist.

  • Download WinSCP .NET assembly.
    Das neueste Paket ist ab sofort WinSCP-5.13-Automation.zip;
  • Extract das .zip Archiv entlang Ihres Skripts;
  • Verwenden Sie einen Code wie folgt (basierend auf dem offiziellen PowerShell upload example):

    # 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() 
    } 
    

Sie haben WinSCP für Sie das Powershell-Skript für den Upload erzeugen:

  • Melden Sie sich mit der WinSCP GUI auf Ihrem Server an.
  • Navigieren Sie zum Zielverzeichnis im Remote-Dateibereich;
  • Wählen Sie die Datei für den Upload im lokalen Dateibereich aus.
  • Rufen Sie die Upload Befehl;
  • Wechseln Sie unter Transfer options dialog zu Übertragungseinstellungen> Code generieren;
  • Wählen Sie im Dialogfeld Übertragungscode generieren den Eintrag .NET assembly code tab;
  • Wählen Sie PowerShell Sprache.

Sie erhalten einen Code wie oben mit allen Sitzungs- und Transfereinstellungen gefüllt bekommen.

Generate transfer code dialog

(ich bin der Autor von WinSCP)

+1

Ich hatte Probleme, gestern dieses Zeug herauszufinden. Dann habe ich deinen Beitrag gefunden. Dies half A LOT! Ich habe meinen Test in nur wenigen Minuten funktioniert und es scheint alles funktioniert. Das ist eine super Sache, Sir. Manchmal ist alles, was Sie brauchen, ein gutes Beispiel. –

+0

Wow, tolle Info, ich hatte nicht erkannt, dass WinSCP diese Funktion hatte! Ich liebe deine Software :) Eine Art von Ärgernis, es wäre wunderbar, wenn WinSCP mehr Anpassung für den Verbindungsprozess erlauben könnte. Ich kann SCP-Dateien mit PLINK an meine Cisco-Geräte senden, da ein direkter SCP nur einmal authentifizieren muss, aber ich kann keine Verbindung herstellen und einen DIR ohne "En" abrufen, was nur ein Passwort als Antwort erfordert, und ich kann nicht finde heraus, wie WinSCP dafür eingerichtet wird. Vielleicht könnten wir den Verbindungsprozess mit XMLS eines Tages mehr kontrollieren? –

+0

WinSCP arbeitete wie ein Champion für meine Sftp-Probleme – digitalslavery