使用Jsch的scp复制文件要求输入密码

时间:2019-04-03 16:48:59

标签: java scp jsch

我正在尝试将文件从一台远程服务器复制到另一台远程服务器。我尝试使用scp。它通过腻子而不是通过代码复制文件。我目前正在使用echo复制文件。通过echo,我正在将字符串finalStr写入abc.bcc,它的工作正常。但是在Jsch中使用下面的命令时,它不起作用。

scp /home/abc.bcc user@host:/folder1/folder2/abc.bcc

我尝试添加ssh公共私钥,但是没有运气。我尝试使用channel.setPty(true)来避免提示密码,并通过bufferedWriter设置密码。但是仍然无法复制文件。请提出需要更改的内容。

JSch jsch = new JSch();
Session session;
try {
    session = jsch.getSession("user", "host", 22);
    session.setPassword("password");
    session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config);
    session.connect();
    logger.info("Connection status: " + session.isConnected());
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(
            "echo \"" + finalStr + "\" >> /folder1/folder2/abc.bcc");
    ((ChannelExec) channel).setPty(false);
    channel.setInputStream(null);
    ((ChannelExec) channel).setErrStream(System.err);
    InputStream in = channel.getInputStream();
    OutputStream out = channel.getOutputStream();
    channel.connect();
    logger.info("Channel status : " + channel.isConnected());
    out.write("\n".getBytes());
    out.flush();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String line;
    int index = 0;
    while ((line = br.readLine()) != null) {
        logger.info(++index + " : " + line);
    }
    channel.disconnect();
    session.disconnect();
}catch(....

调试输出:

debug1: Trying private key: /home/build_path/.ssh/id1 
debug3: no such identity: /home/build_path/.ssh/id1: No such file or directory 
debug1: Trying private key: /home/build_path/.ssh/id2 
debug3: no such identity: /home/build_path/.ssh/id2: No such file or directory 
debug1: Trying private key: /home/build_path/.ssh/id3 
debug3: no such identity: /home/build_path/.ssh/id_3: No such file or directory

1 个答案:

答案 0 :(得分:0)

日志看起来好像用户主目录设置不正确!因此找不到密钥文件!

一般方法:

  1. 让ssh无需代码即可工作。
  2. 要从一个远程复制到另一远程,需要在两个远程上彼此解析主机名和连接。因此,登录到一个远程,然后尝试从那里直接与另一远程建立ssh连接。这不能保证能正常工作。

我很确定一旦解决了这个问题,其他一切都会起作用。 当涉及代理时,这可能会变得相当复杂,因为代理设置必须在所有3台计算机之间正常工作。 我反复面对这些问题,可能会很混乱。