2016-07-11 9 views
0

Lets sagen, ich habe einen Dienst (wie Rsyslog), dass, wenn ich es zu stoppen, ich die Gründe hinter jemandem schließen will es herunterfahren. Exprimierenden dies einfach sein würdeBenutzereingabe während eines System-Calls/Service-Aufrufs für CentOS?

systemctl start rsyslog 
systemctl stop rsyslog 

(Beginnen Sie mit der Aufforderung, warum ein Benutzer diese nach rsyslog Herunterfahren tut)

#!/bin/bash 
    echo "you are shutting down the syslog service. Please state your name and reason." 
    read -p "[name?]" name && read -p "[reason?]" reason 
    logger $name:$reason 

Modifying the Unit Files (in/usr/lib/systemd/system/rsyslog .service), um ein ExecStop des Pfades zum Skript einzuschließen, kann ich das obige Skript ausführen. Ich weiß, dass das Skript funktioniert, als die Überprüfung der Protokollmeldungen zeigt eine :, den nicht variablen Teil, der an den Logger übergeben wurde.

Ich muss in der Lage sein, dieses Skript wie das Shell-Skript der Instant jemand zu versuchen, den Logging-Dienst herunterfahren zu betreiben. Dies bedeutet, dass Echo-Befehle auf dem Terminal angezeigt werden und Variablen mit dem Lesebefehl aufgezeichnet werden können.

This may be similar to this persons question, but I can not understand it.

+0

Ich stimme diese Frage als off-topic zu schließen, da es nicht direkt auf die Programmierung bezieht. Es gehört auf die Unix- und Linux-StackExchange-Site, wo es ein Betrüger von http://unix.stackexchange.com/questions/77769/prompt-for-password-during-boot-with-systemd-service ist Die Frage geht wirklich 'systemd', nicht so sehr das Betriebssystem, und sowohl Arch als auch CentOS benutzen systemd. –

+0

@MarkStosberg: Verzeih mir. Ich bin auf der Suche nach einer Möglichkeit, eine ausführbare Datei interaktiv zu machen, wenn Sie Systemd verwenden. Die Dokumentation besagt, dass Sie dies nicht tun sollten ([Abschnitt 8.6.2, Schritt 1] (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html).) und ich suche nach Möglichkeiten, das zu umgehen. – Jouster500

+0

Zunächst können Sie den Root-Zugriff für Benutzer deaktivieren, denen Sie nicht vertrauen (ändern Sie das Passwort und geben Sie es nicht aus). Erlaube stattdessen sudo für eine begrenzte Anzahl von Aktionen, die Administratoren ausführen dürfen, die syslog stoppen können oder auch nicht. sudo protokolliert die von ihm ausgeführten Befehle. Zweitens könnten Sie überwachen, ob rsyslog läuft. Wenn nicht, benachrichtigen Sie sofort jemanden. Sie können dann die Sudo-Protokolle überprüfen. 'systemd' (und andere Init-Systeme) sind nicht für die interaktive Verwendung beim Stoppen/Starten vorgesehen, und ich empfehle diese auch nicht. –

Antwort

0

Dank Mark Stosberg information about the systemd-ask-password command für den Austausch, die Benutzereingaben während eines systemctl Anruf entgegennimmt.

Für diejenigen, die nicht wissen, ist der Befehl eine Passwortabfrage, die für alle Maschinen verfügbar ist, die den Systemd-Dienst sponsern. Eine einzigartige Funktion dieses Befehls ist die Tatsache, dass Benutzereingaben während eines System-/Serviceanrufs möglich sind. Wenn man das weiß, kann man so viele Daten anfordern, wie sie möchten, was perfekt in Standard-Bash-Skripte integriert ist, was die Interaktion ermöglicht, die während eines Anrufs benötigt wird oder nicht. Hier

ist ein Beispiel Skript:

#!/bin/bash 
date=$(/bin/date) 
echo "Rsyslog has been turned off at $date. Below is the name and reason" 
name=`systemd-ask-password --echo --no-tty "name:"` 
reason=`systemd-ask-password --echo --no-tty "reason for shutting down rsyslog:"` 
echo LOG:$name:$reason:ENDLOG >>/var/log/messages 

Sie müssen sicherstellen, dass, wenn alle Ihre Dienste Initialisieren Sie Änderungen an den Unit-Dateien machen sich in /usr/lib/systemd/system/ mit einem ExecStart, ExecStop und so weiter unter der [Service] Tag, um den Pfad zu Ihren Skripts zu erhalten. Sie können herausfinden, was other options you can here sowie einige Syntax, und binden Sie mit der Einheitsdatei nach Bedarf.