Cách sao chép tệp từ SFTP sang máy chủ cục bộ (máy chủ windows) bằng powershell


0

Tôi đang sử dụng lệnh power shell dưới đây để sao chép tệp từ máy chủ "SFTP" sang máy chủ windows. vì một số lý do, Script không hoạt động, xin vui lòng giúp đỡ

# 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 

Lỗi gì bạn nhận được, và những gì không hoạt động cụ thể?
megamorf 22/03/2015

tập lệnh chạy không có lỗi nhưng không có tệp nào được hiển thị ở đường dẫn đích, tôi khá chắc chắn rằng các tệp trong đường dẫn nguồn, cảm ơn vì sự hợp tác cao của bạn
Ealhiary 22/03/2015

Tôi giả sử tất cả mã sau hàm là của bạn (GetEn MôiConfigValue, v.v.), đúng không? Có dự định rằng chức năng không bao giờ được gọi? Hàm được gọi là scriptname trong ví dụ của bạn chứ không phải SFTPUploadFilesbạn sử dụng ở dòng cuối cùng của mã.
megamorf

chính xác, những giá trị đó được lưu trong tệp môi trường nơi đã khai báo. và tôi đang gọi họ từ kịch bản. bởi vì tôi hiện đang làm việc trên môi trường nhiều giai đoạn và cần thay đổi đường dẫn trên mọi giai đoạn nhiều lần, có thể tôi đã trộn lẫn kịch bản giữa sao chép từ SFTP sang máy chủ cục bộ (cần phải làm) và sao chép từ cục bộ sang SFTP
Ealhiary

công việc của nó cảm ơn, cảm ơn rất nhiều "Hàm được gọi là scriptname trong ví dụ của bạn chứ không phải SFTPUploadFiles mà bạn sử dụng ở dòng cuối cùng của mã" đó là vấn đề
Ealhiary 22/03/2015

Câu trả lời:


2

Ok, ngoài việc tìm ra rằng tên hàm bị sai khiến tập lệnh không sao chép các tập tin của bạn, tôi muốn cho bạn thấy việc ghép nối Powershell:

$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 

Sau đây là như nhau nhưng với splatter. Nó sử dụng hàm băm có thể được truyền cho hàm miễn là tất cả các khóa có thể băm (các chuỗi trước dấu =) khớp với tên tham số của hàm:

$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

Vì hàm của bạn đặt Remove thành true theo mặc định, nó không cần thiết để chỉ định nó. Ví dụ của tôi cho bạn thấy rằng bạn có thể trộn và khớp các tham số bình thường với hàm băm được sử dụng để ghép nối.


xin chào, bạn vui lòng giúp tôi một lần nữa tôi muốn thực hiện cùng một Công việc ở trên, nhưng tôi chỉ có Tên người dùng và privatekey.ppk có thể làm điều đó (Sao chép từ SFTP sang localhost) mà không cần mật khẩu
Ealhiary
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.