「C Sharpとネットワーク - SFTP」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「SFTPでファイルを転送する」を「C Sharpの応用 - SFTP」に、リダイレクトを残さずに移動しました)
(Wiki がページ「C Sharpの応用 - SFTP」を「C Sharpとネットワーク - SFTP」に、リダイレクトを残さずに移動しました)
(相違点なし)

2021年1月21日 (木) 10:09時点における版

概要

C# + SSH.NET + SFTPでファイル転送を行う方法を記載する。
SSH.NETは、NuGetで入手可能の.NET Framework専用のSSHライブラリである。

処理の流れ

1. 認証方法のインスタンスを生成する。
  公開鍵認証またはパスワード認証を選択する。
  公開鍵認証の場合は、ppk形式は指定できない。(例外が発生する)

2. 接続情報のインスタンスを生成する。
  生成した認証方法のインスタンスをコンストラクタの引数で渡す。

3. sftpClientのインスタンスを生成する。
  接続情報のインスタンスをコンストラクタの引数に渡す。

4. 処理を記述する。(ダウンロード処理やアップロード処理)

下記のサンプルコードでは、公開鍵認証を用いてユーザディレクトリのパスを取得するメソッドSystem.Environment.GetFolderPathを使用しているが、
Linuxでも問題なくユーザディレクトリ配下のパスを取得できる。

サンプルコード

 using System;
 using System.IO;
 using Renci.SshNet;
 
 class SFTP
 {
    static void Main(string[] args)
    {
       // 公開鍵認証の場合
       // 例としてユーザディレクトリ配下の.sshディレクトリ内のsecret_key.pemを秘密鍵として使用
       string secretKeyPath = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".ssh", 
                                          "secret_key.pem");
       var authMethod = new PrivateKeyAuthenticationMethod("username", new PrivateKeyFile(secretKeyPath, "finger_print"));
 
       // パスワード認証の場合(平文)
       //var authMethod = new PasswordAuthenticationMethod("username", "password");
 
       // 接続情報のインスタンス生成
       var connectionInfo = new ConnectionInfo("IPまたはホスト名", 22, "username", authMethod);
 
       using (var client = new SftpClient(connectionInfo))
       {
          // SSH接続を行う
          client.Connect();
 
          // ユーザディレクトリに移動
          client.ChangeDirectory("/home/username");
 
          // test.txtファイルを読み込み専用で開く
          using (var fs = System.IO.File.OpenRead("test.txt"))
          {
             // test.txtファイルをアップロード(trueを指定すると上書き可能となる)
             client.UploadFile(fs, "test.txt", true);
          }
 
          // SSH接続を切断
          client.Disconnect();

          // SSH接続を行う
          client.Connect();
 
          // ユーザディレクトリに移動
          client.ChangeDirectory("/home/username");
 
          // test.txtファイルを書き込み専用で開く
          using (var fs = System.IO.File.OpenWrite("test.txt"))
          {
                // test.txtファイルをダウンロード
                client.DownloadFile("test.txt", fs);
          }
 
          // SSH接続を切断
          client.Disconnect();
       }
    }
 }



指定したディレクトリ配下のファイルを全てダウンロードする

SSH.NETはディレクトリをダウンロードできないので、ディレクトリ内の全てのファイルのパスを取得して、個別にダウンロードする必要がある。
下記のサンプルコードは、/home/usernameに存在するtestディレクトリ内のファイルを1つずつダウンロードするプログラムである。

 client.Connect();
 
 var files = client.ListDirectory("/home/username/test").Where(x => x.Name != "." && x.Name != "..");
 foreach (var file in files)
 {
    using (var fs = System.IO.File.OpenWrite(file.Name))
    {
       client.DownloadFile(file.FullName, fs);
    }
 }
 
 client.Disconnect();