วิธีมาตรฐานในการทำซ้ำการอนุญาตของไฟล์


10

ฉันกำลังค้นหาวิธี POSIX มาตรฐานเพื่อทำซ้ำการอนุญาตของไฟล์หนึ่งไปยังไฟล์อื่น ในระบบ GNU สิ่งนี้เป็นเรื่องง่าย:

[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

น่าเสียดายที่ธง - อ้างอิงถึง chmod เป็นตัวเลือกที่ไม่ได้มาตรฐาน นั่นก็เพื่อจุดประสงค์ของฉัน ฉันชอบที่จะเป็นหนึ่งซับ แต่มันไม่จำเป็น ท้ายที่สุดมันต้องอยู่ในไวยากรณ์ POSIX sh

คำตอบ:


7

lsหนึ่งในสิ่งล่อใจคือการแยก หลีกเลี่ยงสิ่งล่อใจนั้น

ดูเหมือนว่าจะใช้งานได้ดี แต่มันเต็มไปด้วย Kluge มันขึ้นอยู่กับcpการรักษาสิทธิ์ของไฟล์เป้าหมาย สำหรับการสาธิตนี้ไฟล์ "เทมเพลต" จะต้องไม่มีอยู่

  • คัดลอกไฟล์ด้วยสิทธิ์ที่คุณต้องการไปยังไฟล์ใหม่
  • คัดลอกไฟล์ที่คุณต้องการเปลี่ยนเป็นไฟล์ที่สร้างในขั้นตอนก่อนหน้า
  • ลบไฟล์ต้นฉบับที่คุณต้องการเปลี่ยน
  • เปลี่ยนชื่อไฟล์กลางเป็นชื่อไฟล์ที่จะเปลี่ยน

การสาธิต:

$ 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

ตอนนี้เป็นวิธีที่น่าสนใจ ฉันจะทดสอบสิ่งนี้และดูว่ามันทำงานได้ดีกับเซิร์ฟเวอร์ต่าง ๆ อย่างไร ดูเหมือนว่าฉันจะทำเคล็ดลับ
อเล็กซ์

@Alex: ตรวจสอบให้แน่ใจว่าได้ทดสอบด้วยความเป็นเจ้าของไฟล์ด้วยเช่นกันหากเป็นข้อกังวล
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำสั่ง cp แรกcp has templateควรใช้cp -pเพื่อรักษาโหมดและคุณลักษณะความเป็นเจ้าของ
mernst

@mernst: นั่นเป็นสิ่งที่จำเป็นสำหรับคนแรกเท่านั้นcpหากเจ้าของ / กลุ่มของไฟล์ (เช่น "ผู้ใช้") แตกต่างจากคนที่ทำสำเนา (เช่น root)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Denen Willamson: ตกลง แต่นั่นเป็นไปได้และฉันไม่เห็นข้อเสียของการใช้ที่cp -pนั่น
mernst

12

คุณสามารถใช้statคำสั่งเพื่อรับสิทธิ์ของไฟล์:

  • ไวยากรณ์ Mac OS X (BSD):

    chmod `stat -f% ไฟล์ด้วยPerm`ไฟล์ไปยัง SetPerm

  • ไวยากรณ์ Linux (ไม่แน่ใจ):

    chmod `สถิติ -c% ไฟล์ด้วยPerm` fileToSetPerm

`สัญลักษณ์ไพล


1
ฉันไม่คิดว่าstatPOSIX ต้องการ มันมักจะไม่สามารถใช้ได้
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

stat (บรรทัดคำสั่ง) ไม่ใช่ POSIX และไม่สามารถพกพาได้ Dennis ++
jim mcnamara

1

อรรถประโยชน์ ACL getfaclและsetfaclสามารถนำมาใช้เพื่อจุดประสงค์นี้ได้ แต่ฉันไม่รู้ว่า POSIX นี้ใช้งานได้หรือไม่ ทำงานอย่างน้อยใน FreeBSD 8.0 และ Linux แต่ในอีกทางหนึ่งอาจต้องติดตั้งยูทิลิตี้ ACL

จากหน้าคน:

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

ฉันคิดว่า getfacl และ setfacl สามารถใช้งานไฟล์มาตรฐานได้นอกจาก ACL


ACLs และเช่นนั้นถูกกำหนดโดย POSIX เป็นเฉพาะการใช้งานดังนั้นจึงไม่จำเป็นสำหรับการปฏิบัติตาม
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

0

cp -p จะสงวนสิทธิ์ของไฟล์


1
นั่นเป็นเหตุผลที่เทคนิคในคำตอบของฉัน (ของไม่ได้ใช้-p) ทำงานให้กับสิ่งที่ต้องการ OP ซึ่งก็คือการทำซ้ำการอนุญาตสำหรับที่แตกต่างกันไฟล์ที่ไม่ซ้ำกันของไฟล์
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

0

วิธีการพกพาที่ใช้งานง่ายและตรงไปตรงมาไม่ใช่ยูทิลิตี้มาตรฐาน - คุณจะต้องเรียก stat () บน templatefile จากนั้น chmod () บนไฟล์ปลายทาง ซึ่งหมายความว่าการใช้ภาษาเช่น C หรือภาษาอื่นที่ใช้กันอย่างแพร่หลายเช่น perl

สิทธิ์การเข้าถึงไฟล์ถูกระบุไว้ใน struct stat st_mode สมาชิกโดย 0007777 บิต วิธีแก้ปัญหาของ Dennis นั้นถูกต้องหาก I / O หนักหนาสักหน่อยดังนั้นสำหรับไฟล์ที่มีขนาดใหญ่มากมันอาจล้มเหลว:

cp has template

ลองพิจารณาตัวอย่างที่ยังไม่พร้อมสำหรับการผลิต:

#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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.