Как выполнить scp между 2 удаленными Unix-боксами, используя Jsch? - PullRequest
0 голосов
/ 03 октября 2011

Я пишу код Java с использованием Jsch, в котором мне нужно выполнить scp между двумя удаленными блоками UNIX.

Я попытался выполнить команду scp так же, как и обычную команду из моего кода Java, например:

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 без пароля и пытается трижды (флаг NumberoOFAttempts) и выдает сообщения об ошибках ...

Я хочу знать, как сделать так, чтобы scp по крайней мере подсказывал ввести что-то вместо того, чтобы просто не брать пароль... Я использовал реализацию по умолчанию класса MyUserInfo, приведенную в примерах jsch для моего кода ...

Или

Есть ли способ предоставить пароль вместе с командой scp ??Я стараюсь по возможности избегать использования комбинаций закрытых и открытых ключей ..

РЕДАКТИРОВАТЬ: Из поста Пауло .. Теперь я добавил channel.setPty (true), чтобы получить псевдо-терминал для команды, и этопросит у меня ввести пароль, а не автоматически.

Как мне указать пароль сейчас ... Я попытался набрать его в консоли, но он не принимает и продолжает ждать ввода пользователя ...Я попытался установить его с помощью channel.setInputStream (pwdbytes);но он продолжает ждать команды и не принимает ввод ..

Спасибо за любую помощь относительно этого ...

1 Ответ

3 голосов
/ 03 октября 2011

Команда scp в вашем первом окне Unix пытается прочитать пароль с консоли / терминала. Но это будет работать только при наличии терминала, связанного с процессом, и по умолчанию это не так.

Самый простой способ решить эту проблему - использовать channel.setPty(true) перед подключением канала и затем предоставить пароль через потоки ввода / вывода.

...