繁体   English   中英

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

[英]File transfer between remote servers using Jsch

我有一个要求,我需要登录到unix服务器,执行切换用户,执行一些命令,然后将从这些命令创建的文件scp到不同的服务器。 我能够连接到服务器,执行sudo登录和执行命令但是我无法将文件直接scp到另一个远程服务器。

我正在使用Jsch jar。 以下是我的代码。

public void executeChannel(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");

}

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

任何帮助将受到高度赞赏。

结果我没有正确打印putty控制台的输出。 我想出了这个问题。 解决方案是更改命令。

从命令中删除sudo -S -p'并用sudo su替换原始命令 - 用户-c“我的命令”就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM