ForceCommand 通过 SSH 配置强制用户执行预设安全脚本,需在 sshd_config 中用绝对路径配置,配合 Match 精准限制用户/组,并确保脚本校验环境、禁用危险操作、限定文件路径、显式设置 PATH、记录日志,按需控制 TTY 和转发功能。

用 ForceCommand 限制用户只运行安全脚本,核心是让 SSH 登录后跳过 shell,直接执行你预设的、可控的脚本——这个机制由 OpenSSH 原生支持,不依赖额外工具,但配置细节决定成败。
配置位置与基础语法
编辑 /etc/ssh/sshd_config,在全局段或 Match 块中添加:
- 全局生效(慎用):
ForceCommand /usr/local/bin/safe-handler.sh - 推荐按用户限制:
Match User appuser<br>ForceCommand /usr/local/bin/appuser-guard.sh
注意:路径必须是绝对路径;脚本需有可执行权限(chmod +x);SSH 以登录用户身份运行脚本,不是 root(除非脚本内显式提权)。
脚本本身要真正“安全”
仅靠 ForceCommand 不等于安全。脚本需主动防御常见风险:
- 开头校验环境:检查
$USER、$HOME是否符合预期,拒绝异常值 - 禁用危险操作:不调用
eval、不拼接未过滤的参数、不执行system()类函数 - 最小权限原则:读写文件时限定路径(如只允许
/opt/appdata/$USER/),避免遍历 - 显式设置
PATH,避免意外调用系统同名恶意程序 - 记录关键动作到独立日志(如
/var/log/forcecmd.log),含时间、用户、命令参数
控制会话行为:要不要终端?
根据用途决定是否分配伪终端(TTY):
- 纯后台任务(如定时备份、API 触发):加
PermitTTY no,防止用户强行申请交互界面 - 需要交互式输出(如菜单式操作):保留 TTY,但脚本末尾若需返回 shell,必须用
exec /bin/bash -l—— 不加exec会导致子进程残留,连接可能卡死或泄漏资源 - 只允许 SFTP:脚本里写
exec /usr/lib/openssh/sftp-server或更优的exec internal-sftp
配合 Match 实现精准隔离
避免影响管理员账号,用 Match 精确锁定目标:
Match Group deployers<br>ForceCommand /opt/scripts/deploy-check.sh<br>PermitTTY no
Match User monitor-bot<br>ForceCommand /usr/local/bin/health-ping.sh<br>X11Forwarding no<br>AllowTcpForwarding no
每条 Match 块结束后,配置自动恢复默认值,不会污染其他用户。
改完配置务必重启服务:sudo systemctl restart sshd。测试前先手动运行脚本,确认权限、路径、日志写入都正常;再用 ssh -v user@host 查看协商过程,从 /var/log/auth.log 验证是否触发了 ForceCommand。

















