2015-06-30 119 views
7

我使用jscape sftp传输文件JSCAPE SFTP上传保存文件权限

com.jscape.inet.sftp.Sftp 

Sftp sftpSession = null; 

// after the required step to connect 
// through SshParameters 

sftpSession.setDir(remotedirectory); 
sftpSession.upload(localFile, remoteFile); 

现在,这个代码传输文件,这部分确定。但是文件权限在远程机器中得到了改变(它变成了644)。

in local machine:  
-rw-rw-r-- 1 oracle dba 356 Jun 30 03:33 file1.test 
-rwxrw-r-x 1 oracle dba 462 Jun 30 03:35 file2.test 

in remote machine: 
-rw-r--r-- 1 oracle dba 356 Jun 30 03:49 file1.test 
-rw-r--r-- 1 oracle dba 462 Jun 30 03:49 file2.test 

我看到下面的方法来改变远程文件的权限,

com.jscape.inet.sftp.Sftp.setFilePermissions(java.lang.String remoteFile, int permissions)

我的问题是,

  • 做的com.jscape.inet.sftp.Sftp.upload方法仅适用这种方式,上传文件没有保留权限?
  • 有没有什么方法可以保留权限,而不明确使用setFilePermissions方法?

回答

4

远程用户和组是否具有与本地相同的权限? 您可以尝试使用getPermissions()方法获取本地权限并将其设置为远程文件。

1

使用Java 7+你可以做到这一点;下面的代码当然假设了一个类似于你的设置,它在两端都符合POSIX兼容的文件系统。

诀窍是获得一组文件的POSIX文件权限;

// "fileToCopy" here is a Path; see Paths.get() 
Files.getPosixFilePermissions(fileToCopy) 

这将返回一个Set<PosixFilePermissions>,这实际上是一个枚举:这是使用完成。将所述枚举为整数,使用下面的技巧来完成:

private static int toIntPermissions(final Set<PosixFilePermission> perms) 
{ 
    int ret = 0; 
    for (final PosixFilePermission perm: PosixFilePermission.values()) { 
     if (perms.contains(perm)) 
      ret++; // add 1 
     ret <<= 1; // shift by 1 
    } 
    return ret; 
} 

至于直接保存在拷贝的权限,这是不可能在单个命令:SSH不保证该文件系统在远端支撑这些,但它确实承认这样的文件系统存在,这就是为什么它提出了一个专门的命令来显式设置远程端的权限。