问题

问题

问题

当我启动 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以便删除Subsystemsftp-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是不够的,因为这些系统有一个编译默认值(请参阅 参考资料)。Subsystemsshd_configSubsystem sftp /usr/lib/openssh/sftp-serverman 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"

相关内容