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, -c
um su
Befehle 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 echo
Befehl aus, bleibt aber angemeldet, da user2
es sich nicht abmeldet. Ich habe sogar versucht, logout
anstelle von zu verwenden exit
, aber es bleibt angemeldet. Ich muss das Skript als ausführen, user1
das den Befehl aufruft su
und als ausführt, und dann sollte die Steuerung nach Abschluss user2
dorthin 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
-c
Wenn ich also versuche, ein Skript über auszuführen su
, wird der oben genannte Fehler angezeigt. Ich habe viele Befehle mit -c
Optionen wie ls
, which
, bash --version
, mkdir
, rm
, whoami
usw. 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
, echo
oder ausführen bash --version
, drucken diese ihre Ausgabe einfach in den stdout
Stream, ohne dass ein Steuerterminal erforderlich ist.
Ich vermute, dass der Weg entweder bash
aufgerufen wird (als interaktive Shell) oder some-script.sh
Befehle 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 device
Fehler 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 ps
Befehls 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 -c
wurde ein Steuerterminal gestartet, wenn keine interaktive Shell ausgeführt wurde. Die Ausführung apt-get changelog login
auf 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