유닉스 : 파일 또는 디렉토리 권한을 “복사”하는 방법이 있습니까? 올바른 권한을 가지고 있고 다른

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



답변

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

chmod --reference=RFile file

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


답변

나는 이것을 생각해 냈다.

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

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


답변

이 시도:

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

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


답변

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