如何使用 Java ssh JSch 和 jcabi-ssh 在 scp 中传递密码
How to pass in the password in scp using Java ssh JSch and jcabi-ssh
我需要执行以下命令:
scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut
在 ubuntu (16.04) 终端中此命令正常工作。
yatsuk@192.168.1.1 是本地主机。
所以我使用 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();
两个return我:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
lost connection
像 "echo 1 > 1.txt" 这样的简单命令可以完美运行。
也许我不明白?
自动执行交互式命令是糟糕设计的标志。无论如何...
scp
只会在交互式 session/terminal 中提示您输入密码。出于安全原因,它不会从普通标准输入中读取密码。
因此您必须启用交互式 session/terminal。
在 JSch 中,您可以调用 .setPty
:
channel.setPty(true);
channel.connect();
类似问题:Use JSch sudo example and Channel.setPty for running sudo command on remote host.
另一种方法是使用 expect
或 sshpass
工具:How to pass password to scp?
问题是 scp
正在您的 ~/.ssh
中查找密码,但在那里找不到。您应该再次提供给 scp
。像这样:How to pass password to scp?
我需要执行以下命令:
scp -r ~/dataIn yatsuk@192.168.1.1:~/dataOut
在 ubuntu (16.04) 终端中此命令正常工作。 yatsuk@192.168.1.1 是本地主机。
所以我使用 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();
两个return我:
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,password).
lost connection
像 "echo 1 > 1.txt" 这样的简单命令可以完美运行。 也许我不明白?
自动执行交互式命令是糟糕设计的标志。无论如何...
scp
只会在交互式 session/terminal 中提示您输入密码。出于安全原因,它不会从普通标准输入中读取密码。
因此您必须启用交互式 session/terminal。
在 JSch 中,您可以调用 .setPty
:
channel.setPty(true);
channel.connect();
类似问题:Use JSch sudo example and Channel.setPty for running sudo command on remote host.
另一种方法是使用 expect
或 sshpass
工具:How to pass password to scp?
问题是 scp
正在您的 ~/.ssh
中查找密码,但在那里找不到。您应该再次提供给 scp
。像这样:How to pass password to scp?