2015-06-30 25 views
7

Używam jscape sftp do przesyłania plikówjscape sftp przesyłanie plików zachowując uprawnienia

com.jscape.inet.sftp.Sftp 

Sftp sftpSession = null; 

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

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

teraz, ten kod jest przesyłanie pliku, część OK. ale uprawnienia do plików są zmieniane w zdalnej maszynie (staje się 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 

widzę poniżej metoda zmienić uprawnienia pliku zdalnego,

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

Moje pytania są

  • Czy metoda com.jscape.inet.sftp.Sftp.upload działa tylko w ten sposób, wgrać plik bez zachowania uprawnień?
  • Czy istnieje sposób na zachowanie zezwolenia, bez stosowania metody setFilePermissions jawnie?

Odpowiedz

4

Czy użytkownik i grupa na pilocie mają takie same uprawnienia, jak w lokalnym, do katalogu, który jest przesyłany? Możesz spróbować uzyskać uprawnienia do lokalnych za pomocą metody getPermissions() i ustawić to samo dla zdalnego pliku.

1

Z Javą 7+ możesz to zrobić; poniższy kod oczywiście zakłada konfigurację podobną do twojej, że jest zgodny z POSIX-owym systemem plików na obu końcach.

Sztuką jest uzyskanie zestawu uprawnień pliku POSIX do pliku; odbywa się to przy użyciu:

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

ta zwróci Set<PosixFilePermissions>, który jest w rzeczywistości enum. Przekształcenie enum do liczby całkowitej odbywa się za pomocą następującej sztuczki:

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; 
} 

Jako bezpośredni zachowaniu uprawnień do kopiowania, nie jest to możliwe w jednym poleceniem: SSH nie gwarantuje, że system plików na zdalnych podporach końcowych te, ale przyjmuje do wiadomości, że takie systemy plików istnieją, dlatego proponuje specjalne polecenie do jawnego ustalania uprawnień na odległym końcu.