每次 ssh 登录时以 root 身份执行脚本

每次 ssh 登录时以 root 身份执行脚本

有没有可能我可以执行脚本,比如说abc.shroot用户每次通过 SSH 登录我的系统时?

我经历过类似的问题意思是将脚本执行添加到.bashrc文件中。这没什么用,因为我必须将其添加到每个用户的配置文件中。而且,他们仍然可以删除它。

以 root 身份执行并不像拒绝用户停止执行的权力那么重要。操作系统是 debian,如果这有任何帮助的话。

答案1

这是一个迟来的答案,但您可以在每次登录时执行它并让它以 root 身份(或您想要的任何其他用户)运行,方法是执行以下操作:

  1. 使用您想要以 root 身份运行的命令编写脚本,然后将其保存为/path/to/root-script.sh
  2. 让 root(或所需的用户)成为脚本的所有者。

    chown root:root /path/to/root-script.sh`
    
  3. 在脚本上设置 setuid 位,并使用其他所需权限。(确保它不是通用可写的等等)

    chmod 4755 /path/to/root-script.sh
    

    4方法设置 setuid 位,这将导致脚本以脚本所有者的身份运行。这就是sudo确保以 root 身份执行的方法。

  4. 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配置变量,该变量可以设置为脚本的路径名,

  1. 做某事行政的— 详情请参阅下文。
  2. 呼叫

    $(SHELL) -c "$SSH_ORIGINAL_COMMAND"
    

    或者

    eval "$SSH_ORIGINAL_COMMAND"
    

    之后才真正执行用户想要执行的任务。

现在的问题是强制命令是使用登录用户的凭据执行的。为了解决这个问题,使用某种 IPC 与以 root 身份运行的守护进程进行通信就足够了。 Unix 域套接字对我来说似乎是最好的选择,因为它实际上允许在实际数据交换发生之前传输凭据(通过使用调用getsockopt(SO_PREERCRED))。缺点是你必须编写一对工具来做到这一点(好吧,客户端部分可以由socat)。

也可以看看此主题

答案3

您可以将调用添加到 /etc/bash.bashrc - 这将在每次 Bash 登录时处理,因此假设您的用户使用 Bash 作为他们的 shell,它应该运行该脚本。

相关内容