jscape sftp上传保留文件权限

时间:2015-06-30 11:29:20

标签: java upload ftp 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);

现在,这段代码正在传输文件,那部分OK。但是远程机器中的文件权限发生了变化(它变成了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方法?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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不能保证远程端的文件系统支持那些,但它确实承认存在这样的文件系统,这就是为什么它提出了专门用于显式设置远程端权限的命令。