Это короткая история о том, насколько опасной может оказаться обычная распаковка 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)
Вот так я бы создавал подобные архивы с файлами для извлечения в корневую файловую систему.
▍ Заключение
Не нужно слепо извлекать архив, если вы не знаете, что конкретно он содержит. Это может оказаться фатальным для вашей системы.
Автор: Дмитрий Брайт