Java を使用して rsync をラップしようとしていますが、対話型ログインの処理に苦労しています。UNIX コマンド ライン ユーティリティexpect
を動作させることはできますが、同等の Java を理解できないようですExpectJ
。これが私の現在のコードです:
import java.io.IOException;
import expectj.ExpectJ;
import expectj.Spawn;
public class ExpectjTest {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String mypassword= "example";
String cmd = "rsync -e ssh --list-only --recursive user@host:~/\n";
ExpectJ expectinator = new ExpectJ();
Spawn rsync = expectinator.spawn("/bin/bash");
try {
rsync.send(cmd);
rsync.expect("password:",2);
rsync.send(mypassword+"\n");
rsync.expectClose();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
これを実行すると、次のエラーが表示されます。
ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
Permission denied (gssapi-keyex,gssapi-with-mic,publickey,keyboard-interactive).
Java から rsync を呼び出しているため、通常の ssh インタラクティブ ログインが開始されていないようです。を使用する類似のシェルスクリプトexpect
は問題なく動作します。また、公開鍵認証を使用すると、同様の Java コードが機能するようです。だけを使用したい場合はssh
、JSch などのライブラリを使用しますが、java rsync ライブラリはどれもあまり信頼していないため、コマンド ライン ツールをラップしたいと考えています。
ご協力いただきありがとうございます!