PuTTY でポートフォワードする際にウィンドウが出て鬱陶しいのでポートフォワード専用アプリでも作ろうかなと思って .NET Framework 向けの SSH ライブラリーを調べたら SSH.NET Library というものを見つけました。リモートコマンドの実行や SFTP といった SSH の基本的な機能をサポートします。
SSH.NET Library が扱える秘密鍵の形式は OpenSSH です。 PuTTY の場合は事前に秘密鍵を PuTTYgen で OpenSSH 形式のファイルに変換しておく必要があります。
私の目的であったポートフォワードの例を次に示します。ホストの 8080 番ポートをクライアントの 58080 番ポートにフォワーディングするという想定です。
using System.Net; using Renci.SshNet; using (key = PrivateKeyFile(@"X:\Path\To\PrivateKeyFile", "my secret passphrase")) using (connection = PrivateKeyConnectionInfo("ssh.example.com", "user", key)) using (client = SshClient(connection)) { client.Connect(); def loopback = IPAddress.Loopback.ToString(); using (forward = ForwardedPortLocal(loopback, 58080u, loopback, 8080u)) { client.AddForwardedPort(forward); forward.Start(); // Here we can access to localhost:58080 forward.Stop(); } client.Disconnect(); }
ForwardedPortLocal
の第一引数 (boundedHost) がないコンストラクターもあるのですが,省略すると常に ArgumentException
が投げられるので実質省略不可です。
サンプルアプリケーション
サンプルアプリケーションを作成しました。タスクトレイに常駐するポートフォワード専用クライアントです。
更新履歴
- [2012-07-25 21:00 更新] クライアントのポート番号を 80 から 58080 に変更。予約済みでないポート番号にした。
- [2012-07-26 19:00 更新] サンプルアプリケーションを追加。