[C#] SharpSSH で SSH 公開鍵認証で SFTP
2011-8-30 00:14
.NET で SSH を行なうライブラリとして SharpSSH というのがあります。
ネット上をさがすとパスワード認証のサンプルは結構あるのですが、公開鍵・秘密鍵を使った認証方法のサンプルがありません。
NSDN のフォーラムの SFTP Communications in C# using Private – Public key というページに公開鍵暗号で SFTP を行なうコードのサンプルとしてラッパークラスである SftpPlugin というクラスが投稿されていました。
このクラスを利用すると簡単にファイルのアップロードやダウンロードができるのですが、公開鍵のパスフレーズが空の場合でないとうまくいかないことが判りました。
いろいろ調べた結果、password として指定した文字列は公開鍵・秘密鍵を使わないパスワード認証の差異にしか使われず、秘密鍵のパスフレーズとしては利用されていないことが判りました。
そこで、.netでSFTPをしてみる 2 | hippos-lab::blog の記事を参考に SftpPlugin クラスを書き換えたところ、公開鍵認証でパスフレーズを使用する場合にも対応できました。
以下、そのクラスの修正版コードを載せておきます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Tamir.SharpSsh; namespace FileTransfer { public class SftpPlugin { // Private fields private int _port; private string _privateSshKeyPath; private string _password; private Tamir.SharpSsh.Sftp _tamirSftp; public SftpPlugin(string host, int port, string username, string password, string privateSshKeyPath) { this._tamirSftp = new Sftp(host, username, password); this._port = port; this._password = password; this._privateSshKeyPath = privateSshKeyPath; } // Private Methods private void Connect() { try { // add the private Key if it is specified if (!string.IsNullOrEmpty(this._privateSshKeyPath)) { this._tamirSftp.AddIdentityFile(this._privateSshKeyPath, _password); } this._tamirSftp.Connect(this._port); } catch (Exception ex) { throw ex; } } // Public Methods // upload a file to a remote path public bool UploadFile(string file, string toRemotePath) { if (!this._tamirSftp.Connected) { this.Connect(); } try { this._tamirSftp.Put(file, toRemotePath); return true; } catch (Exception ex) { throw new Exception(ex.Message); } finally { this._tamirSftp.Close(); } } // download a file to a localPath public bool DownloadFile(string file, string toLocalPath) { if (!this._tamirSftp.Connected) { this.Connect(); } try { this._tamirSftp.Get(file, toLocalPath); return true; } catch (Exception ex) { throw new Exception(ex.Message); } finally { this._tamirSftp.Close(); } } // list the files of a remote location public string[] ListFiles(string remotePath) { if (!this._tamirSftp.Connected) { this.Connect(); } string[] files = new string[] { }; try { files = this._tamirSftp.GetFileList(remotePath).Cast().ToArray(); } catch (Exception ex) { throw new Exception(ex.Message); } finally { this._tamirSftp.Close(); } return files; } } }
コメントはまだありません
No comments yet.
Sorry, the comment form is closed at this time.