如何在Java中将文件从远程主机传递到另一个远程主机?

时间:2018-11-20 16:19:55

标签: java linux unix

我一直在研究使用JSCH进行scp并将文件传输到同一服务器中另一个目录的应用程序。但是,我希望能够以自动方式将文件从一个远程主机传输到另一台远程主机。以下是我用来拨打电话的代码。我尝试使用其他的scp命令,例如:scp [options] username1@source_host:directory1/filename1 username2@destination_host:directory2/filename2。在服务器上对其进行测试时,它可以工作,但是当我尝试将其合并到下面的代码中时,它会传回错误。

代码:

 public static void main(String[] args){

    String array [] = {"robert.txt","ops1axv@gaalpltclu00029.linux.us.ams1907.com:/tmp"};

    if(array.length!=2){
      System.err.println("usage: java ScpTo file1 user@remotehost:file2");
      System.exit(-1);
    }      

    FileInputStream fis=null;
    try{

      String lfile=array[0];
      String user=array[1].substring(0, array[1].indexOf('@'));
      array[1]=array[1].substring(array[1].indexOf('@')+1);
      String host=array[1].substring(0, array[1].indexOf(':'));
      String rfile=array[1].substring(array[1].indexOf(':')+1);

      System.out.println("RFile: " + rfile );
      System.out.println("Lfile: " + lfile);

      JSch jsch=new JSch();
      Session session=jsch.getSession(user, host, 22);

      // username and password will be given via UserInfo interface.
      UserInfo ui=new MyUserInfo();
      session.setUserInfo(ui);
      session.connect();

      boolean ptimestamp = true;

      // exec 'scp -t rfile' remotely
      String command="scp " + (ptimestamp ? "-p" :"") +" -t "+rfile;
      Channel channel=session.openChannel("exec");
      ((ChannelExec)channel).setCommand(command);

      // get I/O streams for remote scp
      OutputStream out=channel.getOutputStream();
      InputStream in=channel.getInputStream();

      channel.connect();

      if(checkAck(in)!=0){
    System.exit(0);
      }

      File _lfile = new File(lfile);

      if(ptimestamp){
        command="T"+(_lfile.lastModified()/1000)+" 0";
        // The access time should be sent here,
        // but it is not accessible with JavaAPI ;-<
        command+=(" "+(_lfile.lastModified()/1000)+" 0\n"); 
        out.write(command.getBytes()); out.flush();
        if(checkAck(in)!=0){
      System.exit(0);
        }
      }

      // send "C0644 filesize filename", where filename should not include '/'
      long filesize=_lfile.length();
      command="C0644 "+filesize+" ";
      if(lfile.lastIndexOf('/')>0){
        command+=lfile.substring(lfile.lastIndexOf('/')+1);
      }
      else{
        command+=lfile;
      }
      command+="\n";
      out.write(command.getBytes()); out.flush();
      if(checkAck(in)!=0){
    System.exit(0);
      }

      // send a content of lfile
      fis=new FileInputStream(lfile);
      byte[] buf=new byte[1024];
      while(true){
        int len=fis.read(buf, 0, buf.length);
    if(len<=0) break;
        out.write(buf, 0, len); //out.flush();
      }
      fis.close();
      fis=null;
      // send '\0'
      buf[0]=0; out.write(buf, 0, 1); out.flush();
      if(checkAck(in)!=0){
    System.exit(0);
      }
      out.close();

      channel.disconnect();
      session.disconnect();

      System.exit(0);
    }
    catch(Exception e){
      System.out.println(e);
      try{if(fis!=null)fis.close();}catch(Exception ee){}
    }
  }

0 个答案:

没有答案