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)
根据@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)
所以现在,您可以按照以下方式进行:
systemctl isolate rescue-ssh.target(仅限 ssh 和网络)
lsof -i:1-65535(你只会看到 ssh 运行的端口)
systemctl isolate multi-user.target(一切又回来了)