当前位置: 首页 > 知识库问答 >
问题:

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

融唯
2023-03-14

我需要登录到unix服务器,执行switch user,执行一些命令,然后将这些命令创建的文件scp到另一台服务器。我能够连接到服务器,执行sudo登录和执行命令,但我无法将文件直接scp到另一个远程服务器。

我用的是Jsch jar。下面是我的代码。

public void executeChannel(会话会话、字符串命令、字符串pwd、列表文件)引发异常{

    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-轻轨;scp在执行上面的代码,命令,直到ls-lrt被正确执行,我可以看到输出。然而,在此之后,代码挂起。代码没有引发任何异常,因此我不知道发生了什么。

任何帮助都将不胜感激。

共有1个答案

张瀚漠
2023-03-14

原来我没有正确打印putty控制台的输出。我解决了这个问题。解决办法是改变命令。

从命令中删除sudo-S-p",并用sudo su-user-c"我的命令"替换原始命令,就成功了。

 类似资料:
  • 问题内容: 我应该为“ .thrift”文件定义哪种服务,以便以后将其用于我的程序? 此文件传输应该在客户端和服务器之间,并且应该是“部分”。 StreamFileService.thrift: StreamFileClient.java: } StreamFileServer.java: } StreamFileServiceImpl: } 问题答案: 您的代码对我来说似乎还不错(未经测试),没

  • 我目前正在做一个项目,需要一个UDP通信之间的服务器亚马逊法兰克福)和几个主机(Arduino)。我需要能够发送JSON数据从服务器到主机通过UDP,它需要实时工作(时间是一个真正的限制在这里)。此外,主机将定期与服务器通话,通知服务器其状态。 我面临的问题是,虽然我可以ping服务器,但当我创建带有端口的UDP套接字时,我会得到这个错误(对于任何端口): errno99:无法分配请求的地址 我也

  • 假设您有两组服务器,第一组专用于前端,另一组专用于处理来自前端的信息。将数据从前端传输到流程服务器的最佳方式是什么; 我在少量数据上尝试了不同的技术: 谁能给我指明正确的方向吗?

  • 我正在编写一个应用程序,其中要求将文件从远程SFTP服务器传输到本地计算机,反之亦然。在文件传输过程中,我想确保没有数据包在传输过程中丢失和损坏。因此,我们的想法是在传输之前对远程文件(位于sftp服务器中)运行MD5校验和,然后启动传输过程。传输完成后,在本地文件上运行md5并比较两个校验和。 我正在使用JSCH连接到sftp服务器,代码是java。但是我不知道如何在SFTP服务器中的远程文件上

  • 我将非常感谢任何答复以及文章,在您的意见可能有助于这里。提前谢谢你。

  • 本文向大家介绍linux服务器之间传输文件的四种方式,包括了linux服务器之间传输文件的四种方式的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了linux服务器之间传输文件的四种方式,供大家参考,具体内容如下 1. scp 【优点】简单方便,安全可靠;支持限速参数  【缺点】不支持排除目录 【用法】 scp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且