Как передать пароль в scp с помощью Java SSH JSch и JCABI-SSH

Мне нужно выполнить следующую команду:

scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut

В терминале ubuntu (16.04) эта команда работает правильно. yatsuk@192.168.1.1 - это localhost.

Поэтому я пытаюсь этот код с помощью jcabi:

Shell shell = new SSHByPassword("192.168.1.1", 22, "yatsuk", "passw");
String stdout = new Shell.Plain(shell).exec("scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut");
System.out.println(stdout);

И этот код от JSch:

JSch jsch = new JSch();
JSch.setConfig("StrictHostKeyChecking", "no");
Session session = jsch.getSession("yatsuk", 192.168.1.1, 22);
session.setPassword("passw");
session.connect();

Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut");
((ChannelExec) channel).setErrStream(System.err);
channel.setOutputStream(System.out);
channel.setInputStream(System.in);
channel.connect();

while (!channel.isClosed()) {
    Thread.sleep(1000);
}
channel.disconnect();
session.disconnect();

Оба возвращают меня:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
lost connection

Простые команды типа "echo 1 > 1.txt" работают отлично. Может я чего-то не понимаю?

2 ответа

Решение

scp попросит вас ввести пароль только в интерактивном сеансе / терминале. По соображениям безопасности он не будет читать пароль с простого стандартного ввода.

Таким образом, вы должны включить интерактивный сеанс / терминал.

В JSch вы делаете это, вызывая .setPty:

channel.setPty(true);
channel.connect();

Аналогичный вопрос: используйте пример sudo JSch и Channel.setPty для запуска команды sudo на удаленном хосте.


Другой подход использует expect или же sshpass инструменты: как передать пароль на scp?

Проблема в том, что scp ищет пароль в вашем ~/.ssh и не могу найти его там. Вы должны предоставить это снова scp, Примерно так: как передать пароль на scp?

Другие вопросы по тегам