每次有人通过 SSH 登录到 Linux 机器时执行程序

hou*_*oft 10 linux ssh bash

我有一个小型 SSH 服务器,我想编写一个脚本,以便在每次有人通过 SSH 登录时运行。

现在,我该怎么办?

我希望脚本在每次 ANYBODY 登录时都运行,并且我至少需要访问登录者的用户名和登录者的 IP 地址。

我考虑过使用/etc/bash.bashrc,但这是一个好的解决方案吗?例如,有没有办法让用户禁用它的使用,从而禁用我的脚本?如果是,我的其他选择是什么?

谢谢。

sar*_*old 12

要使用的机制取决于您的目标。

如果您希望为您的用户提供方便友好的东西,那么/etc/profile如果您的所有用户都使用相同的 shell ,那么您就足够合理了。如果您希望命令在通过 登录时执行ssh,请将命令放入/etc/ssh/sshrc. (如果您不介意用户用他们自己的~/.ssh/rc文件覆盖命令。)

如果您想强制用户执行一个程序,并且只执行一个程序,那么ForceCommandDigitalRoss 描述的选项是一个很好的方法。(我个人会通过强制访问控制系统进一步限制用户,例如AppArmorSELinuxTOMOYOSMACK,以确保程序不会让用户逃脱。我在 AppArmor 上工作了十年,所以这就是我会首先选择工具,但其他都是由优秀程序员编写的优秀工具。)

如果您只想执行一个程序而不以任何方式打扰用户,那么最好的方法是使用该pam_exec(8)模块,该模块无法绕过,无论 shell 都可以工作,并且提供以用户或用户身份运行的轻松能力执行授权的程序的帐户。手册页给出了以下示例:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.
Run Code Online (Sandbox Code Playgroud)

这可以扩展到运行authaccountpassword,和session行动; 可能session最适合在登录时执行。只需添加如下一行:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd
Run Code Online (Sandbox Code Playgroud)

到您的/etc/pam.d/sshd控制文件。

  • 注意,如果您执行的命令以非零退出代码退出,您的登录将失败,您可能会被锁定。解决这个问题的一种方法是确保有另一个“会话可选”,用不同的模块调用总是成功。 (2认同)