如何将文件从Windows服务器路径复制/传输到linux服务器路径?

时间:2017-06-28 10:11:13

标签: java linux smb

我尝试过以下代码:

String url = "smb://remotehost/SharedPath/Comp/NG/";
NtlmPasswordAuthentication auth2 = new 
NtlmPasswordAuthentication(null,"user", "password");
SmbFile dir = new SmbFile(url, auth);
for (SmbFile f : dir.listFiles())
{
  if(f.getName().contains("Test")) //successfully reads the file
  {
    System.out.println("test...."+f);
    filename= f.getUncPath();
    System.out.println("filename...."+filename);
    sftpChannel.put(filename, remoteDirectory); // throws exception
  }  
}

以上代码导致异常如下: java.io.FileNotFoundException: \\remotehost\SharedPath\comp\NG\Test.txt (Logon failure: unknown user name or bad password)

请注意:

  • 我可以使用上面的代码读取远程服务器中存在的文件,但无法将文件从远程服务器路径复制或传输到Linux服务器路径。

  • 由于与远程服务器和linux服务器的连接成功,我尝试使用sftpchannel.put()将文件从远程路径直接复制到linux服务器路径,但它会引发异常。

  • 使用smb连接后,我们是否无法使用以下网址直接连接到共享路径? String url = "//remotehost/SharedPath/Comp/NG/";

请注意:我使用jsch库连接到Linux服务器,并且我能够使用sf​​tpChannel.connect()成功连接到Linux服务器;并且还能够使用sf​​tpChannel.put(localpath,linuxpath)将文件从本地计算机放到Linux服务器上;并连接到Windows服务器我正在使用smbFile。我能够连接但无法将文件从Windows复制到Linux服务器路径。我尝试使用sftpChannel.put(filename,remoteDirectory);同样但它导致例外。在这个特定的步骤中,我假设由于与Windows服务器的连接成功,我也可以复制文件。我能够读取文件但不能复制。不知道为什么会这样。

有人能为我提供正确的步骤吗?

1 个答案:

答案 0 :(得分:1)

我猜sftpChannel的类型是com.jcraft.jsch.ChannelSftp。然后,以下方法将为您执行复制。当然,您必须将正确初始化的SmbFileChannelSftp对象作为参数传递。

public void copyFromSmbToSftp(SmbFile smbFile, ChannelSftp channelSftp, String destPath) throws IOException, SftpException {
    try(BufferedInputStream inputStream = new BufferedInputStream(smbFile.getInputStream());
        BufferedOutputStream outputStream = new BufferedOutputStream(channelSftp.put(destPath))){
      byte[] buffer = new byte[64*1024];
      int bytesRead;
      while((bytesRead=inputStream.read(buffer, 0, buffer.length))!=-1){
        outputStream.write(buffer, 0, bytesRead);
      }
    }
  }