繁体   English   中英

在Windows机器上使用Java Code将本地文件复制到Unix Server?

[英]Copy local file to Unix Server using java Code on windows machine?

如何创建将文件复制到Unix服务器的Java脚本? 我需要使流程自动化,因为我的应用程序需要使用文件将文件自动复制到服务器。

这是使用JSch外部Java库的正确方法。

  import com.jcraft.jsch.*;
  import java.io.*;

    public class ScpTo{
    public static void main(String[] arg){
      FileInputStream fis=null;
       try{
       String lfile="file.txt";
        String user="username";
        String host="host";
     String rfile="file1.txt";

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

     java.util.Properties config = new java.util.Properties(); 
     config.put("StrictHostKeyChecking", "no");
     session.setPassword("******");
      session.setConfig(config);
       session.connect();

  boolean ptimestamp = false;
  // 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();
  System.out.print("Transfer done.");

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

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

static int checkAck(InputStream in) throws IOException{
int b=in.read();
// b may be 0 for success,
//          1 for error,
//          2 for fatal error,
//          -1
if(b==0) return b;
if(b==-1) return b;

if(b==1 || b==2){
  StringBuffer sb=new StringBuffer();
  int c;
  do {
c=in.read();
sb.append((char)c);
  }
  while(c!='\n');
  if(b==1){ // error
System.out.print(sb.toString());
  }
  if(b==2){ // fatal error
System.out.print(sb.toString());
  }
}
return b;
 }
}

您可以从PuTTY下载pscp。 将pscp.exe添加到您的路径。 然后,您可以运行以下内容

Runtime.getRuntime().exec("pscp.exe C:\Users\usr\Downloads>pscp -r -P 22 "directory123" root@192.168.2.1:/tmp");

说明

PSCP是命令行应用程序。 这意味着您不能只双击它的图标来运行它,而是必须打开一个控制台窗口。 在Windows 95、98和ME中,这称为“ MS-DOS提示符”,在Windows NT,2000和XP中则称为“命令提示符”。 它应该可以从“开始”菜单的“程序”部分获得。

要启动PSCP,它将需要位于您的PATH或当前目录中。 要将包含PSCP的目录添加到PATH环境变量中,请在控制台窗口中输入:

set PATH=C:\path\to\putty\directory;%PATH%

这样做之后,您现在可以通过键入pscp.exe从Java应用程序以及命令提示符/外壳程序中的任何位置访问它。 换句话说,如果在将pscp目录设置为路径位置之后,可以在任何目录中时打开命令提示符并调用pscp.exe程序。 我发布的代码几乎只是在Java程序中运行Shell命令的一种方式。

pscp.exe C:\Users\usr\Downloads>pscp -r -P 22 "directory123" root@192.168.2.1:/tmp

是命令提示符/ shell命令,并且

Runtime.getRuntime().exec("....");

是在Java中运行Shell命令的方式。 您将需要在命令中相应地更改目录

暂无
暂无

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

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