파일 권한을 복제하는 표준 방법


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에 대한 --reference 플래그는 비표준 옵션입니다. 그래서 그것은 내 목적을 위해 만들어졌습니다. 나는 그것을 하나의 라이너로 선호하지만 그럴 필요는 없습니다. 궁극적으로 POSIX sh 구문에 있어야합니다.

답변:


7

한 가지 유혹은 파싱하는 것 ls입니다. 그 유혹을 피하십시오 .

다음은 작동하는 것 같지만 Kluge로 가득합니다. cp대상 파일의 권한 을 유지하는 데 의존 합니다. 이 데모에서는 "template"파일이 존재하지 않아야합니다.

  • 원하는 권한이있는 파일을 파일로 복사
  • 변경하려는 파일을 이전 단계에서 작성된 파일로 복사하십시오.
  • 변경하려는 원본 파일을 제거하십시오.
  • 중간 파일 이름을 변경할 파일 이름으로 바꿉니다.

데모:

$ 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

@Alex : 걱정되는 경우 파일 소유권으로 테스트해야합니다.
추후 공지가있을 때까지 일시 중지되었습니다.

첫 번째 cp 명령 은 모드 및 소유권 속성을 유지하는 데 cp has template사용해야 cp -p합니다.
mernst

@mernst : cp파일의 소유자 / 그룹 (예 : "user")이 복사하는 사람 (예 : 루트)과 다른 경우 에만 첫 번째로 필요합니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

@Dennis Willamson : 알았지 만, 그 가능성은 있으며 사용하는 데 단점이 없습니다 cp -p.
mernst

12

stat명령을 사용하여 파일 권한을 얻을 수 있습니다 .

  • Mac OS X (BSD) 구문 :

    chmod`stat -f % A fileWithPerm` fileToSetPerm

  • 리눅스 문법 (잘 모르겠 음) :

    chmod`stat -c % a fileWithPerm` fileToSetPerm

` 기호는 역 인용 부호이다.


1
statPOSIX가 필요 하다고 생각하지 않습니다 . 종종 사용할 수 없습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

stat (명령 행)은 POSIX가 아니며 이식 가능하지 않습니다. Dennis ++
Jim Mcnamara

1

ACL 유틸리티 getfaclsetfacl을이 용도로 사용할 수 있지만이 POSIX를 충분히 준수하는지는 알 수 없습니다. 적어도 FreeBSD 8.0 및 Linux에서 작동하지만 다른 한편으로는 ACL 유틸리티를 설치해야 할 수도 있습니다.

맨 페이지에서 :

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

getfacl과 setfacl은 ACL 외에도 표준 파일 권한을 사용할 수 있다고 생각합니다.


POSIX에 의해 정의 된 ACL 및 이러한 것은 구현에 따라 다르므로 규정 준수에 필요하지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.


0

이식성 있고 간단한 방법은 표준 유틸리티가 아닙니다. 템플릿 파일에서 stat ()를 호출 한 다음 대상 파일에서 chmod ()를 호출해야합니다. 이것은 C와 같은 언어 또는 perl과 같은 널리 사용되는 다른 언어를 사용한다는 것을 의미합니다.

파일 액세스 권한은 struct stat st_mode 멤버에 0007777 비트로 지정됩니다. I / O에 약간 무거운 경우 Dennis의 솔루션이 정확하므로 실제로 큰 파일의 경우 실패 할 수 있습니다.

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.