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


10

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

现在,我将如何处理?

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

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

谢谢。


当然,这仅在用户使用bash时有效。如果用户可以选择自己的外壳,它将不起作用。
圣保罗Ebermann

Answers:


12

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

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

如果要强制用户执行一个程序,而只能执行一个程序,则ForceCommandDigitalRoss描述的选项是一种很好的方法。(我个人将进一步使用AppArmorSELinuxTOMOYOSMACK之类的强制性访问控制系统来限制用户,以确保该程序不能让用户逃脱。我在AppArmor上已经工作了十年,所以我会首先选择的工具,但其他都是优秀程序员编写的优秀工具。)

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

   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.

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

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

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


看起来该pam_exec模块正是我要的。谢谢!
houbysoft 2011年

2
注意,如果您执行的命令以非零退出代码退出,则登录将失败,您可能会被锁定。解决此问题的一种方法是确保使用另一个始终成功的模块调用另一个“会话可选”。
gflarity

4

最新版本的OpenSSH具有称为ForceCommand的服务器功能,该功能可以控制脚本,而不是用户想要的操作(scp,ssh等)。该脚本是通过原始命令传递的,因此您可以在完成所需的操作后将其链接到该脚本。

从sshd_config(5):

ForceCommand

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

我曾经用它来覆盖scp并提供安全的gem上载,而不给每个有权上载gem的用户提供他们不需要或不需要的交互式访问。


3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.