Fehler beim Verwenden von su -c: bash: keine Jobsteuerung in dieser Shell

Fehler beim Verwenden von su -c: bash: keine Jobsteuerung in dieser Shell

Ich habe ein Skript geschrieben, das bestimmte Befehle als ein anderer Benutzer ausführen und sich nach Abschluss der Ausführung (Erfolg oder Misserfolg) sofort abmelden soll.

Ich habe gelesen, dass ich of verwenden kann, -cum suBefehle auszuführen. Also habe ich ein Skript wie das folgende geschrieben:

#!/usr/bin/env bash

su - user2 -c "echo 'hurray' && exit"

Es führt den echoBefehl aus, bleibt aber angemeldet, da user2es sich nicht abmeldet. Ich habe sogar versucht, logoutanstelle von zu verwenden exit, aber es bleibt angemeldet. Ich muss das Skript als ausführen, user1das den Befehl aufruft suund als ausführt, und dann sollte die Steuerung nach Abschluss user2dorthin zurückkehren .user1

AKTUALISIEREN

Okay, ich konnte mich automatisch abmelden, aber dieses Mal werden einige Befehle nicht ausgeführt. Zum Beispiel:

Befehl1:

su user2 -c 'echo 1'

Ausgabe1:

1

Und dann meldet es sich automatisch ab.

Befehl2:

su user2 -c 'bash some-script.sh'

Ausgabe2:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

-cWenn ich also versuche, ein Skript über auszuführen su, wird der oben genannte Fehler angezeigt. Ich habe viele Befehle mit -cOptionen wie ls, which, bash --version, mkdir, rm, whoamiusw. ausprobiert. Alle diese Befehle haben die richtige Ausgabe erzeugt. Aber jeder Befehl, der versucht, ein Skript auszuführen, schlägt mit dem Fehler fehl.

su user2 -c 'bash --version'      # Works
su user2 -c 'bash some-script.sh' # Doesn't work

Ich kann nicht herausfinden, warum das passiert. Und das ist auch der Grund, warum ich diesen Fehler nicht beheben kann.

Antwort1

Der Grund für dieses Verhalten ist auf der Manualpage für aktuelle Versionen von dokumentiert su:

-c, --command BEFEHL

Geben Sie einen Befehl an, der von der Shell mithilfe von aufgerufen wird -c.

Der ausgeführte Befehl wirdhabe kein steuerndes Terminal. Diese Option kann nicht verwendet werden, um interaktive Programme auszuführen, die ein steuerndes TTY benötigen.

(Hervorhebung von mir)


Wenn Sie grundlegende Befehle wie ls, echooder ausführen bash --version, drucken diese ihre Ausgabe einfach in den stdoutStream, ohne dass ein Steuerterminal erforderlich ist.

Ich vermute, dass der Weg entweder bashaufgerufen wird (als interaktive Shell) oder some-script.shBefehle enthält, die ein steuerndes Terminalgerät erfordern, sodass beim Ausführen 'bash some-script.sh'der cannot set terminal process group (-1): Inappropriate ioctl for deviceFehler auftritt.

Einige Erklärungen

ASteuerterminalfür einen Prozess ist das Endgerät, von dem aus der Prozess gestartet wurde. Ein Steuerterminal kann Signale an Prozessgruppen senden und ist der Mechanismus, mit dem die Jobsteuerung in Unix-Betriebssystemen funktioniert. Die Jobsteuerung ermöglicht es, Prozesse in der Prozessgruppe im Vordergrund oder im Hintergrund auszuführen.

Die Ausgabe des psBefehls zeigt das steuernde Terminal für jeden Prozess, z. B.

$ ps

  PID TTY          TIME CMD
 3614 pts/5    00:00:00 bash
31628 pts/5    00:00:00 ps

Jüngste Änderung in su

In der Vergangenheit su -cwurde ein Steuerterminal gestartet, wenn keine interaktive Shell ausgeführt wurde. Die Ausführung apt-get changelog loginauf meinem Ubuntu-System zeigt, dass die Entfernung des Steuerterminals im Mai 2012 als Sicherheitsmaßnahme eingeführt wurde:

  • su: Beheben Sie mögliches TTY-Hijacking, indem Sie das steuernde Terminal beim Ausführen eines Befehls löschen (CVE-2005-4890). Schließt: #628843

verwandte Informationen