Как сохранить бит setuid в архивах tar с помощью Perl's Archive :: Tar? - PullRequest
2 голосов
/ 24 февраля 2009

Я использую модуль Perl Archive :: Tar . Он сохраняет права доступа к файлу, но не сохраняет залипание. На другом конце, где я извлекаю архив, все липкие биты исчезли. Я думаю, что операционная система UNIX / LINUX хранит эти липкие биты где-то еще. Как я могу сделать так, чтобы мой архив сохранил липкие биты?

Использование параметра -p для tar сохраняет его, но как мне это сделать, используя Archive :: Tar ? Я использую модуль Perl с обеих сторон.

Ответы [ 3 ]

4 голосов
/ 24 февраля 2009

Согласно Fine Source, Archive :: Tar :: File удаляет старшие биты из режима. Вы можете попробовать следующее магическое заклинание в начале вашего сценария (перед чем-либо мог ссылаться на Archive :: Tar) и посмотреть, не нарушит ли это:

use Archive::Tar::Constant ();
BEGIN {
    local $SIG{__WARN__} = sub{};
    *Archive::Tar::Constant::STRIP_MODE = sub(){ sub {shift} };
}
...
use Archive::Tar;
...

Краткое объяснение: STRIP_MODE - это константа, которая содержит подпрограмму, которую можно передать в необработанном режиме, и возвращает режим, который должен быть сохранен. Обычно он установлен на

sub { shift() & 0777 }

Поскольку это константа, импортированная из Archive :: Tar :: Constant в Archive :: Tar :: File и используемая там, все, что ей задано, будет встроено в Archive :: Tar :: File при компиляции , Таким образом, чтобы изменить его, необходимо изменить константу до того, как она будет встроена, то есть до того, как будет загружен Archive :: Tar :: File.

N.B. Поскольку изменение встраиваемой константы подвержено ошибкам (изменение после того, как станет слишком поздно, чтобы иметь какой-либо эффект), обычно оно выдает серьезное предупреждение, которое нельзя отключить обычными средствами.

0 голосов
/ 24 февраля 2009

Вы можете взглянуть на документацию Archive :: Tar для подробностей. Краткий взгляд показывает, что

$Archive::Tar::CHMOD = 1;

должен делать то, что вы хотите, хотя в документации утверждается, что вышеуказанная настройка является настройкой по умолчанию. Возможно, что Archive :: Tar удаляет биты старшего порядка, такие как бит закрепления.

Архив создается и извлекается с помощью Archive :: Tar, или вы используете стандартную программу tar на одном конце или на другом?

0 голосов
/ 24 февраля 2009

Не уверен, но в официальной команде tar вам нужно передать -p , чтобы это произошло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...