Deaktivieren Sie alle Dienste außer ssh

31

Wie kann ich alle Dienste außer ssh auf modernen (systemd-basierten) Linux-Distributionen deaktivieren?

Ich muss einen Wartungsmodus implementieren .

Alle diese Dienste müssen ausgefallen sein:

  • postgres
  • postfix
  • Apache
  • Tassen
  • cron
  • Taubenschlag

Ssh darf jedoch nicht heruntergefahren werden, da dies zur Ausführung von Aufgaben im Wartungsmodus verwendet wird.

Natürlich könnte ich ein Shell-Skript schreiben, das eine Liste von Diensten durchläuft, die ich deaktivieren möchte. Aber das fühlt sich so an, als würde ich etwas neu erfinden, was bereits existiert, aber ich weiß es bis jetzt nicht.

guettli
quelle
1
Welche Art von Aufgaben? Warum brauchst du das?
ewwhite
@ user430214 Ich habe die Frage aktualisiert. Ich fügte hinzu: Natürlich könnte ich ein Shell-Skript schreiben, das eine Liste von Diensten durchläuft, die ich deaktivieren möchte. Aber das fühlt sich so an, als würde ich etwas neu erfinden, was bereits existiert, aber ich weiß es bis jetzt nicht.
guettli

Antworten:

55

Das klingt nach Runlevel , die in Systemd durch Ziele ersetzt wurden . Anstatt ein Skript zu schreiben, mit dem eine Liste von Diensten gestartet und gestoppt wird, können Sie ein neues Skript erstellen, maintenance.targetdas nur die erforderlichen Dienste enthält, z. B. SSH. Natürlich ist SSH ohne Netzwerk nicht sehr nützlich, daher wird in diesem Beispiel ein einfaches emergency-net.targetso modifiziert, dass es SSH enthält.

[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

Anschließend können Sie mit in den Wartungsmodus wechseln

# systemctl isolate maintenance.target

und zurück

# systemctl isolate multi-user.target
Esa Jokinen
quelle
1
Vielen Dank für diese Antwort. Es zeigt mir, dass Fragen nützlich ist, auch wenn Sie der Meinung sind, dass es keine gute Antwort gibt, außer ein Dirty-Shell-Skript zu schreiben. Das emergency-net.target ist eine einfache und elegante Lösung - großartig :-)
guettli
Dies ist sicherlich der Fall, da auch alle Abhängigkeiten berücksichtigt werden und Sie Ihr Skript nicht jedes Mal aktualisieren müssen, wenn Sie einen neuen Dienst installieren.
Esa Jokinen
3

Listen Sie zuerst Ihre Dienste auf und suchen Sie nach den entsprechenden Systemnamen.

Erstellen Sie dann eine Liste und stoppen Sie jedes Listenmitglied, um die Wartung zu starten. Starten Sie jedes Mitglied nach der Wartung.

Nils
quelle
5
Warum nicht einfach benutzen systemctl isolate?
Chris Down