유닉스 : 파일 또는 디렉토리 권한을 "복사"하는 방법이 있습니까?


14

디렉토리에 두 개의 파일이 있습니다. 하나는 올바른 권한을 가지고 있고 다른 하나는 그렇지 않습니다. 한 파일에서 다른 파일로 권한 세트를 "복사"할 수있는 방법이 있습니까?

답변:


15

chmod 유틸리티 의 GNU 버전은 한 파일 ( )에서 다른 파일 ( )로 모드복사 할 수 있습니다 .RFilefile

chmod --reference=RFile file

GNU coreutils 는 대부분의 Linux 배포판과 Cygwin에서 찾을 수 있습니다. 모든 chmod 구현 이이 옵션을 제공 하지는 않습니다 .


흠 ...이 작동하는 것으로 보이지만 Mac OS X에서는 지원되지 않습니까? 거기에 불법 옵션 만 있습니다 ...
Svish

2
chmodbash 내장 명령 이 아닙니다 . 많은 유닉스에서 사용할 수있는 별도의 유틸리티입니다. --reference옵션은 GNU 버전에 포함되어 있습니다; OSX는 아마도 대신 BSD에서 시작 하는 chmod 를 사용합니다 . OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
퀵 퀵소트

Svish, MacPorts를 통한 GNU 버전 설치를 고려할 수 있습니다.
Jeremy L

여기 cp -dpR <source-file> <dest-file>에서 파일을 복사 할 때 파일과 권한을 복사 할 수 있다는 점을 언급하는 것이 유용하다고 생각했습니다 .r
LawrenceC

1

나는 이것을 생각해 냈다.

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

완벽한 방탄은 아니지만 필요한 것을 수행합니다.


0

이 시도:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

두 파일이 파일과 일치하지 않으면 "해당 파일이나 디렉토리가 없습니다"라는 오류가 많이 나타납니다.


find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez

chmod : '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1'의 속성을 가져 오지 못했습니다 : 해당 파일 또는 디렉토리가 없습니다 chmod : '/ home / myubuntuuser / Desktop / test2 //의 속성을 가져 오지 못했습니다. home / myubuntuuser / Desktop / test1 / 111.txt ': 해당 파일 또는 디렉토리가 없습니다 chmod :'/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt '의 속성을 가져 오지 못했습니다 : 해당 파일 또는 디렉토리 chmod : '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt'의 속성을 가져 오지 못했습니다 : 해당 파일 또는 디렉토리가 없습니다
Rick Sanchez

test1과 test2의 두 폴더에서 테스트했습니다. 각각 권한이 다른 동일한 파일 111 / 222 / 333.txt가 있습니다. test1에는 기본 것이 있습니다. test2에는 777 권한이 있습니다. 이것은 내가 얻는 오류입니다.
Rick Sanchez

0

getfacl파일 권한, 소유자, 그룹 및 추가 ACL (액세스 제어 목록)의 전체 목록을 검색하는 데 사용할 수 있습니다 .

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

해당 출력을 파일 (예 :)에 저장하면을 사용 acl.txt하여이 형식에서 복원 할 수 있습니다 setfacl --restore acl.txt. 단일 파일 만 복원하고 해당 파일의 파일 이름이 원본과 다른 경우 새 파일 이름이있는 setfacl --set-file acl.txt filename.txt곳 을 사용하려고합니다 filename.txt.

단계

  1. 다음에 원래 권한을 저장하십시오 acl.txt.

    $ getfacl filename.txt > acl.txt
    
  2. 덮어 쓰기 권한 (시연을 위해 다음 단계에서 복원하는 것이 효과가 있음을 나타냅니다)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. 다음 setfacl에서 올바른 권한을 복원하는 데 사용하십시오 acl.txt.

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

파일 이름은에 # file:의해 생성 된 주석 에서 가져 오므로 getfacl명령 줄에서 지정할 필요가 없습니다.

이러한 권한을 다른 파일로 복원하려면 다음 --set-file--restore같이 사용할 수 있습니다 .

$ setfacl --set-file acl.txt second_filename.txt

의 일부 파일에 대한 권한을 덮어 /usr쓰지만 덮어 쓴 파일을 모를 경우 일반적으로 유사하게 구성된 다른 시스템에서 복원하여 수정할 수 있습니다.

  1. 작업 시스템의 백업 권한 (참고 : getfacl상대 경로를 생성하므로 cd두 시스템에서 일관된 위치로 이동)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. 권한이 끊긴 시스템에 ACL 덤프를 복사하십시오.

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. 알려진 양호한 시스템의 권한으로 손상된 권한을 겹쳐 쓰려면 ACL 덤프를 복원하십시오.

    # cd /
    # setfacl --restore /root/acls.txt
    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.