2009-02-24 7 views
2

J'utilise le module Archive::Tar de Perl. Il conserve les permissions sur les fichiers mais ne conserve pas le bit collant. À l'autre extrémité où j'extrais l'archive, tous les morceaux collants sont partis. Je pense que le système d'exploitation UNIX/LINUX stocke ces bits collants ailleurs. Comment puis-je faire en sorte que mes archives conservent également les bits collants?Comment conserver le bit setuid dans les archives tar avec Perl's Archive :: Tar?

L'utilisation du commutateur -p pour le conserver le conserve, mais comment le faire en utilisant Archive::Tar? J'utilise le module de Perl sur les deux côtés.

Répondre

4

Selon la Fine Source, Archive :: Tar :: File supprime les bits élevés du mode. Vous pouvez essayer la formule magique suivante au début de votre script (avant tout aurait fait référence Archive :: Tar) et voir si cela sape les fondements:

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

Brève explication: STRIP_MODE est une constante qui contient une sous-programme qui peut être passé le mode brut et retourne le mode qui devrait être stocké. Il est normalement réglé sur

sub { shift() & 0777 } 

Parce qu'il est une constante, importée d'Archive :: Tar :: Constant dans Archive :: Tar :: File et utilisé là, quoi que ce soit réglé sur sera inline dans Archive: : Tar :: Fichier tel qu'il est compilé. Donc, pour le changer, la constante doit être changée avant d'être inline, c'est-à-dire avant que Archive :: Tar :: File ne soit chargé.

N.B. Parce que changer une constante inlinable est sujet à l'erreur (la changer après qu'il est trop tard pour avoir un effet), il génère normalement un avertissement sévère qui ne peut pas être désactivé par des moyens habituels.

0

Je ne sais pas, mais la commande tar officielle, vous devez passer -p pour y arriver

-1

Vous pouvez jeter un oeil à la Archive::Tar documentation pour les détails. D'un bref coup d'œil, il semble que

$Archive::Tar::CHMOD = 1; 

devrait faire ce que vous voulez, même si la documentation prétend que le paramètre ci-dessus est la valeur par défaut. Il se peut que Archive :: Tar supprime les bits de mode d'ordre supérieur comme le bit collant.

L'archive est-elle créée et extraite avec Archive :: Tar ou utilisez-vous le programme tar standard à une extrémité ou à l'autre?

Questions connexes