Answers:
使用的机制取决于您的目标。
如果您希望为用户提供方便或友好的服务,那么/etc/profile如果所有用户都使用相同的外壳程序,您就足够合理了。如果要仅在通过via登录时才执行ssh命令,请将命令放入中/etc/ssh/sshrc。(如果您不介意用户使用他们自己的~/.ssh/rc文件覆盖命令。)
如果要强制用户执行一个程序,而只能执行一个程序,则ForceCommandDigitalRoss描述的选项是一种很好的方法。(我个人将进一步使用AppArmor,SELinux,TOMOYO或SMACK之类的强制性访问控制系统来限制用户,以确保该程序不能让用户逃脱。我在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.
这可以扩展到运行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控制文件。
pam_exec模块正是我要的。谢谢!
最新版本的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的用户提供他们不需要或不需要的交互式访问。
/etc/profile或~/.profile)取决于用户的外壳,仅比少一点bashrc。如果您的用户正在使用bash或类似工具,则可以。