Загрузите файл в SFTP с помощью PowerShell
Нам было предложено настроить автоматическую загрузку с одного из наших серверов на сайт SFTP. В понедельник утром будет файл, который экспортируется из базы данных в фильтр, и они хотят, чтобы файл был загружен в SFTP во вторник. Текущий метод аутентификации, который мы используем, - это имя пользователя и пароль (я считаю, что есть опция также иметь ключевой файл, но была выбрана опция имени пользователя/пароля).
То, как я предвижу это, состоит в том, чтобы на сервере сидеть script, который будет запускаться планировщиком задач Windows для запуска в определенное время (вторник), которое будет захватывать файл, о котором идет речь, загрузить его в SFTP и затем переместите его в другое место для целей резервного копирования.
Например:
В этот момент я несколько раз пробовал 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\*