0

2 つのリモート UNIX ボックス間で scp を実行する必要がある Jsch を使用して Java コードを作成しています。

次のようなJavaコードから通常のコマンドを実行するのと同じ方法でscpコマンドを実行しようとしました:

JSch jsch=new JSch();
Session session=jsch.getSession("user", "host", 22);
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.setPassword("pwd");
session.connect();
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand("scp user@mademo.org:/home/user/demo.csv /home/user/demo.csv");
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
//Printing operations
channel.disconnect();
session.disconnect();

期待どおりに user@mademo.org のパスワードを要求する代わりに。エラーのみが表示されます:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
exit-status: 1

UNIXボックスでコマンドを直接実行すると、次のことがわかりました。

scp は、リモート マシンに接続するためのパスワードを要求します。ただし、このコードを使用すると、パスワードの入力を求められません。そのため、パスワードなしで scp を実行しようとしており、3 回試行し (NumberoOFAttempts フラグ)、エラー メッセージが表示されます...

パスワードを取得しないだけでなく、少なくとも何かを入力するようにscpプロンプトを表示する方法を知りたい...コードのjschの例で指定されたMyUserInfoクラスのデフォルトの実装を使用しました...

または

scp コマンドと一緒にパスワードを提供する方法はありますか?? 秘密鍵と公開鍵の組み合わせをできるだけ使用しないようにしています..

編集:パウロの投稿から..今、コマンドの疑似端末を取得するためにchannel.setPty(true)を追加しました。自動的に失敗するよりもパスワードを入力するように求められています..

今すぐパスワードを指定するにはどうすればよいですか...コンソールに入力しようとしましたが、受け入れられず、ユーザー入力を待ち続けます.... channel.setInputStream(pwdbytes);を使用して設定しようとしました。しかし、それはコマンドで待機し続け、入力を取りません..

これに関して何か助けてくれてありがとう...

4

1 に答える 1

3

最初のUnixボックスのscpコマンドは、コンソール/ターミナルからパスワードを読み取ろうとします。ただし、これはプロセスに関連付けられた端末がある場合にのみ機能します。デフォルトでは機能しません。

The easiest way to solve this would be to use channel.setPty(true) before connecting the channel, and then provide the password via the input/output streams.

于 2011-10-03T17:28:32.783 に答える