软件能够包装gzip / gunzip来保存文件所有权吗?

时间:2015-12-27 00:34:11

标签: linux perl unit-testing

发现gzip / gunzip会更改inode编号,因此如果由其他所有者打开,则不会保留所有权。

soluion posted by OP since thread is closed prematurely

Here is the solution to keep ownership, if anyone interested.

I modified the procedures, it passed the current basic tests.

# the original file information
ok 1 - /shared/shared/colourbar.nii.gz Found
ok 2 - /shared/shared/colourbar.nii.gz -- fileowner <504>
ok 3 - /shared/shared/colourbar.nii.gz -- inode <692254>

# copy file to /tmp, processed by uid 500
***cp -vf /shared/shared/colourbar.nii.gz /tmp
`/shared/shared/colourbar.nii.gz' -> `/tmp/colourbar.nii.gz'
***gunzip -f /tmp/colourbar.nii.gz
***gzip -f /tmp/colourbar.nii
ok 4 - /tmp/colourbar.nii.gz -- fileowner <500>
ok 5 - /tmp/colourbar.nii.gz -- inode <31>


# copy back to overwrite, and the ownership preserved
***cp -vf /tmp/colourbar.nii.gz /shared/shared
`/tmp/colourbar.nii.gz' -> `/shared/shared/colourbar.nii.gz'
ok 6 - /shared/shared/colourbar.nii.gz -- fileowner <504>
ok 7 - /shared/shared/colourbar.nii.gz -- inode <692254>

由于gzip / gunzip实用程序中的功能,单元测试失败。 关于gzip / gunzip的讨论已经结束了,我想进一步推进

真正的问题需要一个真正的解决方案。 我们可以在test6上找到相同的文件所有者吗?

原所有者拥有uid 500,通过所有单元测试

ok 1 - /shared/shared/colourbar.nii.gz Found
ok 2 - original fileowner <500>
ok 3 - original inode<692254>
gunzip -f /shared/shared/colourbar.nii.gz
ok 4 - fileowner after gunzip <500>
ok 5 - inode after gunzip<692255>
gzip -f /shared/shared/colourbar.nii
ok 6 - fileowner after gzip <500>
ok 7 - inode after gzip<692254>

乔有504的uid,测试6失败

ok 1 - /shared/shared/colourbar.nii.gz Found
ok 2 - original fileowner <500>
ok 3 - original inode<692254>
gunzip -f /shared/shared/colourbar.nii.gz
not ok 4 - fileowner after gunzip <504>
ok 5 - inode after gunzip<692255>
gzip -f /shared/shared/colourbar.nii
not ok 6 - fileowner after gzip <504>
ok 7 - inode after gzip<692254>

原始测试脚本在这里:

#!/usr/bin/perl
use strict;
use warnings;
use Test::More ;
return 1  unless $0 eq __FILE__;
main(@ARGV) if $0 eq __FILE__;
sub mock_gzip{
    my $file = $_[0];
    my $cmd = "gzip -f $file";
    print "$cmd\n";
    system($cmd);
}
sub mock_gunzip{
    my $file = $_[0];
    my $cmd = "gunzip -f $file";
    print "$cmd\n";
    system($cmd);
}
sub fileowner{
    my $file = $_[0];
    my $uid = `stat -c %u $file`;
    chomp($uid);
    return $uid;
}
sub get_inode{
    my $file =$_[0];
    my $inode = `stat -c %i $file`;
    chomp($inode);
    return  $inode;
}
sub main{
    #simulate real life situation - user A
    my $file = "/shared/shared/colourbar.nii.gz";
    my $fileu = $file;
    $fileu =~ s/.gz$//g;
    ok(-e $file,"$file Found\n");
    my $fileowner = fileowner($file);
    ok($fileowner>0,"original fileowner <$fileowner>\n");
    my $inode  = get_inode($file);
    ok($inode>0,"original inode<$inode>\n");

    # user B - gunzip/gzip owner changed
    mock_gunzip($file);
    my $fileowner_gunzip = fileowner($fileu);
    ok($fileowner_gunzip==$fileowner,"fileowner after gunzip <$fileowner_gunzip>\n");
    my $inode_gunzip  = get_inode($fileu);
    ok($inode_gunzip>0,"inode after gunzip<$inode_gunzip>\n");

    mock_gzip($fileu);
    my $fileowner_gzip = fileowner($file);
    ok($fileowner_gzip==$fileowner,"fileowner after gzip <$fileowner_gzip>\n");
    my $inode_gzip  = get_inode($file);
    ok($inode_gzip==$inode,"inode after gzip<$inode_gzip>\n");

    # solution, or verified no solution to be decided

}

2 个答案:

答案 0 :(得分:1)

当您压缩文件时,您将创建一个新文件,该文件由当前用户拥有。使用-i选项显示文件的inode。

  

罗伯特:〜&GT;触摸测试

     

罗伯特:〜&GT; ls -li test

     

93644038 -rw-r - r-- 1罗伯特员工0月26日20:42测试

如果您拉链到位,旧文件会被删除,所以看起来它可能会替换该文件,但事实上它确实创建了一个新文件。

  

罗伯特:〜&GT; gzip测试

     

罗伯特:〜&GT; ls -li test *

     

93644048 -rw-r - r-- 1罗伯特员工25 12月26日20:42 test.gz

解压缩时,您还可以再次创建新文件,由当前用户拥有。

  

罗伯特:〜&GT; gunzip test.gz

     

罗伯特:〜&GT; ls -li test *

     

93644052 -rw-r - r-- 1罗伯特员工0月26日20:42测试

所以你的错误是假设它是同一个文件,它不是 - 请注意ls输出开头的inode编号变化。如果它试图使用相同的inode,它会对具有多个文件的归档做什么?

如果您只是重命名该文件,则它是相同的文件并保留所有权:

  

罗伯特:〜&GT; sudo mv test重命名

     

罗伯特:〜&GT; ls -li重命名

     

93644052 -rw-r - r-- 1 robert staff 0 Dec 26 20:42更名

追加(更改内容)相同:

  

罗伯特:〜&GT; sudo echo ...&gt;&gt;重命名

     

罗伯特:〜&GT; ls -li重命名

     

93644052 -rw-r - r-- 1罗伯特员工4月26日20:51更名

有关inode的详细信息,请参阅Wikipedia on inodes

答案 1 :(得分:1)

gzip格式不保留所有者。此外,只有root可以将文件的所有权设置为其他用户。

您可以使用tar记录文件的所有者以及文件内容:

:; echo hello > sym2.txt
:; ls -l sym2.txt
-rw-r--r--  1 mayoff  staff  6 Dec 26 20:46 sym2.txt
:; tar cvzf sym2.tar.gz sym2.txt 
a sym2.txt
:; tar tvf sym2.tar.gz
-rw-r--r--  0 mayoff staff       6 Dec 26 20:46 sym2.txt

要提取tar文件并保留所有权,您需要以root身份执行此操作:

sudo tar xvf sym2.tar.gz

或者,您可以在应该拥有提取文件的用户运行时提取tar文件。