Это короткая история о том, насколько опасной может оказаться обычная распаковка tar, и что можно сделать для минимизации или избежания связанных с ней рисков.

▍ Ошибка


Недавно я экспериментировал с установкой Void Linux через chroot методом XBPS. Для подготовки базовой системы Void Linux на моём хосте с Fedora Linux требовался XBPS Package Manager. Одним из вариантов было скачать архив статически собранных инструментов из официального репозитория. Я выбрал https://repo-default.voidlinux.org/static/xbps-static-latest.x86_64-musl.tar.xz

$ tar -tf xbps-static-latest.x86_64-musl.tar.xz | head

./
./usr/
./usr/bin/
./usr/bin/xbps-uunshare
./usr/bin/xbps-uhelper
./usr/bin/xbps-uchroot
./usr/bin/xbps-rindex
./usr/bin/xbps-remove
./usr/bin/xbps-reconfigure
./usr/bin/xbps-query

Я настолько привык к тому, что все файлы в архивах имеют параметр user:group равный 0:0, что даже не стал проверять их фактические разрешения и владельцев. Я просто взглянул на структуру каталогов и обратил внимание, что все исполняемые файлы удобно расположены по относительному пути ./usr/bin/. Я сразу решил просто извлечь их в корневой каталог, чтобы они оказались непосредственно доступны в моём $PATH. И это стало большой ошибкой, поскольку, если бы я их проверил, то увидел бы нестандартные разрешения (700) текущего каталога . и нестандартный user:group всего содержимого архива:

$ tar -tvf xbps-static-latest.x86_64-musl.tar.xz | head

drwx------ duncaen/netusers  0 2023-09-18 06:37 ./
drwxr-xr-x duncaen/netusers  0 2023-09-18 06:37 ./usr/
drwxr-xr-x duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-uunshare -> xbps-uunshare.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-uhelper -> xbps-uhelper.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-uchroot -> xbps-uchroot.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-rindex -> xbps-rindex.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-remove -> xbps-remove.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-reconfigure -> xbps-reconfigure.static
lrwxrwxrwx duncaen/netusers  0 2023-09-18 06:37 ./usr/bin/xbps-query -> xbps-query.static

Но, не зная всего этого, я выполнил…

$ sudo tar -C / -xvfp xbps-static-latest.x86_64-musl.tar.xz

В течение следующих нескольких секунд я заметил стремительное ухудшение работы системы. Окна сеанса XFCE перестали отрисовываться, и сам сервер X отключился. Я не мог выполнить sudo и даже перезагрузить систему. Всё произошло очень быстро, и я никак не мог подумать, что виной тому стала последняя выполненная мной команда. К счастью, загрузившись в однопользовательском режиме и детально проанализировав архив tar, я смог обнаружить источник проблемы.

▍ Первопричина


Архив tar содержит текущий каталог ./, который стал корневым, когда перед извлечением я изменил его на tar -C / .... Восстановление владельца и разрешений текущего (верхнего) каталога архива привело к установке прав 700 и owner:group равного 2002:2000 в дереве каталогов, что изменило его ожидаемое состояние. Таким образом, конкретно мой пользователь полностью утратил доступ ко всей файловой системе. Кто бы мог такое ожидать? ;)

Для воссоздания этого случая в качестве демонстрации я запустил новую виртуальную машину. Не пытайтесь повторить это в работающей системе!

$ sudo chmod 700 /

$ ls -ld /
drwx------ 17 root root 4096 Mar 27 11:24 /

$ sudo chown 2000:2000 /

$ sudo chown 2000:2000 /usr
-bash: /usr/bin/sudo: Permission denied

$ sudo -s
-bash: /usr/bin/sudo: Permission denied

$ ls -ld /
-bash: /usr/bin/ls: Permission denied

▍ Как такое предотвратить?


Как правило, удобно создавать новый архив с деревом относительных каталогов при помощи команды вроде:

$ tar -C /path/to/rootfs -czf myarchive.tar.gz .

Причина в том, что так вам не нужно беспокоиться о внутренней структуре каталогов, и это всего одна команда. Все файлы адресуются с помощью просто .. Она также полезна при извлечении, поскольку -C /some/path/ позволяет вам выбирать любой целевой каталог. С другой стороны, этот подход добавляет в архив текущий каталог (верхний из вывода выше), что отменяет всё удобство. В GNU tar по умолчанию «при извлечении переписывает метаданные существующих каталогов», что равнозначно опции --overwrite-dir. Например, если архив содержит резервную копию домашних каталогов пользователей со всеми необходимыми разрешениями, будет очень легко восстановить их, выполнив что-то вроде tar -C /home -xpf homes.tar.gz. Но это сработает, только если архив не содержит текущего каталога, и целевой /home/ не изменён.

Хорошим способом избежания подобных подвохов будет добавление опции --no-overwrite-dir, которая «сохраняет метаданные существующих каталогов». Поэтому, если вы выполните что-то вроде tar -C /home --no-overwrite-dir -xpf homes.tar.gz, все существующие каталоги (включая текущий) останутся без изменений.

Также существует несколько способов создать архив без текущего каталога, но в большинстве из них требуется либо предварительное изменение каталога, либо определение всех файлов/каталогов для будущего архива. Как бы то ни было, я нашёл способ, который хоть и выглядит странно, но справляется с задачей при помощи одной команды:

$ tar --transform='s|tmp/rootfs|.|' --show-transformed-names -cvf myarchive.tar /tmp/rootfs/*

# или в более кратком варианте

$ tar --transform='s|tmp/rootfs|.|' -cf myarchive.tar /tmp/rootfs/*

Благодарю Эрика Радмана за то, что указал на ещё одну опцию в tar, -s, обеспечивающую аналогичную функциональность.

Альтернативным и довольно типичным способом создания подобных архивов (пакетов) будет использование fakeroot. Он запускается как непривилегированный пользователь и притворяется, что все файлы принадлежат root. По факту же это просто иллюзия. Давайте взглянем на каталог с извлечёнными базовыми инструментами xbps:

$ tree -agpu xbps-tools/ | head
[drwxr-xr-x 2002     2000    ]  xbps-tools/
├── [drwxr-xr-x 2002     2000    ]  usr
│   └── [drwxr-xr-x 2002     2000    ]  bin
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-alternatives -> xbps-alternatives.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-alternatives.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-checkvers -> xbps-checkvers.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-checkvers.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-create -> xbps-create.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-create.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-dgraph -> xbps-dgraph.static

А так он выглядит из-под fakeroot:

$ fakeroot /bin/bash

root@localhost> tree -agpu xbps-tools/ | head
[drwxr-xr-x root     root    ]  xbps-tools/
├── [drwxr-xr-x root     root    ]  usr
│   └── [drwxr-xr-x root     root    ]  bin
│       ├── [lrwxrwxrwx root     root    ]  xbps-alternatives -> xbps-alternatives.static
│       ├── [-rwxr-xr-x root     root    ]  xbps-alternatives.static
│       ├── [lrwxrwxrwx root     root    ]  xbps-checkvers -> xbps-checkvers.static
│       ├── [-rwxr-xr-x root     root    ]  xbps-checkvers.static
│       ├── [lrwxrwxrwx root     root    ]  xbps-create -> xbps-create.static
│       ├── [-rwxr-xr-x root     root    ]  xbps-create.static
│       ├── [lrwxrwxrwx root     root    ]  xbps-dgraph -> xbps-dgraph.static

Эта фейковая среда позволяет создавать архив tar с файлами, принадлежащими root, без изменения их реальных владельцев.

Ещё одним интересным решением является использование инструмента cpio для создания или извлечения архивов POSIX tar. Этот формат можно активировать во время создания архива, добавив -H ustar. Тем не менее в процессе извлечения он обнаруживается автоматически и также не меняет разрешения текущего каталога, даже если тот существует в архиве. Если добавить опцию -d и выполнить cpio с sudo, все несуществующие подкаталоги будут созданы как root:root, что тоже очень удобно.
Длинный код
$ tree -agpu newroot/
[drwxr-xr-x root     root    ]  newroot/

$ xz -cd xbps-static-latest.x86_64-musl.tar.xz | sudo cpio -D newroot -idv
.
./usr
./usr/bin
./usr/bin/xbps-uunshare
./usr/bin/xbps-uhelper
./usr/bin/xbps-uchroot
./usr/bin/xbps-rindex
./usr/bin/xbps-remove
./usr/bin/xbps-reconfigure
./usr/bin/xbps-query
./usr/bin/xbps-pkgdb
./usr/bin/xbps-install
./usr/bin/xbps-fetch
./usr/bin/xbps-fbulk
./usr/bin/xbps-digest
./usr/bin/xbps-dgraph
./usr/bin/xbps-create
./usr/bin/xbps-checkvers
./usr/bin/xbps-alternatives
./usr/bin/xbps-alternatives.static
./usr/bin/xbps-checkvers.static
./usr/bin/xbps-create.static
./usr/bin/xbps-dgraph.static
./usr/bin/xbps-digest.static
./usr/bin/xbps-fbulk.static
./usr/bin/xbps-fetch.static
./usr/bin/xbps-install.static
./usr/bin/xbps-pkgdb.static
./usr/bin/xbps-query.static
./usr/bin/xbps-reconfigure.static
./usr/bin/xbps-remove.static
./usr/bin/xbps-rindex.static
./usr/bin/xbps-uchroot.static
./usr/bin/xbps-uhelper.static
./usr/bin/xbps-uunshare.static
./var
./var/db
./var/db/xbps
./var/db/xbps/keys
./var/db/xbps/keys/60:ae:0c:d6:f0:95:17:80:bc:93:46:7a:89:af:a3:2d.plist
./var/db/xbps/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
179893 blocks


$ tree -agpu newroot/ | head
[drwxr-xr-x root     root    ]  newroot/
├── [drwxr-xr-x 2002     2000    ]  usr
│   └── [drwxr-xr-x 2002     2000    ]  bin
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-alternatives -> xbps-alternatives.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-alternatives.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-checkvers -> xbps-checkvers.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-checkvers.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-create -> xbps-create.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-create.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-dgraph -> xbps-dgraph.static

Обратите внимание, что newroot/ остался неизменным и по-прежнему принадлежит root:root с правами 755. Но cpio способен на большее. Вы можете создать POSIX tar и легко контролировать, какие в него попадают файлы, поскольку cpio принимает только имена файлов. Так что можно получить список файлов с помощью find и затем отфильтровать вывод, исключив (для этого конкретного примера) /usr, /usr/bin, /var/, /var/db. Вот и всё. Очень безопасный и для всех удобный способ с сохранением внутри структуры относительных каталогов. Вот пример, где я создал архив tar с помощью cpio без каких-либо «системных» каталогов, после чего извлёк его с помощью tar стандартным способом:
Очень длинный код
# Использование ‘cpio’ для создания архива tar, содержащего ранее распакованные инструменты xbps
$ (cd xbps-tools && find . | grep -v -e '^\.$' -e '^\./usr$' -e '^\./usr/bin$' -e '^\./var$' -e '^\./var/db$' | cpio -ov -H ustar > ../myxbps.tar)
./var/db/xbps/
./var/db/xbps/keys/
./var/db/xbps/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
./var/db/xbps/keys/60:ae:0c:d6:f0:95:17:80:bc:93:46:7a:89:af:a3:2d.plist
./usr/bin/xbps-uunshare.static
./usr/bin/xbps-uhelper.static
./usr/bin/xbps-uchroot.static
./usr/bin/xbps-rindex.static
./usr/bin/xbps-remove.static
./usr/bin/xbps-reconfigure.static
./usr/bin/xbps-query.static
./usr/bin/xbps-pkgdb.static
./usr/bin/xbps-install.static
./usr/bin/xbps-fetch.static
./usr/bin/xbps-fbulk.static
./usr/bin/xbps-digest.static
./usr/bin/xbps-dgraph.static
./usr/bin/xbps-create.static
./usr/bin/xbps-checkvers.static
./usr/bin/xbps-alternatives.static
./usr/bin/xbps-alternatives
./usr/bin/xbps-checkvers
./usr/bin/xbps-create
./usr/bin/xbps-dgraph
./usr/bin/xbps-digest
./usr/bin/xbps-fbulk
./usr/bin/xbps-fetch
./usr/bin/xbps-install
./usr/bin/xbps-pkgdb
./usr/bin/xbps-query
./usr/bin/xbps-reconfigure
./usr/bin/xbps-remove
./usr/bin/xbps-rindex
./usr/bin/xbps-uchroot
./usr/bin/xbps-uhelper
./usr/bin/xbps-uunshare
179889 blocks

$ file myxbps.tar
myxbps.tar: POSIX tar archive

# Проверка с помощью ‘tar’, чтобы ни для каких файлов не был установлен user/group, и архив не содержал . /usr /usr/bin /var /var/db
$ tar -tvf myxbps.tar
drwxr-xr-x 2002/2000         0 2024-05-21 16:04 var/db/xbps/
drwxr-xr-x 2002/2000         0 2024-05-21 16:04 var/db/xbps/keys/
-rw-r--r-- 2002/2000      1410 2024-05-21 16:04 var/db/xbps/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
-rw-r--r-- 2002/2000      1410 2024-05-21 16:04 var/db/xbps/keys/60:ae:0c:d6:f0:95:17:80:bc:93:46:7a:89:af:a3:2d.plist
-rwxr-xr-x 2002/2000   5623104 2024-05-21 16:04 usr/bin/xbps-uunshare.static
-rwxr-xr-x 2002/2000   5643584 2024-05-21 16:04 usr/bin/xbps-uhelper.static
-rwxr-xr-x 2002/2000   5631296 2024-05-21 16:04 usr/bin/xbps-uchroot.static
-rwxr-xr-x 2002/2000   6414144 2024-05-21 16:04 usr/bin/xbps-rindex.static
-rwxr-xr-x 2002/2000   5779264 2024-05-21 16:04 usr/bin/xbps-remove.static
-rwxr-xr-x 2002/2000   5643904 2024-05-21 16:04 usr/bin/xbps-reconfigure.static
-rwxr-xr-x 2002/2000   5685440 2024-05-21 16:04 usr/bin/xbps-query.static
-rwxr-xr-x 2002/2000   5643904 2024-05-21 16:04 usr/bin/xbps-pkgdb.static
-rwxr-xr-x 2002/2000   5787648 2024-05-21 16:04 usr/bin/xbps-install.static
-rwxr-xr-x 2002/2000   5639488 2024-05-21 16:04 usr/bin/xbps-fetch.static
-rwxr-xr-x 2002/2000   5631296 2024-05-21 16:04 usr/bin/xbps-fbulk.static
-rwxr-xr-x 2002/2000   5623104 2024-05-21 16:04 usr/bin/xbps-digest.static
-rwxr-xr-x 2002/2000   5640384 2024-05-21 16:04 usr/bin/xbps-dgraph.static
-rwxr-xr-x 2002/2000   6402240 2024-05-21 16:04 usr/bin/xbps-create.static
-rwxr-xr-x 2002/2000   5644032 2024-05-21 16:04 usr/bin/xbps-checkvers.static
-rwxr-xr-x 2002/2000   5643904 2024-05-21 16:04 usr/bin/xbps-alternatives.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-alternatives -> xbps-alternatives.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-checkvers -> xbps-checkvers.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-create -> xbps-create.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-dgraph -> xbps-dgraph.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-digest -> xbps-digest.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-fbulk -> xbps-fbulk.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-fetch -> xbps-fetch.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-install -> xbps-install.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-pkgdb -> xbps-pkgdb.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-query -> xbps-query.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-reconfigure -> xbps-reconfigure.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-remove -> xbps-remove.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-rindex -> xbps-rindex.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-uchroot -> xbps-uchroot.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-uhelper -> xbps-uhelper.static
lrwxrwxrwx 2002/2000         0 2024-05-21 16:04 usr/bin/xbps-uunshare -> xbps-uunshare.static

# Создан новый каталог, эмулирующий корневую файловую систему
$ tree -agpu newroot2/
[drwxr-xr-x root     root    ]  newroot2/
├── [drwxr-xr-x root     root    ]  usr
│   └── [drwxr-xr-x root     root    ]  bin
└── [drwxr-xr-x root     root    ]  var
    └── [drwxr-xr-x root     root    ]  db

# Стандартное извлечение с помощью ‘tar’
$ sudo tar -C newroot2 -xvf myxbps.tar
var/db/xbps/
var/db/xbps/keys/
var/db/xbps/keys/3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
var/db/xbps/keys/60:ae:0c:d6:f0:95:17:80:bc:93:46:7a:89:af:a3:2d.plist
usr/bin/xbps-uunshare.static
usr/bin/xbps-uhelper.static
usr/bin/xbps-uchroot.static
usr/bin/xbps-rindex.static
usr/bin/xbps-remove.static
usr/bin/xbps-reconfigure.static
usr/bin/xbps-query.static
usr/bin/xbps-pkgdb.static
usr/bin/xbps-install.static
usr/bin/xbps-fetch.static
usr/bin/xbps-fbulk.static
usr/bin/xbps-digest.static
usr/bin/xbps-dgraph.static
usr/bin/xbps-create.static
usr/bin/xbps-checkvers.static
usr/bin/xbps-alternatives.static
usr/bin/xbps-alternatives
usr/bin/xbps-checkvers
usr/bin/xbps-create
usr/bin/xbps-dgraph
usr/bin/xbps-digest
usr/bin/xbps-fbulk
usr/bin/xbps-fetch
usr/bin/xbps-install
usr/bin/xbps-pkgdb
usr/bin/xbps-query
usr/bin/xbps-reconfigure
usr/bin/xbps-remove
usr/bin/xbps-rindex
usr/bin/xbps-uchroot
usr/bin/xbps-uhelper
usr/bin/xbps-uunshare

$ tree -agpu newroot2/
[drwxr-xr-x root     root    ]  newroot2/
├── [drwxr-xr-x root     root    ]  usr
│   └── [drwxr-xr-x root     root    ]  bin
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-alternatives -> xbps-alternatives.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-alternatives.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-checkvers -> xbps-checkvers.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-checkvers.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-create -> xbps-create.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-create.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-dgraph -> xbps-dgraph.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-dgraph.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-digest -> xbps-digest.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-digest.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-fbulk -> xbps-fbulk.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-fbulk.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-fetch -> xbps-fetch.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-fetch.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-install -> xbps-install.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-install.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-pkgdb -> xbps-pkgdb.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-pkgdb.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-query -> xbps-query.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-query.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-reconfigure -> xbps-reconfigure.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-reconfigure.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-remove -> xbps-remove.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-remove.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-rindex -> xbps-rindex.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-rindex.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-uchroot -> xbps-uchroot.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-uchroot.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-uhelper -> xbps-uhelper.static
│       ├── [-rwxr-xr-x 2002     2000    ]  xbps-uhelper.static
│       ├── [lrwxrwxrwx 2002     2000    ]  xbps-uunshare -> xbps-uunshare.static
│       └── [-rwxr-xr-x 2002     2000    ]  xbps-uunshare.static
└── [drwxr-xr-x root     root    ]  var
    └── [drwxr-xr-x root     root    ]  db
        └── [drwxr-xr-x 2002     2000    ]  xbps
            └── [drwxr-xr-x 2002     2000    ]  keys
                ├── [-rw-r--r-- 2002     2000    ]  3d:b9:c0:50:41:a7:68:4c:2e:2c:a9:a2:5a:04:b7:3f.plist
                └── [-rw-r--r-- 2002     2000    ]  60:ae:0c:d6:f0:95:17:80:bc:93:46:7a:89:af:a3:2d.plist

Заметьте, что все «системные» каталоги вроде /usr или /var/db остались неизменёнными со своими изначальными владельцами и разрешениями. По факту того же результата можно достичь и с помощью tar.

$ (cd xbps-tools && find . | grep -v -e '^\.$' -e '^\./usr$' -e '^\./usr/bin$' -e '^\./var$' -e '^\./var/db$' | tar --verbatim-files-from -T - -cvf ../myxbps.tar)

Вот так я бы создавал подобные архивы с файлами для извлечения в корневую файловую систему.

▍ Заключение


Не нужно слепо извлекать архив, если вы не знаете, что конкретно он содержит. Это может оказаться фатальным для вашей системы.

Telegram-канал со скидками, розыгрышами призов и новостями IT ?

Комментарии (20)


  1. randomsimplenumber
    21.07.2024 09:11
    +52

    Тупо переписать системные файлы содержимым какого-то чужого архива - разве что-то может пойти не так?


    1. TIEugene
      21.07.2024 09:11
      +22

      Но виноват tar


      1. Viacheslav01
        21.07.2024 09:11
        +5

        Всегда виноват микрософт )))


    1. vkni
      21.07.2024 09:11
      +4

      Это он ещё известную строчку на Perl не запускал с sudo. Ждём статью через пару месяцев?