我对 Perl 中的 chown 函数的工作存在疑问。我有一个脚本:
#!/usr/bin/perl
$file = "";
$file = $ARGV[0];
$user = "jboss";
$group = "jboss";
if ($file eq "")
{
print "Syntax: $0 <file>\n";
exit 0;
}
@file = ($file);
print "Chowning the file $file to $user:$group\n";
$number = chown $user, $group, "$file";
print "Number of ownerships changed: $number\n";
exit 0;
SELinux 已启用并允许,但是:
root# ls -l file
-rw-r--r--. 1 root root 0 Jul 26 10:27 file
root# id -a jboss uid=666(jboss) gid=666(jboss) groups=666(jboss)
root# perlchown_file.pl file
Chowning the file file to jboss:jboss
Number of ownerships changed: 1
root# ls -l file
-rw-r--r--. 1 root root 0 Jul 26 10:27 file
问题:我在这里遗漏了什么?当然,您可以在此处写入 qx("/usr/bin/chown jboss:jboss "),但这里的重点是在此处使用更独立于平台的函数,而不是反引号
答案1
Perl 的chown
函数需要数字 uid/gid,而不是用户/组名。请参阅perldoc-f chown。
要从用户名中获取 uid 并从组名中获取 gid,可以使用如下getpwnam
和函数:getgrnam
my $uid = getpwnam $user_name;
my $gid = getgrnam $group_name;
chown $uid, $gid, $file_name;
答案2
如果你使用过,use warnings;
你会收到一条错误消息,抱怨:
参数“jboss”在 chown 中不是数字...
这会提示您需要 UID 和 GID,而不是用户和组。每个 Perl 脚本都以 和 开头总是一个好use warnings
主意use strict
。