【PowerShell】WinSCPを使ってSSH秘密鍵でサーバーへアクセスする

PowerShell
スポンサーリンク
スポンサーリンク

今回はWindowsクライアントからSFTPを使用してデータをアップロードします。その際の接続方法はパスワード方式ではなく公開鍵方式で接続します。

スポンサーリンク

前提

・サーバーへ接続する秘密鍵を持っている

・PowerShellのソースコード(ps1)ファイルで実行したい。自動でSFTPサーバーに接続するシステムを構築するため。

使用ツール

  • PowerShell
  • WinSCP

WindowsでもOpenSSLが標準搭載になったようですが、使用方法がよくわかりませんでした。WinSCPはインストールすればすぐ使用できるので完成スピードを優先させるためWinSCPにしました。

WinSCPをインストールする

WinSCPをこちらから最新版をダウンロードし、インストールしてください。

WinSCP :: Official Site :: Download
WinSCP is a free file manager for Windows supporting FTP, SFTP, S3 and WebDAV.
ポイント

インストール時、ユーザーのみもしくは全体にインストールと選択できます。
全体にインストールを選択してインストールしてください。

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ファイルを参照させていなかったのです。これに気づくのに時間がかかりました。ですので記憶に残す意味と皆様のお役に立てれば嬉しく思います。

コメント

タイトルとURLをコピーしました