有没有可能我可以执行脚本,比如说abc.sh
;root
用户每次通过 SSH 登录我的系统时?
我经历过类似的问题意思是将脚本执行添加到.bashrc
文件中。这没什么用,因为我必须将其添加到每个用户的配置文件中。而且,他们仍然可以删除它。
以 root 身份执行并不像拒绝用户停止执行的权力那么重要。操作系统是 debian,如果这有任何帮助的话。
答案1
这是一个迟来的答案,但您可以在每次登录时执行它并让它以 root 身份(或您想要的任何其他用户)运行,方法是执行以下操作:
- 使用您想要以 root 身份运行的命令编写脚本,然后将其保存为
/path/to/root-script.sh
。 让 root(或所需的用户)成为脚本的所有者。
chown root:root /path/to/root-script.sh`
在脚本上设置 setuid 位,并使用其他所需权限。(确保它不是通用可写的等等)
chmod 4755 /path/to/root-script.sh
该
4
方法设置 setuid 位,这将导致脚本以脚本所有者的身份运行。这就是sudo
确保以 root 身份执行的方法。root-script.sh
为了确保每次登录时都运行它,请从 内部运行 sticky-bit-set/etc/profile
。/etc/profile
无论用户使用什么 shell,都应该运行。但请注意,这仅适用于交互式登录。
编辑。正如 Scott 在评论中指出的那样,此解决方案通常不适用于任何现代系统,除非 Perl < 5.12.0 版本包含任何 shebang 脚本。除非已修补,否则现代内核会忽略带有 setuid 位的脚本,出于安全原因,我们不建议这样做。
相反,setuid 通常只适用于已编译的二进制文件和 [旧版本的 Perl][https://stackoverflow.com/questions/21597300/can-i-setuid-for-perl-script]
可以使用 (Perl <5.12.0) suidperl
。
这个 Unix/Linux SE 问题对为什么 setuid 会被 shebang 脚本忽略有详尽的回答,并附有总结性的 TL;DR:
Setuid shebang 不安全,但通常会被忽略。如果您以特权运行程序(通过 sudo 或 setuid),编写本机代码或 perl,或者使用清理环境的包装器启动程序(例如带有 env_reset 选项的 sudo)。
答案2
OpenSSH 支持ForceCommand
配置变量,该变量可以设置为脚本的路径名,
- 做某事行政的— 详情请参阅下文。
呼叫
$(SHELL) -c "$SSH_ORIGINAL_COMMAND"
或者
eval "$SSH_ORIGINAL_COMMAND"
之后才真正执行用户想要执行的任务。
现在的问题是强制命令是使用登录用户的凭据执行的。为了解决这个问题,使用某种 IPC 与以 root 身份运行的守护进程进行通信就足够了。 Unix 域套接字对我来说似乎是最好的选择,因为它实际上允许在实际数据交换发生之前传输凭据(通过使用调用getsockopt(SO_PREERCRED)
)。缺点是你必须编写一对工具来做到这一点(好吧,客户端部分可以由socat
)。
也可以看看此主题。
答案3
您可以将调用添加到 /etc/bash.bashrc - 这将在每次 Bash 登录时处理,因此假设您的用户使用 Bash 作为他们的 shell,它应该运行该脚本。