我有Redhat
6.3,我想启用、和sudo
的命令,因此在 root 用户下我执行了以下操作:chown
kill
chmod
visudo
#add the following line
aabuhasna ALL=(ALL) NOPASSWD: /usr/bin/kill, /bin/chmod, /bin/chown
基于添加的行,用户aabuhasna
可以执行chmod
, 以及chown
任何目录或文件,但我想限制一个目录,例如,如果我使用该命令,chown aabuhasna:aabuhasna /test_dir/*
它可以工作,但如果我使用chown aabuhasna:aabuhasna /opt/*
它失败,则同样适用于chmod
.
答案1
sudo 命令中的通配符有点冒险。他们可能看似为您提供安全保障,但实际上却没有这样做。至sudo
,*
并不意味着“此目录下的任何文件”,就像在 shell 中一样。相反,它意味着“任何附加选项”并且必须独立。不幸的是,您不能在 sudo 中限制部分参数,而且,它也不安全(因为用户可以指定../../
哪个会破坏您的意图)。
因此,您要做的就是:编写一个脚本来仔细验证命令行参数并确保它们不包含诸如../
.然后该脚本将包含在用户的 sudo 中。还有一点:在这种情况下 bash 是一个糟糕的选择,因为恶意用户可以通过多种方式破坏您的意图。所以这是一个我已经测试过的 perl 示例,应该适合您的需求(定制后,并替换echo
为空字符串)。
#!/usr/bin/perl -w
my $user = "aabuhasna";
my $group = "aabuhasna";
my $prefix = "/test_dir";
$mode=shift @ARGV or die "Please provide a mode for the new file";
die "Invalid chmod input: $mode" unless $mode =~ /^[0-9]+$/;
$mode = oct($mode);
die "Invalid permissions in mode: $mode" if $mode != ($mode & 0777);
my $uid = (getpwnam($owner))[2] or die "Unknown user: $user";
my $gid = (getpwnam($group))[2] or die "Unknown group: $group";
foreach (@ARGV) {
die "Invalid Directory Argument: $_" if m:\.\./:;
next if -l $prefix."/".$_;
push @files,$prefix."/".$_;
}
die "No files specified!" unless @files;
chmod $mode, @files;
chown $uid, @gid, @files;
该脚本的 sudo 条目,假设您输入的内容/usr/local/bin/changemodeowner
很简单:
aabuhasna ALL=(ALL) NOPASSWD: /usr/local/bin/changemodeowner
这里不需要*
。