问题
当我启动 SSH 服务器时,我的 Debian 也会自动启动 SFTP 服务器 - 为什么它是这样设计的?
环境:
- Linux 5.10.0-14-amd64 Debian 5.10.113-1 (2022-04-29) x86_64 GNU/Linux
- ssh.service - OpenBSD 安全 Shell 服务器
背景
今天我意识到:
- 当我想要处理 http 请求时,我启动一个 Web 服务器 - Apache(2)、Node.js 等。
- 当我想处理 SSH 时,我启动一个 SSH 服务器
- 当我想要处理 SFTP 时...Debian 已经为我启动了 SFTP 服务器
所以我研究了一下,根据这篇文章378313/default-sftp-server-in-debian-9-stretch,我发现 SFTP 是作为“(开放)SSH 的一部分”启动的,这完全有道理,但由于关注点分离等原因也感觉很奇怪。
与 Windows 不同,我从未感觉 Debian 为我做了一些意想不到的或额外的事情。但今天我感觉到了——毕竟我说了systemctl restart ssh
,不是systemctl restart ssh-and-also-ftp
(后一个命令是编造的)。
由于我是 Unix/Linux 及其哲学的新手,如果对这种情况有任何好的解释,我将不胜感激。
答案1
尽管 SFTP 不属于可扩展核心 SSH 协议,它至少内置于一种常见的 SSH 实现 (OpenSSH),因此可以被认为是标准件。
如果不需要,您可以通过更改来禁用服务器上的该功能,/etc/ssh/sshd_config
以便删除Subsystem
与sftp-server
.
例如,此行定义了一个外部sftp-server
实用程序来处理 SFTP 服务:
Subsystem sftp-server
此行定义了 SFTP 服务的内部实现:
Subsystem internal-sftp
删除或注释掉该Subsystem
行将完全禁用 SFTP 服务。
# Subsystem …
请记住,诸如rsync
(如果已安装)之类的工具及其版本scp
仍然可以运行,因此禁用 SFTP 本身并不会阻止用户在客户端和服务器之间传输文件。 (旧版本scp
将独立于 SFTP 工作。新版本使用 SFTP,但可以通过该标志强制使用旧协议-O
。)还有一些“琐碎”的解决方案需要ssh remoteHost cat somefile > local_copy_of_somefile
考虑。
答案2
奇怪的是,这里接受的答案并没有解决所提出的问题。
为什么要这样设计呢?
openssh 中的 SFTP 服务器不是传统的守护进程/服务器。当请求 SFTP 的 ssh 连接启动时,实例将按需运行。
ssh 可以做很多事情 - 以这种方式设计意味着当人们使用 ssh 执行其他操作时,sftp 服务器不会产生任何开销。类似地,ssh 通常用于提供远程终端会话,但它不实现自己的 shell。
除了更加节省资源之外,它还通过使系统模块化来简化开发。
答案3
要禁用基于 Debian 的系统(包括 Ubuntu)的内置sftp
服务器,删除或注释掉行sshd
是不够的,因为这些系统有一个编译默认值(请参阅 参考资料)。Subsystem
sshd_config
Subsystem sftp /usr/lib/openssh/sftp-server
man sshd_config
sshd_config
我在一个较旧的 Ubuntu 16 系统中成功地使用此行禁用了 SFTP :
Subsystem sftp /bin/false
其次是systemctl reload ssh; killall sftp-server
。
引用自man sshd_config
(Ubuntu 16 和 Ubuntu 22 中的相同文本):
“请注意,Debian openssh-server 软件包在 /etc/ssh/sshd_config 中将多个选项设置为标准,这不是 sshd(8) 中的默认选项:
(...)
子系统 sftp /usr/lib/openssh/sftp-server"