如何在现代(基于 systemd)Linux 发行版上禁用除 ssh 之外的所有服务?
我需要实现一个维护模式。
所有这些服务都需要关闭:
- PostgreSQL 的
- 后缀
- 阿帕奇
- 杯子
- 计划任务
- 鸽舍
但是 ssh 不能被关闭,因为它会用于在维护模式下执行任务。
当然,我可以编写一个 shell 脚本,循环遍历我想禁用的服务列表。但这感觉就像我在重新发明一些已经存在但目前我还不知道的东西。
答案1
这听起来很像运行级别,替换为目标在 Systemd 中。因此,您无需编写启动和停止一系列服务的脚本,而是可以创建一个仅包含必要服务(如 SSH)的新脚本。当然,如果没有网络,SSH 就没什么用,因此在此示例中,我们修改了maintenance.target
一个简单的脚本以包含 SSH。emergency-net.target
[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
然后你可以使用以下方式进入维护模式
# systemctl isolate maintenance.target
然后回来
# systemctl isolate multi-user.target
答案2
根据@Esa在 Debian 10 上,你有一个rescue-ssh.target
用于禁用所有服务的文件,除了ssh 和网络:
/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
现在,您可以按照以下步骤操作:
1. 输入维护模式:
systemctl isolate rescue-ssh.target
(仅限 ssh 和网络)
2. 检查维护模式:
lsof -i:1-65535
(并且您将只看到正在运行的 ssh 端口)
3. 退出维护模式:
systemctl isolate multi-user.target
(和一切又回来了)
答案3
首先列出您的服务并搜索其对应的 systemd 名称。
然后建立一个列表并停止每个列表成员进入维护,维护后启动每个成员。