Cách tiêu chuẩn để sao chép quyền của tệp


10

Tôi đang cố gắng tìm một cách POSIX tiêu chuẩn để sao chép quyền của một tệp này sang tệp khác. Trên hệ thống GNU, điều này thật dễ dàng:

[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4

Thật không may, cờ --reference cho chmod là một tùy chọn không chuẩn. Vì vậy, đó là ra cho mục đích của tôi. Tôi thích nó là một lớp lót, nhưng điều đó không cần thiết. Cuối cùng, nó cần phải theo cú pháp POSIX sh.

Câu trả lời:


7

Một cám dỗ là phân tích cú pháp ls. Tránh sự cám dỗ đó .

Những điều sau đây có vẻ hiệu quả, tuy nhiên nó đầy rẫy Kluge. Nó phụ thuộc vào việc cpgiữ quyền của tệp đích. Đối với bản demo này, tệp "mẫu" phải không tồn tại.

  • Sao chép tệp với quyền bạn muốn vào một tệp mới
  • Sao chép tệp mà bạn muốn thay đổi thành tệp được tạo ở bước trước
  • Xóa tệp gốc mà bạn muốn thay đổi
  • Đổi tên tệp trung gian thành tên của tệp sẽ được thay đổi

Bản giới thiệu:

$ echo "contents of has">has
$ echo "contents of wants">wants
$ chmod ug+x has     # just so it's different - represents the desired permissions
$ cp has template
$ cat has
contents of has
$ cat wants
contents of wants
$ cat template
contents of has
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 16 2010-07-31 09:23 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cp wants template
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cat template
contents of wants
$ rm wants
$ mv template wants
$ ls -l has wants
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 wants
$ cat has
contents of has
$ cat wants
contents of wants

Bây giờ đó là một cách tiếp cận thú vị. Tôi sẽ thử nghiệm điều này và xem nó hoạt động tốt như thế nào đối với các máy chủ khác nhau. Dường như với tôi như nó sẽ làm điều đó.
Alex

@Alex: đảm bảo kiểm tra nó với quyền sở hữu tập tin, nếu đó là một mối quan tâm.
Tạm dừng cho đến khi có thông báo mới.

Lệnh cp đầu tiên cp has template, nên sử dụng cp -pđể bảo toàn các thuộc tính chế độ và quyền sở hữu.
vào

@mernst: Điều đó chỉ cần thiết cho người đầu tiên cpnếu chủ sở hữu / nhóm tệp (ví dụ: "người dùng") khác với người thực hiện sao chép (ví dụ: root).
Tạm dừng cho đến khi có thông báo mới.

@Dennis Willamson: OK, nhưng đó là một khả năng và tôi không thấy bất kỳ nhược điểm nào khi sử dụng cp -pở đó.
mernst

12

Bạn có thể sử dụng statlệnh để có được sự cho phép của tập tin:

  • Cú pháp Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileTo SetPerm

  • Cú pháp Linux (không chắc chắn):

    chmod `stat -c% a fileWithPerm` fileTo SetPerm

Các ' biểu tượng là một backquote.


1
Tôi không nghĩ statlà bắt buộc bởi POSIX. Nó thường không có sẵn.
Tạm dừng cho đến khi có thông báo mới.

stat (dòng lệnh) không phải là POSIX và không khả chuyển. Dennis ++
jim mcnamara

1

Các tiện ích ACL getfaclsetfacl có thể được sử dụng cho mục đích này, nhưng tôi không biết liệu POSIX này có đủ tuân thủ hay không. Hoạt động ít nhất trong FreeBSD 8.0 và Linux, nhưng mặt khác, người ta có thể phải cài đặt các tiện ích ACL.

Từ trang con người:

getfacl file1 | setfacl -b -n -M - file2
Copy ACL entries from file1 to file2.

Tôi nghĩ getfacl và setfacl có thể hoạt động cả quyền truy cập tệp tiêu chuẩn ngoài ACL.


ACL và như vậy được xác định bởi POSIX là dành riêng cho việc triển khai, do đó không bắt buộc phải tuân thủ.
Tạm dừng cho đến khi có thông báo mới.


0

Một cách đơn giản, di động không phải là một tiện ích tiêu chuẩn - bạn sẽ cần gọi stat () trên tệp mẫu, sau đó chmod () trên (các) tệp đích. Điều này có nghĩa là sử dụng một ngôn ngữ như C hoặc ngôn ngữ khác được sử dụng rộng rãi như perl.

Các quyền truy cập tệp được chỉ định trong thành viên struct stat st_mode bởi các bit 0007777. Giải pháp của Dennis là chính xác, nếu hơi nặng về I / O, vì vậy đối với các tệp thực sự lớn, nó có thể thất bại:

cp has template

Xem xét ví dụ không sẵn sàng cho sản xuất này:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

mode_t 
getperm(const char *template_file)
{
    struct stat st;
    if(stat(template_file, &st)==-1)
    {
       perror("Cannot stat file");
       exit(1);
    }
    return st.st_mode;
}

int main(int argc, char **argv)
{    
    mode_t mode=getperm(argv[1]);
    int i=0;
    for(i=2; argv[i]!=NULL; i++)    
    {
       if(chmod(argv[i], mode)==-1)
          fprintf(stderr, "Permissions failed on %s:\n\t%s\n",
              argv[i], strerror(errno));
    }       
    return 0;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.