2015-06-30 15 views
7

Sto usando jscape sftp per trasferire i fileJSCAPE caricati sftp preservare il permesso di file

com.jscape.inet.sftp.Sftp 

Sftp sftpSession = null; 

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

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

ora, questo codice sta trasferendo il file, che una parte OK. ma il permesso del file viene modificato nella macchina remota (sta diventando 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 

vedo il metodo seguito per cambiare il permesso del file remoto,

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

Le mie domande sono,

  • fa il metodo com.jscape.inet.sftp.Sftp.upload funziona solo in questo modo, caricare il file senza preservare il permesso?
  • esiste un modo per conservare l'autorizzazione, senza utilizzare il metodo setFilePermissions in modo esplicito?

risposta

4

L'utente e il gruppo sul remoto hanno le stesse autorizzazioni locali, nella directory che viene caricata? Puoi provare ad ottenere le autorizzazioni locali usando il metodo getPermissions() e impostando lo stesso sul file remoto.

1

Con Java 7+ è possibile farlo; il codice sottostante presuppone ovviamente una configurazione simile alla tua, che sia compatibile con filesystem POSIX su entrambe le estremità.

Il trucco è ottenere il set di permessi file POSIX su un file; questo viene fatto utilizzando:

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

Ciò restituirà un Set<PosixFilePermissions>, che è in realtà un enum. Trasformando l'enumerazione in numero intero viene fatto usando il seguente trucco:

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

quanto a preservare direttamente le autorizzazioni per copia, questo non è possibile in un unico comando: SSH non garantisce che il file system agli appoggi terminali remoti quelli, ma riconosce che tali filesystem esistono, ed è per questo che propone un comando dedicato per impostare esplicitamente le autorizzazioni su un terminale remoto.