2015-06-30 124 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不保證該文件系統在遠端支撐這些,但它確實承認這樣的文件系統存在,這就是爲什麼它提出了一個專門的命令來顯式設置遠程端的權限。