簡體   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