【问题标题】:Perl | Archive::Tar | access denied after file extraction | preserve permissions珀尔 |存档::焦油 |文件提取后访问被拒绝|保留权限
【发布时间】:2014-01-23 06:58:05
【问题描述】:

我很难弄清楚为什么从 tar 文件中提取文件后无法打开文件。当我试图打开或读取刚刚从 tar 中提取的文件的内容时,我会收到“拒绝访问”错误消息。当我终于弄清楚我做错了什么时,我正要在 StackOverflow 上发布这个问题。以为我会为将来需要它的任何人发布问题和答案。简单的解决方案只需要使用 Perl Tar 之外的东西,但是 ...

~~~问题~~~

您提取 tar 文件的内容。如果您在尝试打开或读取刚从 tar 文件中提取的文件时收到拒绝访问消息,这可能是因为在 tar 文件/目录时未保留权限。

~~~解决方案~~~

如中所述:

http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES

默认情况下,Archive::Tar 将尝试对您的文件进行 chmod(权限混乱)。为了防止这种情况,您需要将以下全局变量设置为“0”:

$Archive::Tar::CHMOD = 0; #保留权限

~~~~~~~~~~~~~~~~

以下代码展示了如何在 perl 代码中使用全局变量(欢迎补充 cmets/suggestions/critiques)...

#folder structure:

# /cygdrive/c/00_backup_base  
#                |
#                |
#                +---- base
#                        |
#                        |
#                        +----00_TEST


#!/usr/bin/perl

use strict;   
use warnings 'all';   
use Archive::Tar;   
use File::Find;
use File::Copy;

my $ACID='/cygdrive/c/00_backup_base'; 
my $myTarFile='base_tar.gz';
my $testDir="00_TEST";
my $base='base';

# ----- ZIP DIRECTORY ----
  my @inventory = (); #array, store list of director contents
  chdir $ACID or die "chdir failed on $ACID\n";
  find (sub { push @inventory, $File::Find::name }, "$base");

  #_Create a new tar object
  $Archive::Tar::CHMOD = 0; # PRESERVE PERMISSIONS!
  my $tar = Archive::Tar->new();

  $tar->add_files( @inventory );

  # Write compressed tar file
  print " Create Zip file \n";
  $tar->write( "$myTarFile"); 
  chdir "../..";

# ----- EXTRACT FILES -----
  chdir $ACID;
  copy("${archive}", "${testDir}/${archive}"); 
  chdir ${testDir};

  # Now extract:
  $Archive::Tar::CHMOD = 0; # PRESERVE PERMISSIONS!
  my $tar_b = Archive::Tar->new();   
  $tar_b->read( $myTarFile );   
  $tar_b->extract();     

【问题讨论】:

    标签: perl permissions cygwin file-permissions tar


    【解决方案1】:

    在最初的帖子中回答了上述问题

    欢迎提出其他意见/建议/批评

    ~~~解决方案~~~

    如果您在尝试打开或读取刚从 tar 文件中提取的文件时收到拒绝访问消息,这可能是因为在 tar 文件/目录时未保留权限。

    如中所述:

    http://perldoc.perl.org/Archive/Tar.html#GLOBAL-VARIABLES

    默认情况下,Archive::Tar 会尝试对您的文件进行 chmod(权限混乱)。为了防止这种情况,您需要将以下全局变量设置为“0”:

    $Archive::Tar::CHMOD = 0; #保留权限

    【讨论】:

    • 请从您的问题帖子中删除答案
    • 我认为反之亦然。将 $Archive::Tar::CHMOD 设置为 '0' 将导致 NOT PRESERVE PERMISSION
    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多