/etc/profile.d Skript, das den Start eines Dienstes stört und die ssh-Verfügbarkeit nach dem Neustart erheblich verzögert

422
Brian Thomas

Ich habe in /etc/profile.d(centos6) ein Skript erstellt, das in keiner Weise mit Marionette zusammenhängt, sondern kopiert nur einige Dateien in ein Benutzerverzeichnis. Irgendwie stört dieses Skript auf einem Marionetten-Enterprise-Master-Server den Dienst pe-postgresqlund führt dazu, dass sich der Server beim Starten verzögert, und dieser Dienst wird nicht ausgeführt.

Dieses Profilskript verfügt über eine Funktion, die einen Benutzer bei der Anmeldung auffordert und ihn fragt, ob er installiert werden soll (y, n), wenn eine seiner Dateien nicht gefunden wird. Ich vermute, dass dies im Hintergrund zu etwas passiert, wenn ein Marionettendienst irgendwo startet und dieser Dienst fehlschlägt.

#/etc/profile.d/custom.sh if [ ! f ~/.custom ]; then logPrompted; while true; do read -p "Do you want to install?)" yn case $yn in [Yy]* ) installCustom; break;; [Nn]* ) logOptedOut; break;; * ) echo "Please enter y or n!";; esac done fi 

Sobald die Datei ausgezogen wird /etc/profile.d, hören die Probleme auf. ZB sudo service pe-postgresql startscheitert jedes Mal, wenn das Skript vorhanden ist.

Wenn ich mir Marionettenbenutzer ansehe, cat /etc/passwd | grep pe-kann ich überprüfen, ob es sich um alle handelt nologin.

Entweder fehlt hier etwas oder ein anderer Marionetten-Service-Benutzer fehlt mir. das ist möglicherweise interaktiv.

Ich fügte die Protokollierung für jeden Lauf hinzu, um zu sehen, wann ran ( logPrompted) vor der Frage lief, indem ich Bericht erstattete $(whoami), hoffte, den verborgenen Benutzer aufzudecken, und im Protokoll sehe ich tatsächlich pe-postgresjedes Mal, wenn "Ich" versucht, den Dienst neu zu starten, aber das ist nicht konsistent.

unter / etc / passwd ist dieser Benutzer pe-postgres:x:492:493:Puppet Enterprise PostgreSQL Server:/opt/puppet/var/lib/pgsql:/sbin/nologin

Ich versuche herauszufinden, wie ich diesen Benutzer oder jeden nologinBenutzer mit diesem Profilskript umgehen kann .

Gibt es etwas, das ich am Anfang eines Profils.d-Skripts hinzufügen muss, um es vor solchen Dingen zu schützen?

0
Haben Sie sich den pe-postgresql-Dienst selbst angesehen? (dh der in /etc/init.d) grawity vor 5 Jahren 1
Exzellente Idee. Ich sehe diese $ SU -l pe-postgres -s / bin / bash -c "$ PGENGINE / postmaster -p" $ PGPORT -D '$ PGDATA' $ & ">>" $ PGSTARTUPLOG "2 > & 1 </ dev / null`. Ich schätze, warum es das Skript auslöst, weil es / bin / bash angibt. Das war super kryptisch, daher würde ich mein Skript lieber schützen, um nicht beabsichtigte Benutzer aufzufordern. Irgendwelche Ideen? Brian Thomas vor 5 Jahren 0

1 Antwort auf die Frage

1
grawity

Eingabeaufforderungen sind nur sinnvoll, wenn die Shell interaktiv ist. (Sie möchten nicht, dass sie zB SFTP-Verbindungen stören ...) Um die Interaktivität zu prüfen, haben Sie zwei Möglichkeiten:

  • Testen Sie, ob $-der Brief enthalten ist i.

    case $- in *i*) <do your prompts>;; *) return;; esac 

    Oder:

    if ! case $- in *i*) false; esac; then <do your prompting> fi 
  • Verwenden [ -t 0 ]zu testen, ob stdin (Dateideskriptor # 0) ist ein Terminal:

    if [ ! -t 0 ]; then return fi 

    Oder:

    if test -t 0; then <do prompts here> fi 

(Da Ihr Skript von einem übergeordneten Skript "bezogen" wird, ist der Aufruf returnaußerhalb von Funktionen zulässig und kehrt zum übergeordneten Skript zurück. Dadurch können Sie eine zusätzliche Ebene der Einrückung vermeiden.)

Die zweite Methode (prüft stdin) testet die Interaktivität nicht wirklich - beispielsweise sh -l -c "some command"würde sie den Test auch bestehen, wenn sie durch ein Terminal läuft. In vielen Fällen funktioniert es jedoch trotzdem, da Diensten und SFTP-Verbindungen kein Terminal zugeordnet ist.