例如,我想在 Ubuntu 服务器上秘密地在后台运行一个进程,但只要除我之外的任何人登录服务器,该进程就必须由该用户终止。是否可以创建这样的进程?(我有帐户sudo
并且可以修改/etc/bash.bashrc
)
谢谢!
答案1
请注意,以下内容可能会以各种方式危害您的系统安全。
创建一个脚本来负责终止您的进程(我们称之为进程 P)。然后授予所有用户在 sudoers 中运行此脚本的权限。最后在 中添加对此脚本的适当调用,并使用 sudo /etc/bashrc
。
举个例子,假设您知道您的进程是从哪里启动的/usr/local/sbin/myproc
,并且您想在有人登录后立即终止所有这些进程,因此您将使用简单的 grep 和 kill 策略来终止它们。
因此,首先将以下内容放入/usr/local/sbin/killmyprocs
:
#!/bin/sh
ps auxw|grep [m]yproc|awk '{ print $2 }'|xargs kill -TERM > /dev/null 2>&1
# end of file.
如果您真的继续并实施此操作,您可能希望做一些稍微复杂的事情。因此,请确保创建一个脚本,该脚本可以捕获适当的信号并以安全的方式执行操作。
/etc/sudoers
其次,通过添加以下内容授予所有用户运行此脚本的权限:
ALL ALL = (root) NOPASSWD: /usr/local/sbin/killmyprocs
第三步,也是最后一步,是在脚本中添加 sudo 调用/etc/bashrc
:
[ "`id -n -u`" != "<my_username>" ] && sudo /usr/local/sbin/killmyprocs
用您自己的帐户替换,以避免在您自己登录时终止您的“秘密”进程。
总结一下:1)创建一个不产生任何输出但会终止您想要终止的进程的脚本,2)/etc/sudoers
为系统上的每个用户添加适当的条目,以便能够以 root 身份执行该脚本,3)通过 sudo 向您的脚本添加调用/etc/bashrc
(或/etc/profile
)。
需要注意的是:(/etc/bashrc
或者/etc/profile
说)只为交互式 shell 获取源代码。这意味着用户可以轻松地执行 ssh yourhost 'ps auxw' 并从进程表中找到您的进程,它不会被上面介绍的机制杀死,因为没有参考 shell 初始化文件。有一种解决方法,ForceCommand
在 'sshd_config' 中使用,但这留给读者练习。
最后,我想再次提醒大家,这样做显然存在安全隐患。这听起来很像是试图在你没有完全访问权限的系统上安装后门,但这并不是我真正关心的问题(如果你不得不在超级用户上问这些问题,你很快就会被发现)。
答案2
你的意思是什么“该进程必须被该用户终止”?
A) 您想让用户终止他/她不拥有的进程吗?
编写一个脚本来终止该进程,然后设置 setuid chmod u+s
(除非您知道自己在做什么,否则这可能是一个巨大的安全漏洞。)
或者
B) 您希望该进程注意到用户登录并自行终止?
嗯,这就是你要做的。