禁用所有服务,ssh 除外

gue*_*tli 32 maintenance linux service systemd

如何在现代(基于 systemd 的)Linux 发行版上禁用除 ssh 之外的所有服务?

我需要实施维护模式

所有这些服务都需要关闭:

  • 邮局
  • 后缀
  • 阿帕奇
  • 杯子
  • 定时任务
  • 鸽舍

但是 ssh 不能关闭,因为这会在维护模式下用于执行任务。

当然,我可以编写一个 shell 脚本,循环遍历我想禁用的服务列表。但这感觉就像我重新发明了一些已经存在但我现在还不知道的东西。

Esa*_*nen 58

这听起来很像runlevels,替换为Systemd 中的目标。因此,与其编写启动和停止服务列表的脚本,不如创建一个maintenance.target仅包含必要服务的新脚本,例如 SSH。当然,SSH 在没有网络的情况下不是很有用,所以在这个例子中,一个简单的emergency-net.target被修改为包括 SSH。

[Unit]
Description=Maintenance Mode with Networking and SSH
Requires=maintenance.target systemd-networkd.service sshd.service
After=maintenance.target systemd-networkd.service sshd.service
AllowIsolate=yes
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用进入维护模式

# systemctl isolate maintenance.target
Run Code Online (Sandbox Code Playgroud)

然后回来

# systemctl isolate multi-user.target
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的回答。它向我展示了询问是有用的,即使您认为除了编写一个肮脏的 shell 脚本之外没有其他好的答案。Emergency-net.target 是一个简单而优雅的解决方案 - 很棒:-) (2认同)

rob*_*007 5

根据@Esa的出色回答,在 Debian 10 上,您可以使用文件来禁用除ssh 和网络之外的rescue-ssh.target所有服务:

/lib/systemd/system/rescue-ssh.target

[Unit]
Description=Rescue with network and ssh
Documentation=man:systemd.special(7)
Requires=network-online.target ssh.service
After=network-online.target ssh.service
AllowIsolate=yes
Run Code Online (Sandbox Code Playgroud)

所以现在,您可以按照以下方式进行:

1. 进入维护模式

systemctl isolate rescue-ssh.target(仅限 ssh 和网络)

2、检查维护方式

lsof -i:1-65535(你只会看到 ssh 运行的端口)

3. 退出维护模式

systemctl isolate multi-user.target一切又回来了)