Como corrigir permissões no Arch usando o mtree?

2

Equivocadamente, eu fiz backup em uma unidade NTFS. Depois de restaurar todas as permissões foram definidas para 777.

Eu consertei alguns arquivos importantes como sudo e su. Não posso reinstalar agora, pois minha conexão com a Internet é limitada, pelo menos por mais uma semana.

Eu lembrei que o pacman armazena os metadados relacionados aos arquivos no arquivo mtree para cada pacote em um formato gzipado. Eu tentei usar este utilitário mas parece que tem problemas com o formato bsdtar mtree, então eu decidi escrever um meu próprio script, que apenas chmods os arquivos.

Aqui está a mtree de acl como referência -

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

Saída -

#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

Aparado para breve.

Meu lance é algo assim -

  1. leia esta linha de saída por linha
  2. se encontrarmos uma linha "/ set mode=", analise o valor do modo
  3. analise o nome do arquivo e mantenha o chmodding.
  4. Se o arquivo tiver um modo individual, use esse modo em vez do global.

Então, para o primeiro passo (lendo linha por linha) eu fiz -

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

Mas isso está me dando

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

Qualquer ajuda é muito apreciada.

    
por Aniket Bhattacharyea 31.03.2017 / 07:23

1 resposta

3

Como eu quero fornecer ajuda para esse problema, eu escrevi um pequeno Bash-Script para corrigir permissões de arquivo com base nos MTREE's ...

%pr_e%

Uso:

fix-permissions --all - para corrigir todas as permissões do FS inteiro correção de permissão "/ var / lib / pacman / local / PKGNAME - para corrigir apenas este mtree

Off-Topic:

Aqui: CLIQUE EM MIM você pode encontrar uma solução codificada em C, que é MUITO rápida, em seguida, Bash-Version ...

Uso:

use-mtree /path/to/*/mtree

O SourceCode está disponível Aqui ... e aqui (os cabeçalhos necessários estão disponíveis no meu site):

%pr_e%

/ ******************************************* *! Copyright (C) 2018 *! Marcel Bobolz * * $ Copiando e distribuindo este arquivo, com ou sem modificação, * $ são permitidos em qualquer meio sem royalty desde que os direitos autorais * $ notice e este aviso são preservados. Este arquivo é oferecido como está, * $ sem qualquer garantia. * * * @ Code-Information: * * = > % MTree-Parser * ******************************************* / #include <xstdarchive.h >

__ atributo __ ((flatten)) __bool_t main (__ i32_t ArgC, __charr_t ArgV) {   ArgC--;   ArgV ++;   __u64_t BytesRead = ZERO;   estático __file_t PFile;   estático __uch_t MTreeBuf [BUF1MB];   foreach (ArgV) {     ((PFile = popen (StrForm ("% s% s", "gzip -cd", * ArgV), "r")) == NULL)? \     (saída (ERRO)): (BytesRead = fread (MTreeBuf, UM, BUF1MB - UM, PFile));     (BytesRead > ZERO)? (pclose (PFile)): (exit (ERROR));     MTreeBuf [BytesRead] = ZERO;     ArchiveListArchive (((__str_t) MTreeBuf), 'x');     memset (MTreeBuf, ZERO, BUF1MB);     PFile = NU (__ file_t);   }   retorno (SUCESSO); }

    
por 18.01.2018 / 01:49