"Terminal-Prozessgruppe kann nicht festgelegt werden" während su als Anmeldeshell für einen anderen Benutzer

16

Hinweis: Bitte lesen Sie die aktualisierten Informationen ab "BEARBEITEN" in der Mitte dieses Beitrags - die Umgebung und der Hintergrund dieses Problems haben sich geändert

Ich habe hier eine Moor-Standard-Debian 6.0-Installation, die ich beschlossen habe, mich von den Debian Testing-Repositorys abzuwenden. Dazu habe ich die Verweise auf die Squeeze-Repos in meiner sources.list ausgetauscht, um stattdessen die Testing-Repos zu verwenden.

Nach der Paketinstallation und einem Neustart erhalte ich die folgende Fehlermeldung, wenn ich versuche, einen anderen Benutzer anzusprechen:

root@skaia:~# su joebloggs -
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

Wenn ich das - weglasse, tritt dies nicht auf.

Beachten Sie, dass Benutzer korrekt root werden können. Dies scheint nur zu passieren, wenn Sie von root zu einer anderen Person wechseln und das - verwenden, um die Umgebung dieses Benutzers abzurufen.

Google ist hier meistens nutzlos. Das einzige, was ich finden kann, sind Hinweise aus dem Jahr 2011 in Bezug auf das suxPaket, die in der Zwischenzeit behoben zu sein scheinen.

Dies sieht aus und riecht sehr nach einem Upgrade-Fehler, der behoben werden kann, indem das richtige Paket auf die richtige Weise angepasst wird. Ich habe keine Ahnung, wo ich anfangen soll - ansonsten funktioniert mein System ganz normal und wie erwartet.

BEARBEITEN

Das passiert mir jetzt auf einer Debian- Stable- Maschine, wie oben beschrieben. Dieses Mal gibt es kein Upgrade oder ähnliches, nur einen stabilen Aufstieg.

Ja, ein Jahr später. Immer noch keine Ahnung, was zum Teufel das Problem ist.

So sieht es jetzt aus (es hat sich nicht viel geändert):

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
terraria@skaianet:~$ tty
/dev/pts/0
terraria@skaianet:~$ ls -l /dev/pts/0
crw--w---- 1 root root 136, 0 Oct 10 19:21 /dev/pts/0
terraria@skaianet:~$ ls -l /dev/pts/
crw--w---- 1 root root 136, 0 Oct 10 19:21 0
crw--w---- 1 root root 136, 2 Sep 22 17:47 2
crw--w---- 1 root root 136, 3 Sep 26 19:30 3
c--------- 1 root root   5, 2 Sep  7 10:50 ptmx

Eine so erzeugte Strace:

root@skaianet:~$ strace -f -o tracelog su terraria -

..also taucht ein verwirrendes Verhalten auf. Diese Nachrichten sind ziemlich verwirrend. Einige ausgewählte Zeilen:

readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
#Error code 10? 
15503 open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
#Yes there is, and I can interact with it normally
15503 ioctl(255, TIOCGPGRP, [32561])    = -1 ENOTTY (Inappropriate ioctl for device)

Ich habe die gesamte Ausgabe dieser Strace-Sitzung verknüpft - alles, was ich getan habe, war, den Befehl su auszuführen und dann sofort Strg + D aus dem Terminal zu entfernen.

Mikey TK
quelle
1
Hallo Mike. Hast du das Problem gefunden?
Mircea Vutcovici

Antworten:

33
  • su - usernamewird von Ihrem so interpretiert su, dass es "die Shell des Benutzernamens als interaktive Anmeldeshell ausführen " bedeutet.
  • su username -wird von Ihrem so interpretiert su, dass es "folgenden nicht interaktiven Befehl ( -) als Benutzernamen ausführen " bedeutet
  • Letzteres funktionierte überhaupt nur, weil:
    • Ihr suübergibt nachgestellte Argumente an shzum Parsen
    • shnimmt -zu bedeuten "run als Login - Shell (lesen /etc/profile, ...)"

Aber was Sie wirklich interessiert, ist: Warum nicht interaktiv ? Gemeinsame Nutzung der Steueranschluss zwischen der privilegierten Eltern und den nicht privilegierten Kind lässt Sie anfällig für „ TTY Push - Back - privilege escalation “, auch bekannt als die TIOCSTIFehler, so dass , wenn Sie es wirklich brauchen su löst sich von ihm . Wenn Sie das su username -Formular verwendet haben, haben Sie su festgestellt, dass Sie kein Controlling-Terminal benötigen .

Nur Prozesse mit einem steuernden Terminal können Sitzungsleiter haben, die Prozessgruppen manipulieren (Jobsteuerung durchführen). die Spur Sie gab ist bashErkennen , dass es nicht Gruppen-Führer sein kann.

Du erwähnst:

Seltsamerweise funktionieren beide Formen unter Ubuntu und CentOS 6 einwandfrei, jedoch unter Vanilla Debian funktioniert nur die erste Form fehlerfrei.

Ignorieren Varianten mögen suxund sudogibt es mindestens drei [1] Versionen suauf Linux: coreutils, util-linuxund shadow-utilsaus dem Debian kommt. Die Manpage des letzteren weist darauf hin:

Diese Version von su bietet viele Kompilierungsoptionen, von denen möglicherweise nur einige an einer bestimmten Site verwendet werden.

und Debian kommt mit der Flagge old_debian_behavior; Andere Versionen haben möglicherweise ähnliche Optionen für die Kompilierungszeit / Laufzeit. Ein weiterer Grund für die Variabilität könnte sein, dass es einige Debatten [2] darüber gab, ob suPrivilegien jemals auf diese Weise gelöscht werden sollten und ob der TIOCSTIFehler daher überhaupt ein Fehler ist (Redhat hat ihn ursprünglich mit "WONTFIX" geschlossen ).

[1]: Bearbeiten: hinzufügen SimplePAMAppsund hardened-shadowdazu.

[2]: Solar Designer hat dort einige (alte) Meinungen, die meiner Meinung nach eine Lektüre wert sind.

ZakW
quelle
2
Das ist eine ausgezeichnete Antwort und das Beste ist, dass es genau erklärt, warum. Ich wünschte, du wärst vor einem Jahr hier gewesen :)
Mikey TK
1

Ich würde den Besitz und die Berechtigungen auf / dev / pts * überprüfen oder nach einer neuen Konfiguration für udev in Bezug auf / dev / pts-Geräte suchen, die während des Aktualisierungsprozesses nicht ersetzt wurde.

Sie können auch versuchen, herauszufinden, welches System den Fehler generiert, indem Sie es als root ausführen:

strace -f su - username 2>stderr.log
Mircea Vutcovici
quelle
2
Besser noch hinzufügen -f, falls su beschließt, die Shell als Unterprozess auszuführen, was jetzt üblich zu sein scheint. Der Systemaufruf zum Festlegen der Vordergrund-Prozessgruppe eines Terminals ist ioctl(..., TIOCSPGRP, ...)und wir wissen bereits, dass es mit ENOTTY (Unangemessenes Ioctl für Gerät) fehlgeschlagen ist, sodass ein Teil der Strace nicht viel hilft. Es kann jedoch eine Reihe beider Versionen des Befehls (mit und ohne -) verglichen werden, um herauszufinden, warum das TIOCSPGRP fehlschlägt.
Alan Curry
Das sieht nach einem vielversprechenden Vorsprung aus. In meinem Ordner / dev / pts befinden sich genau zwei Elemente, nämlich 0, Berechtigungen, die dem Benutzer, als der ich mich angemeldet habe, als 600 gehören, und eine ptmxBerechtigung, die root gehört, mit null Berechtigungen.
Mikey TK
1
Wenn Sie nach der No job controlMeldung die Shell-Eingabeaufforderung erhalten , führen Sie den Befehl aus ttyund Sie erfahren, auf welchem ​​Tty Sie sich befinden. Dann ist ls -les.
Alan Curry
@ AlanCurry, Sie haben Recht, ich werde hinzufügen -f. Vielen Dank!
Mircea Vutcovici
@ AlanCurry - es kam zurück. Ich habe die ursprüngliche Frage mit den von Mircea vorgeschlagenen Informationen aktualisiert.
Mikey TK