2015-06-30 35 views
7

Tôi đang sử dụng jscape sftp để chuyển các tập tinjscape sftp upload bảo quản cho phép tập tin

com.jscape.inet.sftp.Sftp 

Sftp sftpSession = null; 

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

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

nay, mã này được chuyển hồ, một phần OK. nhưng sự cho phép tập tin là nhận được thay đổi trong máy từ xa (nó trở thành 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 

Tôi thấy phương pháp dưới đây để thay đổi sự cho phép của tập tin từ xa,

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

Câu hỏi của tôi là,

  • hiện các phương pháp com.jscape.inet.sftp.Sftp.upload hoạt động theo cách này mà thôi, tải lên tệp mà không giữ quyền?
  • có cách nào để giữ quyền, mà không sử dụng phương pháp setFilePermissions một cách rõ ràng không?

Trả lời

4

Người dùng và nhóm trên điều khiển từ xa có quyền tương tự như ở địa phương, với thư mục đang được tải lên không? Bạn có thể thử nhận các quyền trên local bằng phương thức getPermissions() và thiết lập tương tự với tệp từ xa.

1

Với Java 7+ bạn có thể làm điều đó; mã dưới đây tất nhiên giả định một thiết lập tương tự như của bạn, rằng nó POSIX hệ thống tập tin tương thích trên cả hai đầu.

Bí quyết là lấy tập hợp các quyền của tệp POSIX trên một tệp; này được thực hiện sử dụng:

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

này sẽ trả về một Set<PosixFilePermissions>, mà thực chất là một enum. Chuyển enum vào một số nguyên được thực hiện bằng cách sử dụng thủ thuật sau đây:

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

Như để trực tiếp giữ gìn các điều khoản trên bản sao, điều này là không thể trong một lệnh duy nhất: SSH không đảm bảo rằng hệ thống tập tin ở sự hỗ trợ kết thúc từ xa nhưng nó thừa nhận rằng hệ thống tập tin như vậy tồn tại, đó là lý do tại sao nó đề xuất một lệnh chuyên dụng để thiết lập quyền trên một đầu cuối từ xa một cách rõ ràng.

Các vấn đề liên quan