.netでSFTPをしてみる 2

in

案件ではパスワードを使わず鍵だけでログインする仕様になりそうなので引き続き調べたところ、addIdentity()で鍵ファイル指定を追加してやるだけであっさりできました。(StrictHostKeyCheckingの設定はC# - SSH / SFTP connection issue using Tamir.SharpSshを参考にしました。)

private void sftp_pubkey_j
  (string host, string user, string identify,string passphrase,Int32 port)
{
  Tamir.SharpSsh.jsch.JSch jsch = 
    new Tamir.SharpSsh.jsch.JSch();
  jsch.addIdentity(identify,passphrase);

  System.Collections.Hashtable hashConfig = 
    new System.Collections.Hashtable();
  hashConfig.Add("StrictHostKeyChecking", "no");

  Tamir.SharpSsh.jsch.Session session = jsch.getSession(user, host, port);
  session.setConfig(hashConfig);
  session.connect();

  Channel channel = session.openChannel("sftp");
  channel.connect();

  ChannelSftp c = (ChannelSftp)channel;
  Tamir.SharpSsh.java.io.FileInputStream source = 
    new Tamir.SharpSsh.java.io.FileInputStream("a.txt");

  c.cd("temp");
  c.put(source, "a.txt");

  c.exit();
  session.disconnect();
}

ラッパークラスを使えばもう少しスッキリしたコードになるし、JavaXXXなんてのを目にしなくても良いです。

private void ssftp_pubkey
  (string host, string user, string identify,string passphrase,Int32 port)
{
  SshTransferProtocolBase sftp = new Sftp(host, user);

  sftp.AddIdentityFile(identify, passphrase);
  sftp.OnTransferEnd += new FileTransferEvent(OnTransferEnd);
  sftp.Connect(port);
  sftp.Put("a.txt", "temp/b.txt");
  sftp.Close();
}

SftpクラスではGet/Put/Mkdir/GetFileListの基本的なコマンドしか用意されていませんが通常これで十分でしょう。StrictHostKeyCheckingオプションの設定する箇所は見当たりませんが、あらかじめ設定しているのか何もしなくてもすんなりコネクトできました。また、転送の開始・転送・終了時のイベントが追加できるところがミソかな。ここまで準備しとけば大丈夫な気がしてきました。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/393

Comments