【问题标题】:jscape sftp upload preserving file permissionjscape sftp 上传保留文件权限
【发布时间】:2015-09-17 04:16:18
【问题描述】:

我正在使用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 方法?

【问题讨论】:

    标签: java upload ftp sftp


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用 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 不保证远程端的文件系统支持这些,但它确实承认存在这样的文件系统,这就是为什么它提出一个明确设置远程端权限的专用命令。

      【讨论】:

        猜你喜欢
        • 2013-09-26
        • 1970-01-01
        • 2016-04-21
        • 2012-05-17
        • 2012-01-10
        • 2011-03-13
        • 1970-01-01
        • 2015-03-26
        相关资源
        最近更新 更多