如何在没有 root 或 sudoer 的情况下终止以不同用户启动的进程?

21 linux sudo kill

在 Linux 环境中,如果我是 user1 而不是 sudoers 或使用 root,我需要终止一个由 user2 启动的进程。您知道在启动进程时是否有设置方法吗?比如允许杀死进程的用户列表?

事实是同一个进程的并发实例可以从不同的用户启动,这就是为什么我不方便为进程设置组ID。不在该组中的其他用户将无法启动第二个并行进程。

我有一个允许启动进程的用户列表,在数据库中定义,在启动进程之前,我检查列表中的当前用户,如果是,我用当前用户启动进程。如果允许这样做的第二个用户想要终止进程,我希望它被允许这样做,但我不希望它成为 sudoers。

因此,我想创建一个以 root 身份运行的进程,它接收来自用户的终止进程的请求,检查是否允许用户启动/停止进程并终止进程。

你认为这可能是最好的解决方案吗?

Tim*_*ost 14

对不起,但这根本不可能(这是设计使然)。但是,如果是公共组的成员,user1 可以写入 user2 的进程检查的文件,向进程指示它应该终止。

或者,user2 可以在后台运行一些检查文件的东西,然后发送适当的信号。User1 然后只需写入该文件。这可能更容易,因为它不需要对 user2 的程序进行任何修改。

按照惯例,不,user1 不能向 user2 的进程发送 POSIX 信号。


小智 9

除非 ACL 或 SELinux 或其他东西有更好的方法来做到这一点,否则我看到的方法是使用SetUID脚本。可以想象,它们因存在安全风险而臭名昭著。

关于您的情况,假设 procOwner 是进程所有者的用户名,而 userA (uid 1000)、userB (uid 1201) 和 userC (uid 1450) 是允许终止进程的人。

killmyproc.bash:

#!/bin/bash
case ${UID} in
1000|1201|1450) ;;
*) echo "You are not allowed to kill the process."
   exit 1;;
esac

kill ${PROCESS_ID}
# PROCESS_ID could also be stored somewhere in /var/run.
Run Code Online (Sandbox Code Playgroud)

然后设置所有者和权限:

chown procOwner:procGroup killmyproc.bash
chmod 6750 killmyproc.bash
Run Code Online (Sandbox Code Playgroud)

并将 userA、userB 和 userC 放入组中procGroup


Kon*_*rak 1

不,你不能。

如果您想与其他用户共享进程,您应该在公共用户 ID 下启动该进程。