Usage:

Usage:

실수로 NTFS 드라이브에 백업했습니다. 복구 후 모든 권한은 777로 설정됩니다.

sudo 및 su와 같은 중요한 파일을 수정했습니다. 적어도 다음 주 동안은 인터넷 연결이 제한되어 있기 때문에 지금은 다시 설치할 수 없습니다.

팩맨은 각 패키지의 mtree 파일에 파일 관련 메타데이터를 gzip 형식으로 저장한다는 것을 기억합니다. 이거 써보려고 하는데유용하지만 bsdtar mtree 형식에 문제가 있는 것 같아서 파일을 chmods하는 나만의 bash 스크립트를 작성하기로 결정했습니다.

다음은 참조용 acl의 mtree입니다.

gzip -cd /var/lib/pacman/local/acl-2.2.52-3/mtree

출력 -

#mtree
/set type=file uid=0 gid=0 mode=644
./.BUILDINFO time=1478441026.526890249 size=3111 md5digest=80956213c6346f28d8f1b5a9165b952d sha256digest=5e56cab859054c2ca7759cbe50adbc0b6352f78fad3b051bb9174f3bf17f9c21
./.PKGINFO time=1478441026.513556943 size=434 md5digest=8e7df6a965b196aa5564786f022d068d sha256digest=504c99ff77ddb0d2847d7e8c85f637ad78edd78db3ee91a6b491bee5884ebb22
/set mode=755
./usr time=1478441025.433559189 type=dir
./usr/bin time=1478441026.323557338 type=dir
./usr/bin/chacl time=1478441026.323557338 size=14672 md5digest=69332d6d57c153ad21ecf1c09381363d sha256digest=faafbb9420403fb13d4207e986ee0ba940a97b1feb3fcde453669912afeaa340
./usr/bin/getfacl time=1478441026.313557360 size=23680 md5digest=ef23d3c7676198e08d71530c58f44026 sha256digest=f22b3fd68e46d767e7f255be7427cebde9f7539357b2625fade7fa86fbb60743
./usr/bin/setfacl time=1478441026.320224012 size=36224 md5digest=9f6a5f7ddcb08b787b39bcfda4047828 sha256digest=4ac33e394ec50676af4015498fecc867802de3f14f7a589c7d972fcc2b720b4d
./usr/include time=1478441025.466892453 type=dir
./usr/include/acl time=1478441025.473559107 type=dir
./usr/include/acl/libacl.h time=1478441025.473559107 mode=644 size=2590 md5digest=9cd8a73452e0cf899928b27b20b02d6e sha256digest=21366c9f8ffe4018cc3753a73e0c81f0c54102435031de8f5325675f55a42bf2
./usr/include/sys time=1478441025.460225800 type=dir
./usr/include/sys/acl.h time=1478441025.460225800 mode=644 size=3755 md5digest=8ea51961753fc1da4cae7fd48d2068c0 sha256digest=287dbc9269df3fe9e6b0a1dc6c0aac8e90b925867bf235a554a02414f6fcedfd
/set mode=777
./usr/lib time=1478441025.996891351 mode=755 type=dir
./usr/lib/libacl.so time=1478441025.483559085 type=link link=libacl.so.1
./usr/lib/libacl.so.1 time=1478441025.463559127 type=link link=libacl.so.1.1.0
./usr/lib/libacl.so.1.1.0 time=1478441025.996891351 mode=644 size=35456 md5digest=3e5e200ae58fdf7f4558ef863b11d9a6 sha256digest=f8c7e1c06646c5d46725cbc4d0c7290b35d4d2c4203df2a0ccb42e7635be6ce6
/set mode=755
./usr/share time=1478441025.353559356 type=dir

간결하게 다듬었습니다.

내가하는 방법은 다음과 같습니다 -

  1. 이 출력을 한 줄씩 읽으십시오.
  2. "/set mode=" 줄이 나타나면 모드 값을 구문 분석하세요.
  3. 파일 이름을 구문 분석하고 chmodding을 계속하십시오.
  4. 파일에 개별 모드가 있는 경우 전역 모드 대신 해당 모드를 사용하십시오.

그래서 첫 번째 단계(한 줄씩 읽기)에서는 다음을 수행했습니다.

file = "$1"
while read var
    do
        echo "$var"
    done < "$file"

하지만 이것은 나에게 준다

=: cannot open `=' (No such file or directory)
:  cannot open `' (No such file or directory)
./test: line 5: : No such file or directory

어떤 도움이라도 대단히 감사하겠습니다.

답변1

이 문제를 해결하고 싶었기 때문에 MTREE 기반 파일 권한을 수정하기 위해 Bash 스크립트를 작성했습니다...

curl https://xgit.ddns.net/ergotamin/ShellScripting/raw/master/fix-permissions \
>fix-permissions && chmod 0775 fix-permissions

Usage:

fix-permissions --all -- to fix all permissions of whole FS fix-permission "/var/lib/pacman/local/PKGNAME -- to fix only this mtree

관련 없음:

여기:클릭 해주세요Bash 버전보다 훨씬 빠른 C로 코딩된 솔루션을 찾을 수 있습니다.

용법:

use-mtree /path/to/*/mtree

소스 코드 사용 가능여기...여기(필수 헤더는 내 웹사이트에서 찾을 수 있습니다):

/******************************************* * ! Copyright (C)2018 * ! Marcel Bobolz * * $ Copying and distribution of this file, with or without modification, * $ are permitted in any medium without royalty provided the copyright * $ notice and this notice are preserved. This file is offered as-is, * $ without any warranty. * * * @ Code-Information : * * => % MTree-Parser * *******************************************/ #include <xstdarchive.h>

__attribute__((flatten)) __bool_t main(__i32_t ArgC, __charr_t ArgV){ ArgC--; ArgV++; __u64_t BytesRead = ZERO; static __file_t PFile; static __uch_t MTreeBuf[BUF1MB]; foreach(ArgV){ ((PFile = popen(StrForm("%s%s", "gzip -cd ", *ArgV), "r")) == NULL) ? \ (exit(ERROR)) : (BytesRead = fread(MTreeBuf, ONE, BUF1MB - ONE, PFile)); (BytesRead > ZERO) ? (pclose(PFile)) : (exit(ERROR)); MTreeBuf[BytesRead] = ZERO; ArchiveListArchive(((__str_t)MTreeBuf), 'x'); memset(MTreeBuf, ZERO, BUF1MB); PFile = NU(__file_t); } return(SUCCESS); }

관련 정보