Androidのアプリ開発関連のブログ

JSch使うように修正中

SFTPの実装にganymed-ssh-2を使っていたが、接続先鯖によってはパケットサイズが異常で例外が発生しちゃって回避も無理ぽいんで、JSch使うように修正中。

JSchでうまくいきそうなんだが、
以前から判明していたが、自ビルドしようとしても配布物に何か不足がある様でビルドできない。
バイナリも配布されてるんで
バイナリ使えば問題ないが。

使い方は
ganymed-ssh-2以上に難解な感じ。

標準でホストのチェックを行うようになってるが、KnownHostsの設定はファイルパスを渡すようになってて、直接登録はできなそう。
JSch jsch=new JSch();
Hashtable config=new Hashtable();
config.put("StrictHostKeyChecking","no");
jsch.setConfig(config);
てな感じで、
JSchのインスタンスを作成した後に、
"StrictHostKeyChecking"="no" の入ったHashtableをsetConfigに渡すとチェックを回避できる。

公開鍵認証のキーは接続前にaddIdentityで登録しなければならないが、

addIdentityには引数の違うメソッドが複数あるが、ほとんどがキーファイルを渡すメソッドになっていて、
public void addIdentity(String name, byte[]prvkey, byte[]pubkey, byte[] passphrase)
のみが唯一キーを変数で渡せる。
秘密鍵の内容を
byte[]で渡せば公開鍵認証ができる。公開鍵とパスフレーズはnullでいける。
nameは適当な文字列でいいぽい。

公開鍵認証の場合は
jsch.addIdentityで鍵登録だが、
パスワード認証の場合は
Sessionを取得後ににSession.setPasswordで設定と、公開鍵認証とパスワード認証で認証のタイミングが違う。

今のところ
ganymed-ssh-2のように致命的なバグには遭遇してなく、公開鍵認証もパスワード認証もできそうだが、
ganymed-ssh-2と比べて認証までの速度が遅い感じで、数秒かかってる。

ChannelSftpにはcdコマンドがあったり、

ChannelからSessionが取得できて、Sessionを切断するとChannelも全切断してくれるようで、
接続さえしちゃえば
JSchの方が使いやすそうな感じ。
ganymed-ssh-2のSFTPv3Clientにはcdメソッドがないし、SFTPv3ClientからConnectionが取得できないので切断処理もめんどかった。