今回はWindowsクライアントからSFTPを使用してデータをアップロードします。その際の接続方法はパスワード方式ではなく公開鍵方式で接続します。
前提
・サーバーへ接続する秘密鍵を持っている。
・PowerShellのソースコード(ps1)ファイルで実行したい。自動でSFTPサーバーに接続するシステムを構築するため。
使用ツール
- PowerShell
- WinSCP
WindowsでもOpenSSLが標準搭載になったようですが、使用方法がよくわかりませんでした。WinSCPはインストールすればすぐ使用できるので完成スピードを優先させるためWinSCPにしました。
WinSCPをインストールする
WinSCPをこちらから最新版をダウンロードし、インストールしてください。
SFTPサーバーにログインするための秘密鍵をppkに変更しておく
PowerShellでSFTPをする際に秘密鍵の認証でアクセスさせます。WinSCPでは秘密鍵が拡張子ppkになっていないと使用できません。一度、インストールしたWinSCPを使用して実際にログインさせましょう。
拡張子ppk秘密鍵の作成方法
SFTPで接続する設定をします。「ホスト名」「ユーザー名」を入力します。「パスワード」は入力しません。その後「設定」を押します。
設定画面の「SSH」→「認証」→「秘密鍵」にお持ちの秘密鍵を選択して下さい。拡張子ppk以外選択できない場合は「ファイル名」右側を「すべてのファイル(*.*)」に変更してください。
秘密鍵を選択すると「秘密鍵 OpenSSH を PuTTY 形式に変更しますか?」と聞かれますので「OK」を選択してください。ppk秘密鍵を保存する場所を選択します。
拡張子ppk秘密鍵が選択されました。「OK」を押して設定画面を閉じてください。
接続設定ができましたので実際に接続テストをしてみてください。GUI版WinSCPでは秘密鍵認証が可能であることが確認できます。
FingerPrintを取得する
SFTPサーバーのFingerPrintを取得しましょう。これがないとSFTPで接続することができません。そのためのPowerShellソースがこちら
# SFTPを使用するためにFingerprintが必要。これで確認。
# WinSCPを使用するためのオマジナイ
Add-Type -Path "${env:ProgramFiles(x86)}\WinSCP\WinSCPnet.dll"
# セッションオプション
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "xxx.xxx.xxx.xxx"
}
$session = New-Object WinSCP.Session
try
{
$fingerprint = $session.ScanFingerprint($sessionOptions, "SHA-256")
}
finally
{
$session.Dispose()
}
# Fingerprintを表示
Write-Output $fingerprint
SFTPのPowerShellを準備する
これで接続するための準備が整いました。あとはPowerShellで記述するだけです。
# WinSCPを使用するためのオマジナイ
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "xxx.xxx.xxx.xxx"
UserName = "user"
SshPrivateKeyPath = "C:\Users\papa\Documents\ssh\privatekey.ppk"
PrivateKeyPassphrase = "xxxxxxxxxx"
SshHostKeyFingerprint = "前述のPowerShellで取得したFingerprint"
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
# Upload files
$session.PutFiles("/upload/*", "C:\upload\*").Check()
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
秘密鍵にパスワードをつけた場合は オプションで「PrivateKeyPassphrase」を指定する必要があります。
いかがだったでしょうか?
実は秘密鍵のところでてこずりました。ppkファイルを参照させていなかったのです。これに気づくのに時間がかかりました。ですので記憶に残す意味と皆様のお役に立てれば嬉しく思います。
コメント