如何让OpenSSH的sftp-server仅在SFTP连接时返回指定提示信息
如何让OpenSSH的sftp-server仅在SFTP连接时返回指定提示信息
我太懂你这个需求了——就想给SFTP用户弹个停用提示,但是SSH正常登录的时候绝对不能跳出来,之前改shell脚本没成功?那大概率是输出时机或者命令执行的姿势不对,给你两个亲测有效的方案:
方案一:通过Subsystem直接配置(全局生效,最简单)
直接修改OpenSSH的子系统配置,把SFTP的启动命令改成先输出提示再启动sftp-server就行。步骤如下:
- 先找到你系统里sftp-server的实际路径,执行命令:
which sftp-server
一般Ubuntu/Debian是/usr/lib/openssh/sftp-server,CentOS/RHEL是/usr/libexec/openssh/sftp-server。
- 打开
/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'
- 重启sshd服务:
# 不同系统命令略有不同 systemctl restart sshd # 或者 service ssh restart
这个方案的好处是完全不影响SSH登录,只有当用户发起SFTP连接时,才会先把提示输出到STDERR,然后正常启动sftp-server。
方案二:用ForceCommand针对特定用户/组(精细化控制)
如果只想给部分用户/组弹提示,不想全局生效,就用这个方法:
- 先写一个控制脚本,比如
/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
- 给脚本加执行权限:
chmod +x /usr/local/bin/sftp-warning.sh
- 修改
/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。
- 同样重启sshd服务生效。
为什么之前的脚本没起效?
你之前改用户shell的时候,可能没用到exec来执行sftp-server,导致输出的提示没有被正确转发到客户端的STDERR。上面两个方案里都用了exec,相当于把当前进程替换成sftp-server,这样之前的echo输出会直接传递给客户端。
现在测试一下:用sftp命令连接,应该能看到你要的提示;用ssh登录,完全不会有额外信息,完美符合你的要求~
备注:内容来源于stack exchange,提问作者oᴉɹǝɥɔ
相关产品推荐
相关产品推荐

