每次有人通过 SSH 登录 Linux 系统时执行程序

每次有人通过 SSH 登录 Linux 系统时执行程序

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

现在,我该如何处理呢?

我希望每次任何人登录时都运行该脚本,并且我至少需要能够访问登录者的用户名以及该人登录的 IP 地址。

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

谢谢。

答案1

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

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

如果你想力量用户执行一个程序,并且只有一个程序,那么ForceCommandDigitalRoss 描述的选项就是一个很好的方法。(我个人会进一步限制用户使用强制访问控制系统如应用装甲SELinux知世, 或者,以确保程序不会让用户逃脱。我已经在 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.

这可以扩展到在auth、、和操作account上运行;可能最适合在登录时执行。只需添加如下一行:passwordsessionsession

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

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

答案2

OpenSSH 的新版本有一个名为部队指挥它将控制权交给脚本,而不是用户想要执行的操作(scp、ssh 等)。脚本会传递原始命令,因此您可以在执行完需要执行的操作后链接到该脚本。

来自 sshd_config(5):

部队指挥

强制执行 ForceCommand 指定的命令,忽略客户端提供的任何命令和 ~/.ssh/rc(如果存在)。使用带有 -c 选项的用户登录 shell 调用该命令。这适用于 shell、命令或子系统执行。它在 Match 块内最有用。客户端最初提供的命令在 SSH_ORIGINAL_COMMAND 环境变量中可用。指定“internal-sftp”命令将强制使用进程内 sftp 服务器,该服务器在与 ChrootDirectory 一起使用时不需要支持文件。

我曾经使用过它来覆盖 scp 并提供安全的 gem 上传功能,而无需为每个被授权上传 gem 的用户提供他们不需要或不想要的交互式访问权限。

答案3

一种方法是使用系统日志工具作为 syslog 守护程序,并将其配置为每次匹配某个日志条目(例如成功的 ssh 登录)时在后台运行脚本。

答案4

看一下这个:

http://ubuntuforums.org/showthread.php?p=9383927

我不认为有办法可以禁止它运行。有谁能验证一下吗?

相关内容