3

我想让普通用户杀死某个由 root 用户启动的应用程序。

在 visudo 中:

我添加了这样的一行:

normal_user ALL=(ALL) NOPASSWD: /usr/bin/kill $(ps aux | grep 'target_application' | awk '{print $2}')

但是在保存它并以 normal_user 身份执行以下命令后,我仍然得到 root 密码的提示:

sudo /usr/bin/kill $(ps aux | grep 'target_application' | awk '{print $2}')

那我该怎么办?非常感谢!

4

1 回答 1

5

sudo 不会将该命令解释为要执行的 shell 脚本。因此,您说过这个文字命令可以作为 normal_user 运行:

/usr/bin/kill $(ps aux | grep 'target_application' | awk '{print $2}')

但是,由于 shell 会解释$(...)调用 sudo 之前的内容,因此您正在运行的命令看起来更像这样:

sudo /usr/bin/kill 1234

所以它不允许你使用它。

正如 fedorqui 所建议的,您应该编写一个杀死用户的脚本,然后授予 normal_user 运行该脚本的权限(但要确保他们没有对该脚本或其目录的写入权限)。

kill_target_application.sh:

#!/bin/sh
/usr/bin/kill $(ps aux | grep 'target_application' | awk '{print $2}')

使用此命令允许用户执行或读取脚本,但不能修改它:

chown root:root <filename>
chmod 755 <filename>

所有用户的 give (r)ead 和 e(x)ecute 权限,但只有 root 可以修改它。还要确保用户没有对该目录或其任何父目录的写入权限。如果您不熟悉这些实用程序,请在执行此操作之前阅读 chown 和 chmod 手册页。

visudo 条目:

normal_user ALL=(ALL) NOPASSWD: /path/to/kill_target_application.sh

您可能应该使用“killall”而不是这个复杂的 ps | grep 选项。或者至少看看 pgrep。

此外,这听起来确实像是一个初始化脚本的工作。

于 2013-08-21T14:21:49.710 回答