web-dev-qa-db-ja.com

PowerShellを使用してファイルをSFTPにアップロードする

サーバーの1つからSFTPサイトへの自動アップロードを設定するように求められました。毎週月曜日の朝にデータベースからファイラーにエクスポートされるファイルがあり、火曜日にファイルをSFTPにアップロードする必要があります。現在使用している認証方法はユーザー名とパスワードです(キーファイルもあるオプションがあると思いますが、ユーザー名/パスワードオプションが選択されました)。

これを想定している方法は、特定の時間(火曜日)に実行するWindowsタスクスケジューラによってトリガーされるサーバー上にスクリプトを配置し、問題のファイルを取得してSFTPにアップロードしてから、バックアップ用の別の場所。

例えば:

  • ローカルディレクトリ:C:\FileDump

  • SFTPディレクトリ:/Outbox/

  • バックアップディレクトリ:C:\Backup

この時点で、WinSCPがそれらの1つであるだけでなく、 SFTP PowerShellスナップイン で試したことはほとんどありませんでしたが、これまでのところ何も機能していません。

これは、Windows Server 2012R2で実行されます。
Get-Hostを実行すると、コンソールのホストバージョンは4.0です。

ありがとう。

21
Konstantin V

現在、SFTPの部分を実行するための組み込みのPowerShellメソッドはありません。 psftp.exeのようなものまたはPosh-SSHのようなPowerShellモジュールを使用する必要があります。

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

いくつかの追加のメモ:

  • ユーザーモジュールディレクトリ(C:\ Users\jon_dechiro\Documents\WindowsPowerShell\Modulesなど)にインストールできるPosh-SSHモジュールをダウンロードして、名前を使用してロードするか、どこかに置いて、私のようにロードする必要があります。上記のコードにあります。
  • スクリプトに資格情報を含めることが受け入れられない場合は、資格情報ファイルを使用する必要があります。それに関して助けが必要な場合は、いくつかの詳細を更新するか、いくつかのリンクを示します。
  • 必要に応じて、パス、IPなどを変更します。

それはあなたにまともな出発点を与える必要があります。

22
Jon Dechiro

WinSCPに関してどのような問題があるのか​​教えてくれなかったので、WinSCPのドキュメントにあるものだけを繰り返すことができます。

  • WinSCP .NETアセンブリのダウンロード
    現在の最新パッケージはWinSCP-5.15.4-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の著者です)

49
Martin Prikryl

PuTTYのpscp.exe を使用(これは$env:pathディレクトリにあります):

pscp -sftp -pw passwd c:\filedump\* user@Host:/Outbox/
mv c:\filedump\* c:\backup\*
4