Загрузите файл в SFTP с помощью PowerShell

Нам было предложено настроить автоматическую загрузку с одного из наших серверов на сайт SFTP. В понедельник утром будет файл, который экспортируется из базы данных в фильтр, и они хотят, чтобы файл был загружен в SFTP во вторник. Текущий метод аутентификации, который мы используем, - это имя пользователя и пароль (я считаю, что есть опция также иметь ключевой файл, но была выбрана опция имени пользователя/пароля).

То, как я предвижу это, состоит в том, чтобы на сервере сидеть script, который будет запускаться планировщиком задач Windows для запуска в определенное время (вторник), которое будет захватывать файл, о котором идет речь, загрузить его в SFTP и затем переместите его в другое место для целей резервного копирования.

Например:

  • Локальный каталог: C:\FileDump

  • Каталог SFTP: /Outbox/

  • Резервный каталог: C:\Backup

В этот момент я несколько раз пробовал WinSCP, а также SFTP PowerShell Snap-In, но до сих пор ничего не работало,

Это будет работать в Windows Server 2012R2.
Когда я запускаю Get-Host, моя консольная версия хоста 4.0.

Спасибо.

Ответ 1

В настоящее время нет встроенного метода PowerShell для выполнения части SFTP. Вам придется использовать что-то вроде psftp.exe или модуль PowerShell, например, Posh-SSH.

Вот пример использования 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

Некоторые дополнительные заметки:

  • Вам нужно будет загрузить модуль Posh-SSH, который вы можете установить в каталог вашего пользовательского модуля (например, C:\Users\jon_dechiro\Documents\WindowsPowerShell\Modules), просто загрузить его по имени или поместить в любое место и загрузить так, как я иметь в коде выше.
  • Если учетные данные в сценарии недопустимы, вам придется использовать файл учетных данных. Если вам нужна помощь в этом, я могу обновить некоторые детали или указать вам ссылки.
  • При необходимости измените пути, IP-адреса и т.д.

Это должно дать вам достойную отправную точку.

Ответ 2

Вы не сообщили нам, какая у вас проблема с WinSCP, поэтому я могу только повторить то, что описано в документации WinSCP.

  • Загрузите сборку WinSCP.NET.
    Последний пакет на данный момент - WinSCP-5.15.5-Automation.zip;
  • Извлеките архив .zip вместе со своим сценарием;
  • Используйте такой код (на основе официального примера загрузки 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 на создание сценария PowerShell для загрузки:

  • Войдите на свой сервер с WinSCP GUI;
  • Перейдите к целевому каталогу на удаленной файловой панели;
  • Выберите файл для загрузки на панели локальных файлов;
  • Вызвать команду Upload;
  • В диалоговом окне "Параметры передачи" выберите "Параметры передачи"> "Создать код";
  • В диалоговом окне "Создать код передачи" выберите вкладку кода сборки .NET;
  • Выберите язык PowerShell.

Вы получите код, как указано выше, со всеми настройками сеанса и передачи.

Generate transfer code dialog

(Я автор WinSCP)

Ответ 3

Используя PuTTY pscp.exe (который есть в каталоге $env:path):

pscp -sftp -pw passwd c:\filedump\* [email protected]:/Outbox/
mv c:\filedump\* c:\backup\*