我需要执行以下命令:
scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut
在Ubuntu(16.04)终端中,该命令可以正常工作。yatsuk@192.168.1.1 is 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();
Both return me:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
lost connection
简单的命令,如echo 1 > 1.txt
工作完美。也许是我不明白的事?
自动执行交互式命令是糟糕设计的标志。无论如何…
scp
仅在交互式会话/终端中提示您输入密码。出于安全原因,它不会从普通的标准输入中读取密码。
所以你必须启用一个交互式会话/终端。
在JSch中,您可以通过调用.setPty
:
channel.setPty(true);
channel.connect();
类似问题:使用JSch sudo示例和Channel。setPty用于在远程主机上运行sudo命令。
另一种方法是使用expect
或sshpass
工具:如何将密码传递给scp?
问题是scp
正在寻找您的~/.ssh
密码,无法在那里找到它。您应该再次提供给scp
。例如:如何将密码传递给scp?