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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「C Sharpの応用 - SFTP」を「C Sharpとネットワーク - SFTP」に、リダイレクトを残さずに移動しました)
(文字列「<source lang」を「<syntaxhighlight lang」に置換)
20行目: 20行目:


== サンプルコード ==
== サンプルコード ==
  <source lang="c#">
  <syntaxhighlight lang="c#">
  using System;
  using System;
  using System.IO;
  using System.IO;
84行目: 84行目:
下記のサンプルコードは、/home/usernameに存在するtestディレクトリ内のファイルを1つずつダウンロードするプログラムである。<br>
下記のサンプルコードは、/home/usernameに存在するtestディレクトリ内のファイルを1つずつダウンロードするプログラムである。<br>
<br>
<br>
  <source lang="c#">
  <syntaxhighlight lang="c#">
  client.Connect();
  client.Connect();
   
   

2021年11月15日 (月) 00:32時点における版

概要

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

処理の流れ

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

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

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

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

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

サンプルコード

<syntaxhighlight lang="c#">
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();
      }
   }
}
</source>



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

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

<syntaxhighlight lang="c#">
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();
</source>