java - 使用 Jsch 在远程服务器之间传输文件

标签 java ssh jsch

我有一个要求,其中我需要登录到unix服务器,执行切换用户,执行一些命令,然后将这些命令创建的文件scp到不同的服务器。 我可以连接到服务器、执行 sudo 登录并执行命令,但无法将 scp 文件直接发送到另一台远程服务器。

我为此使用 Jsch jar。下面是我的代码。

public voidexecuteChannel(Session session, String command, String pwd, List file) 抛出异常{

    logger.info("************************Start of executeChannel() method*****************************");
    Channel channel = session.openChannel("exec");

    // below line avoids "sudo: no tty present and no askpass program" error

    ((ChannelExec) channel).setPty(true);

    // this line ensures password prompt is not displayed after sudo user
    /**
    * -S  The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.
    * -p  The -p (prompt) option allows you to override the default password prompt and use a custom one.
    */

    String filename = file.toString().replace("[", "").replace("]", "").replace(",", "");   
    System.out.println("sudo -S -p '' "+command+" "+filename+" server2:/dir1/dir2/dir3/");

    ((ChannelExec)channel).setCommand("sudo -S -p '' "+command+" "+filename+" server2:/dir1/dir2/dir3/");

    channel.setInputStream(null);            
    ((ChannelExec)channel).setErrStream(System.err);

    InputStream in = channel.getInputStream();
    OutputStream out=channel.getOutputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    channel.connect();
    out.write((pwd+"\n").getBytes());


    byte[] tmp=new byte[1024];
    while(true){
        logger.info("start of while(true) method, is channel connected? "+channel.isConnected());

        br.readLine();
        while(br.readLine() != null){
            System.out.println("channel.isConnected() "+channel.isConnected());
            int i = in.read(tmp, 0, 1024);

            if(i<0) break;

            System.out.println("printing putty console: \n"+new String(tmp,0,i));
        }
        if (channel.isClosed()){
            System.out.println("Exit Status:- "+channel.getExitStatus());
            break;
        }

        try{
            Thread.sleep(1000);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
    out.flush();
    br.close();
    System.out.println("DONE");

}

命令= sudo su -pentaho; cd/dir1/dir2/; ls-lrt; SCP 在执行上面的代码时,直到 ls -lrt 的命令都正确执行,我可以看到输出。然而在此之后代码挂起。 代码没有抛出异常,因此我不知道发生了什么。

任何帮助将不胜感激。

最佳答案

事实证明我没有正确打印腻子控制台的输出。我想通了这个问题。解决方案是更改命令。

从命令中删除 sudo -S -p '' 并用 sudo su - user -c "my Commands"替换原始命令就可以了。

关于java - 使用 Jsch 在远程服务器之间传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38370944/

相关文章:

java - 通过GSON将json字符串转换为对象

java - 使用 Spring Security 进行密码策略验证

arrays - 带有 bash for 循环的 SSH 命令选项

java - 在 Java 中使用 JSch 列出 SFTP 服务器上目录的完整层次结构

python - 是否可以在 ubuntu vps 服务器上运行 pygame?

java - 通过 JSch 在 SFTP 服务器上创建目录时出现 NoSuchAlgorithmException

java - RecyclerView 中的 Android Spinner 选中时获取当前 View

java - java对象转json

java - 即使 java 代码终止,JSch 也会继续执行该命令吗?

tomcat - Windows 和 Tomcat 之间 GXT 中的 SFTP