0

我正在使用 Jsch 编写 Java 代码,其中我需要在 2 个远程 UNIX 框之间执行 scp。

我尝试以与从我的 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 并尝试三次(NumberoOFAttempts 标志)并给出错误消息......

我想知道如何让 scp 至少提示输入某些内容,而不是不输入密码……我已将 jsch 示例中给出的 MyUserInfo 类的默认实现用于我的代码……

或者

有什么方法可以提供密码以及 scp 命令?我试图尽可能避免使用私钥/公钥组合..

编辑:来自 Paulo 的帖子.. 现在我添加了 channel.setPty(true) 来获取命令的伪终端,它要求我输入密码而不是自动失败..

我现在应该如何指定密码...我尝试在控制台中输入它,但它不接受并继续等待用户输入...我尝试使用 channel.setInputStream(pwdbytes); 设置它 但它一直在等待命令而不接受输入..

感谢您对此的任何帮助...

4

1 回答 1

3

scp一个 Unix 机器上的命令尝试从控制台/终端读取密码。但这仅在有与进程关联的终端时才有效 - 默认情况下不是。

解决这个问题的最简单方法是channel.setPty(true)在连接通道之前使用,然后通过输入/输出流提供密码。

于 2011-10-03T17:28:32.783 回答