我有一个小型 SSH 服务器,我想编写一个脚本,在每次有人通过 SSH 登录时运行。
现在,我该如何处理呢?
我希望每次任何人登录时都运行该脚本,并且我至少需要能够访问登录者的用户名以及该人登录的 IP 地址。
我考虑过使用/etc/bash.bashrc
,但这是一个好的解决方案吗?例如,用户是否可以禁用它的使用,从而禁用我的脚本?如果可以,我还有什么其他选择?
谢谢。
答案1
使用的机制取决于您的目标。
如果你想提供一些东西方便的或者友好的对于您的用户,/etc/profile
如果所有用户都使用相同的 shell,那么您的设置就足够合理了。如果您希望命令执行仅有的通过 登录时ssh
,将命令放入/etc/ssh/sshrc
。 (如果您不介意用户用自己的~/.ssh/rc
文件覆盖命令。)
如果你想力量用户执行一个程序,并且只有一个程序,那么ForceCommand
DigitalRoss 描述的选项就是一个很好的方法。(我个人会进一步限制用户使用强制访问控制系统如应用装甲,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
上运行;可能最适合在登录时执行。只需添加如下一行:password
session
session
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 登录)时在后台运行脚本。