You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让OpenSSH的sftp-server仅在SFTP连接时返回指定提示信息

如何让OpenSSH的sftp-server仅在SFTP连接时返回指定提示信息

我太懂你这个需求了——就想给SFTP用户弹个停用提示,但是SSH正常登录的时候绝对不能跳出来,之前改shell脚本没成功?那大概率是输出时机或者命令执行的姿势不对,给你两个亲测有效的方案:

方案一:通过Subsystem直接配置(全局生效,最简单)

直接修改OpenSSH的子系统配置,把SFTP的启动命令改成先输出提示再启动sftp-server就行。步骤如下:

  1. 先找到你系统里sftp-server的实际路径,执行命令:
which sftp-server

一般Ubuntu/Debian是/usr/lib/openssh/sftp-server,CentOS/RHEL是/usr/libexec/openssh/sftp-server。

  1. 打开/etc/ssh/sshd_config,找到原来的Subsystem sftp行,替换成下面的内容(把路径换成你刚才查到的):
Subsystem sftp /bin/sh -c 'echo "SFTP access will be shutdown soon" >&2; exec /usr/lib/openssh/sftp-server'
  1. 重启sshd服务:
# 不同系统命令略有不同
systemctl restart sshd
# 或者
service ssh restart

这个方案的好处是完全不影响SSH登录,只有当用户发起SFTP连接时,才会先把提示输出到STDERR,然后正常启动sftp-server。

方案二:用ForceCommand针对特定用户/组(精细化控制)

如果只想给部分用户/组弹提示,不想全局生效,就用这个方法:

  1. 先写一个控制脚本,比如/usr/local/bin/sftp-warning.sh,内容如下:
#!/bin/bash
# 判断当前是不是SFTP连接请求
if [[ "$SSH_ORIGINAL_COMMAND" == *sftp-server* ]]; then
    # 把提示输出到STDERR
    echo "SFTP access will be shutdown soon" >&2
    # 用exec接管进程,保证提示能传递到客户端
    exec $SSH_ORIGINAL_COMMAND
else
    # 普通SSH登录,直接进入用户的默认shell
    exec "$SHELL"
fi
  1. 给脚本加执行权限:
chmod +x /usr/local/bin/sftp-warning.sh
  1. 修改/etc/ssh/sshd_config,添加针对特定用户或组的匹配规则:
# 比如给用户sftpuser单独设置
Match User sftpuser
    ForceCommand /usr/local/bin/sftp-warning.sh
    # 保留原来的SFTP相关配置(如果有的话)
    # Subsystem sftp internal-sftp

如果要给整个组生效,就把Match User改成Match Group sftpgroup。

  1. 同样重启sshd服务生效。

为什么之前的脚本没起效?

你之前改用户shell的时候,可能没用到exec来执行sftp-server,导致输出的提示没有被正确转发到客户端的STDERR。上面两个方案里都用了exec,相当于把当前进程替换成sftp-server,这样之前的echo输出会直接传递给客户端。

现在测试一下:用sftp命令连接,应该能看到你要的提示;用ssh登录,完全不会有额外信息,完美符合你的要求~

备注:内容来源于stack exchange,提问作者oᴉɹǝɥɔ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 07:22:58