如何在不重新加载服务的情况下暂时禁用sftp?

我build立了一个使用chroot的用户,通过sshd的sftp只能访问一个目录,这样我的一个同事就可以上传某些types的文件。 然后,我将要通过HTTP触发一个命令,这个命令将对这些文件运行一个很长的过程,并且我需要在进程运行时禁用sftp。

有没有我可以用来禁用SFTP的命令,而不必更改sshd_config文件并重新加载服务? 我正在考虑做端口阻塞,但我仍然需要访问SSH。

我读了有关禁用用户帐户passwd -l ,但如果它已经通过SFTPlogin它仍然会允许修改。

有什么build议么?

编辑:

经过更多的涉猎,我发现我可以做ps -axl | grep $user@notty ps -axl | grep $user@notty然后发送一个kill -9给PID,以断开用户与当前会话的连接,然后执行passwd -l username以防止用户再次login,或者按照Martin的build议删除符号链接到sftp-server二进制文件。

但最后我采取了Mike的build议,只是将文件移动到其他位置,而不是在chroot目录中运行进程。

您可以暂时删除该文件夹的写入权限。


如果要完全禁用SFTP,则可以创build一个到sftp-server二进制文件的符号链接。 并configuration用户使用该符号链接作为SFTP二进制文件。 那么你可以暂时删除这个符号链接,什么会有效地禁用SFTP。

 Match User theuser ForceCommand /path/to/sftp/symlink 

请注意,在系统范围内禁用sftp可能是不理想的,因为sftp对于所有其他可能的任务(使用当前devise和未来devise)都变得完全不可用。 更好的devise(保留长期的灵活性)可能是控制某些数据的“写入”权限(正如Martin Prikryl更好的多解答案的第一个解决scheme所指出的那样)。

我select不复制(或尝试完成)Martin Prikryl的更好的多解决scheme的答案,它不涉及更改sshd_config文件或重新加载服务。

但是,为了教育/熟悉,我会分享另一种select。

而不必更改sshd_config文件并重新加载服务?

您可以更改sshd_config文件,但不能重新加载服务。 (所以,如你所要求的,你们两个都没做。)

然后发送一个SIGHUP给父sshd服务。 (确保它是父级:SIGHUPping另一个sshd服务可能会终止一个连接。)确定哪个进程是父级的简单方法可能是使用PID文件。

例如,如果sshd正在做这个PID文件:
sudo kill -HUP $( sudo cat /var/run/sshd.pid )

(PID文件的默认名称/位置可能因不同的操作系统而异。)

SIGHUPping父母将导致sshd重新加载configuration文件(因为这是sshd的devise)。 请注意,这可能不会阻止任何当前正在运行的sftp会话(并且修改磁盘上的二进制文件也可能不会),所以在进入敏感的can-have-sftp运行过程之前,请确保已经处理完毕。

您可以重新configuration防火墙服务以阻止正在使用的sftp端口。