Kopieren von Dateien von SFTP auf einen lokalen Host (Windows Server) mit Powershell

0

Ich benutze den folgenden Power-Shell-Befehl, um die Datei vom Server "SFTP" auf den Windows-Server zu kopieren. Aus irgendeinem Grund funktioniert das Skript nicht. Bitte helfen Sie

# Scriptname.ps1
# send the files to Win-Server server F:\data\in
# Source files are deleted after transfer
# Local Path is the source path
# RemotePath is the flies destination path

Function Scriptname {
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $Username = $(throw "Username parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $Password = $(throw "Password parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $HostName = $(throw "HostName parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $RemotePath = $(throw "RemotePath parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $LocalPath = $(throw "LocalPath parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $SshHostKeyFingerprint = $(throw "SshHostKeyFingerprint parameter is required"),
        $Remove=$true

    )
    if( -not (Test-Path $LocalPath)) {
        throw("ERROR: Unable to locate LocalPath (path=${LocalPath})")
    }

    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    $SftpModuleDirectory = Split-Path $Invocation.MyCommand.Path

    [Reflection.Assembly]::LoadFrom("${SftpModuleDirectory}\WinSCPnet.dll") | Out-Null

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions
    $sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
    $sessionOptions.HostName = $HostName
    $sessionOptions.UserName = $Username
    $sessionOptions.Password = $Password
    $sessionOptions.SshHostKeyFingerprint = $SshHostKeyFingerprint #"ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

    $session = New-Object WinSCP.Session

    # connect to FTP session
    try {

        $session.Open($sessionOptions)
        $session.GetFiles($remotePath, $localPath,$remove).Check() 

    } catch {

        if($_.Exception.ToString().Contains("Host key wasn't verified!")) {
            throw("invalid SshHostKeyFingerprint, unable to open session to FTP (host=${HostName}, SshHostKeyFingerprint=${SshHostKeyFingerprint})")
        }       
        elseif($_.Exception.ToString().Contains("No supported authentication methods available")) {
            throw("Unable to open session to FTP (host=${HostName}, username=${Username})")
        }       
    }

    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    } 
}

$UserName = GetEnvironmentConfigValue "Scriptname.UserName"
$Password = GetEnvironmentConfigValue "Scriptname.Password"
$HostName = GetEnvironmentConfigValue "Scriptname.HostName"
$RemotePath = GetEnvironmentConfigValue "Scriptname.RemotePath"
$LocalPath = GetEnvironmentConfigValue "Scriptname.LocalPath"
$SshHostKeyFingerprint = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
$Remove=$true

Write-host "values: ${Username} ${Password} ${HostName} ${RemotePath} ${LocalPath} ${SshHostKeyFingerprint}"

SFTPUploadFiles $Username $Password $HostName $RemotePath $LocalPath $SshHostKeyFingerprint 
Ealhiary
quelle
Welchen Fehler bekommen Sie und was funktioniert speziell nicht?
Megamorf
Das Skript lief ohne Fehler, aber es wurden keine Dateien im
Zielpfad angezeigt.
Ich gehe davon aus, dass der gesamte Code, nachdem die Funktion Ihnen gehört (GetEnvironmentConfigValue usw.), korrekt ist. Soll die Funktion niemals aufgerufen werden? Die Funktion heißt in Ihrem Beispiel scriptname und wird nicht SFTPUploadFilesin der letzten Codezeile verwendet.
Megamorf
Richtig, diese Werte werden in der Umgebungsdatei gespeichert, in der sie bereits deklariert wurden. und ich rufe sie aus dem Skript. Da ich derzeit an einer mehrstufigen Umgebung arbeite und die Pfade auf jeder Stufe wiederholt ändern muss, habe ich das Skript möglicherweise zwischen dem Kopieren von SFTP auf den lokalen Server (was erforderlich ist) und dem Kopieren von lokal auf SFTP
gemischt
Seine Arbeit danke, danke viel "Die Funktion heißt in Ihrem Beispiel scriptname und nicht SFTPUploadFiles, die Sie in der letzten Zeile Ihres Codes verwenden", das war das Problem
Ealhiary

Antworten:

2

Ok, abgesehen davon, dass der Funktionsname falsch war und das Skript Ihre Dateien nicht kopierte, möchte ich Ihnen Powershell-Splatting zeigen:

$UserName = GetEnvironmentConfigValue "Scriptname.UserName"
$Password = GetEnvironmentConfigValue "Scriptname.Password"
$HostName = GetEnvironmentConfigValue "Scriptname.HostName"
$RemotePath = GetEnvironmentConfigValue "Scriptname.RemotePath"
$LocalPath = GetEnvironmentConfigValue "Scriptname.LocalPath"
$SshHostKeyFingerprint = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
$Remove=$true

Write-host "values: ${Username} ${Password} ${HostName} ${RemotePath} ${LocalPath} ${SshHostKeyFingerprint}"

SFTPUploadFiles $Username $Password $HostName $RemotePath $LocalPath $SshHostKeyFingerprint 

Das folgende ist das selbe, aber mit dem Splatting. Es wird eine Hash-Tabelle verwendet, die an eine Funktion übergeben werden kann, solange alle Hash-Tabellen-Schlüssel (die Zeichenfolgen vor dem = -Zeichen) mit den Funktionsparameternamen übereinstimmen:

$Parameters = @{
   "UserName" = GetEnvironmentConfigValue "Scriptname.UserName"
   "Password" = GetEnvironmentConfigValue "Scriptname.Password"
   "HostName" = GetEnvironmentConfigValue "Scriptname.HostName"
   "RemotePath" = GetEnvironmentConfigValue "Scriptname.RemotePath"
   "LocalPath" = GetEnvironmentConfigValue "Scriptname.LocalPath"
   "SshHostKeyFingerprint" = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
}


$Parameters

SFTPUploadFiles @Parameters -Remove:$false

Da Ihre Funktion Remove standardmäßig auf true setzt, ist es überflüssig, sie anzugeben. Mein Beispiel zeigt Ihnen, dass Sie normale Parameter mit der Hash-Tabelle, die für das Splattern verwendet wird, mischen und abgleichen können.

Megamorf
quelle
hallo, würdest du mir bitte nochmal helfen, ich möchte den gleichen Job wie oben ausführen, aber ich habe nur Benutzername und privatekey.ppk ist es möglich, das zu tun (Kopieren von SFTP zu localhost) ohne Passwort
Ealhiary