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
}
答案 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文件。