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

ganymed-ssh-2使いにくい!

制作中のテキストエディタは、先日FTPSは実装してあったんだが、SFTPの実装をやった。

のだが、予定していたganymed-ssh-2がすごく使いにくい!

接続に関しては、ログイン方法が何通りかあるが、
ssh=new Connection(host);
ssh.connect();
ってな感じで接続して、
パスワードログインなら、
ssh.authenticateWithPassword(user,pass);
こんな感じで、
公開鍵認証なら、
ssh.authenticateWithPublicKey(user,privatekey,null);
ってな感じ。
privatekeyはFileを渡す方法もあるが、変数で直接渡す場合はchar[]型で渡す。3番目の引数は、鍵が暗号化されている場合の復号パス。

接続とログインはそんな感じで難しくないんだが、
まずcd相当のメソッドがSFTPClient(SFTPv3Client)に用意されてない。
SFTPClientにcdがなくてもコマンドを送る方法はあると思うが、それもめんどそう・・・

cdはなくても、必要なリクエスト送る際にフルパス渡しちゃえばまあ問題ないんだが、
getとput相当のメソッドが、
Apache CommonsはInputStreamとOutputStreamを取得して読み書きする仕様だが、
ganymed-ssh-2は、読み込みなら、
SFTPv3FileHandle fh=sftp.openFileRO(path);
書き込みなら、
SFTPv3FileHandle h=sftp.createFile(
path);
って感じでファイルハンドルを取得して、(openFileRWもあるが、ファイルが存在しない時は例外になる模様。createFileなら存在しても平気
sftp.read()とsftp.write()で読み書きするんだが、
readもwriteもbyte[]を渡して読み書きする仕様になってる。
しかも、一度に32768byteしか処理できないのでループ処理する必要がある。
sftp.write()は一度に最大32768byteだが、ループ処理の最後にbyte[]の長さ超える際に、ピッタリ合わせないとダメみたい。

SFTPだけのアプリならそこに処理書いちゃえばいいが、ローカルファイルやFTPにも対応させて文字コードや改行コードの処理も含めて処理を共通化してるが、
byte[]にしなきゃいけないんで、
get処理はsftp.read()で取得できるbyte[]をStringBufferに格納してStringBufferInputStreamにして共通処理へ。
put処理はByteArrayOutputStreamに対して共通処理で書き込んでからbyte[]に変換してsftp.write()で実際に書き込み。
ってな感じで効率悪そうなコードになっちゃった。

そこらの仕様気に入らなかったんで、
ganymed-ssh-2じゃなくてjschを使ってみようかと思ったんだが、
jschは配布ファイルに必要物が含まれていないようで、「create lib-project」してビルドできなかった。
jschはバイナリファイルも配信されてるから自ビルドしないで使うこともできるが、
接続方法からして難解で良くわからんかったので
結局ganymed-ssh-2で実装した。
jschのSFTP系メソッドはcdも実装されてるし、getもputもInputStreamとOutputStream取得できそうな感じではあった。



制作物の方は、かなり時間かかったが、機能的にはほぼ完成な感じ。
当初はHTML編集特化の編集モードを搭載させるつもりだったが、メインはPCで編集して、
モバイルでちょっといじりたい時用で考えてるんで、テキストを編集可能な機能があれば十分と判断したので、実装しないことにした。
自分でも、PCでもHTML専用エディタとか使ったこと無いしね。
画面回転時の復元処理なんかがまだだな。
今週末には配信開始したい。