
Это короткая история о том, насколько опасной может оказаться обычная распаковка 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 💻

