Month of 5月, 2011

PhotorecでSDカードの復元。助かった!

まさか、使う日が来るとは。奥さんがやってしまいました、SDカードの初期化。最近のは容量があるのでなかなかマックに取り込まず撮りっぱなしで子どもの入学式の写真とかが逝っちゃいました。で、PhotoRecの出番。いまどきににはめずらしくCUIです。

なのでまず、SDカードをマウントして、ターミナルからphotorecを起動。ブートディスクは表示されないようで(sudo すれば対象にできるみたいです。)僕の環境ではSDカードのみが表示されてますので選択してリターン

photorec 01

.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なんてのを目にしなくても良いです。

.netでSFTPをしてみる

in

FTP/SSLか、SFTPの実装が必要になりそうなので準備。C#でやろうと思っているので、FTP/SSLのほうは.net標準のFtpWebRequestにまかせてSFTPのほうをググってみたら

この2つが見つかりました。サンプルをザッとながめてみたらSharpSSHがのほうが簡単そうだったのでとりあえずサンプルコードを書いてみました。

private void runUpload()
{
  Tamir.SharpSsh.jsch.JSch jsch = new Tamir.SharpSsh.jsch.JSch();
  Tamir.SharpSsh.jsch.Session session = jsch.getSession("foo", "example.com", 22);
  UserInfo uinfo = new MyUserInfo();
  session.setUserInfo(uinfo);
  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("xyz.txt");
  c.cd("temp/data");     
  c.put(source, "abc.txt");
  c.exit();
  session.disconnect();
}

public class MyUserInfo : UserInfo
{
  public String getPassphrase() { return null; }
  public String getPassword() { return "foovar"; }
  public bool promptPassword(String message) { return true; }
  public bool promptPassphrase(String message) { return true; }
  public bool promptYesNo(String message) { return true; }
  public void showMessage(String message) 
  { 
     MessageBox.Show
       (message, "SSH", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
  }
}

これ、Javaで実装されたjschのAPIを利用していてそこここにJavaの名前が見えるところが面白いっちゅうか世界は広い。暗号化関連はMentalis.org Crypto Libraryを使ってます。

サンプルではMyUserInfoのところをUI実装してごにょごにょしていましたが、僕の場合はそこらへんは不要なのでそのまま値を返すように変更。とりあえずテストはできたのでこれで検討してみます。後はパスワードじゃなくて鍵を使う場合のほうも調べなきゃいけないし、週明けもう少し詳しく調べてみる予定。