Warum bekomme ich "screen is terminating" ohne root?

23

Ich habe screen auf Fedora 19 installiert. Wenn ich den Befehl als root über SSH teste, funktioniert er einwandfrei. Wenn ich zum Beispiel screenein neues Terminal betrete, wird der Emulator gestartet und wartet auf Befehle. Ich kann es trennen usw. Wenn ich jedoch das Gleiche versuche, sobald ich als Standardbenutzer über SSH remote angemeldet bin, wird der Befehl sofort beendet. Die einzige Nachricht, die ich sehe, ist [screen is terminating].

Hat jemand schon dieses Problem gehabt? Hat es mit schlechten Berechtigungen zu tun?

Aktualisieren:

$ strace -e trace=file screen
execve("/usr/bin/screen", ["screen"], [/* 23 vars */]) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libutempter.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libfreebl3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
access("/home/steam/.nethackrc", F_OK)  = -1 ENOENT (No such file or directory)
readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
lstat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/var/run/utmp", O_RDONLY)         = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
lstat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
stat("/var/run/screen", {st_mode=S_IFDIR|0775, st_size=60, ...}) = 0
Directory '/var/run/screen' must have mode 777.
+++ exited with 1 +++

Ich habe versucht, die Berechtigungen auf 777 zu ändern, aber dann, wenn ich ausführe screen, erhalte ich:

Das Verzeichnis '/ var / run / screen' muss den Modus 775 haben.

Daher habe ich meine Änderungen rückgängig gemacht.

Laurent
quelle
Was ist der Befehl?
Ewwhite
Das einfachste: "Bildschirm". Ich ein Beispiel an aufgezeichnet shelr.tv/records/525179c7966080791000005f
Befinden Sie sich zufällig auf einem VPS- oder gehosteten Server?
Ewwhite
Es ist ein gehosteter Server
strace -e trace=file screenum zu überprüfen, ob der Dateizugriff fehlschlägt. Oder verwendet es tmuxals Umgehungsmöglichkeit. Es funktioniert genauso, außer dass es ^ b anstelle von ^ a verwendet.
Emmanuel

Antworten:

5

Das Flip-Flopping zwischen "must have mode 777" und "must have mode 775" wird durch verursacht strace.

screenist normalerweise ein setuid oder setgid Programm. Es erhält zusätzliche Berechtigungen, wenn es ausgeführt wird. Dies wird verwendet, um Socket-Dateien zu erstellen und / oder utmp zu ändern.

Wenn ein Prozess verfolgt wird, sind setuid und setgid deaktiviert. Der Ablaufverfolgungsprozess, der vom weniger privilegierten Benutzer gesteuert wird, kann den Ablaufverfolgungsprozess übernehmen, sodass er ohne seine zusätzlichen Privilegien ausgeführt werden muss, um zu vermeiden, dass der ursprüngliche Benutzer zu viel Energie erhält.

screen Erkennt, ob es mit setuid-Berechtigungen, setgid-Berechtigungen oder keinen ausgeführt wird, und passt die Erwartung der Verzeichnisberechtigungen entsprechend an.

Dies führt zu einer Reihe von Problemen, die nicht einfach behoben werden können strace.

Aber wenn Sie root sind, gibt es eine Problemumgehung! Wenn der Ablaufverfolgungsprozess als Root ausgeführt wird, kann der Ablaufverfolgungsprozess normalerweise Berechtigungen erlangen. Also hier ist was du tust:

  1. 2 neue Terminals öffnen
  2. Melden Sie sich im ersten Terminal als root am Remote-Computer an
  3. Melden Sie sich im zweiten Terminal als normaler Benutzer am Remotecomputer an
  4. Verwenden Sie psdiese Option , um die PID des Shell-Prozesses des normalen Benutzers im zweiten Terminal abzurufen
  5. Führen Sie im ersten Terminal aus strace -f -p SHELLPID
  6. Führen Sie im zweiten Terminal den Bildschirm aus und beobachten Sie, wie er ausfällt
  7. Im ersten Terminal haben Sie jetzt das Protokoll, das Sie benötigen, um herauszufinden, was wirklich falsch ist.

Der Schlüsselzusatz zum straceBefehl ist die -fOption, die ihn anweist, untergeordnete Prozesse zu verfolgen. Sie benötigen es, um den Bildschirm zu verfolgen, der ein untergeordnetes Element des von Ihnen angegebenen Shell-Prozesses ist -p.

Ich benutze -ffund spezifiziere auch gerne eine Ausgabedatei mit -o, wie in

strace -ff -o /tmp/screentrace -p SHELLPID

Dadurch wird für jeden untergeordneten Prozess eine separate Ausgabedatei erstellt. Danach lesen Sie sie mit less /tmp/screentrace*und das Ergebnis ist in der Regel sauberer als das, was Sie mit einem einzigen bekommen -f.

AKTUALISIEREN

Nachdem ich die Ausgabe von strace gesehen habe, weiß ich nicht genau, was schief gelaufen ist, aber diese Zeile ist das Überraschendste in der Ablaufverfolgung:

chown("/dev/pts/2", 1002, 5)            = -1 EPERM (Operation not permitted)

Ein paar Zeilen zuvor wurde eine Pty erstellt, die sich TIOCGPTNals Nummer 2 herausstellte .

open("/dev/ptmx", O_RDWR)               = 5
...
ioctl(5, TIOCGPTN, [2])                 = 0
stat("/dev/pts/2", {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0

Aber es war nicht in der Lage, es zu erraten. Ich weiß nicht, warum dieser Chown scheitern würde, aber der Chown-Fehler gibt einen plausiblen Grund, warum der Bildschirm aufgegeben hat. Sie können durch Hinzufügen von ein wenig mehr Informationen erhalten , -vum den Strace Optionen, und auf der Suche statnach dem TIOCGPTNzu sehen , wer der Eigentümer /dev/pts/Eintrag.


quelle
Vielen Dank für das detaillierte Vorgehen. Ich habe versucht, die Ausgabe von strace zu betrachten, kann aber nicht herausfinden, was falsch ist. Im Folgenden ist die Verbindung mit dem Inhalt der drei Dateien , die von strace erzeugt: pastebin.com/raw.php?i=aeqDwTBX jede Idee :) begrüßt
Laurent
2

Aus möglichen Gründen für diesen Fehler - falsche Selinux-Richtlinien, aber laut Redhat Bugtracker wurden solche Fehler in Fedora 17/18 behoben.

Als Workaround kannst du die Variable SCREENDIRin dir ~/.bashrcauf so etwas wie ändern $HOME/.screen.

Alexander Kudrevatykh
quelle
Ich habe es versucht, aber es löst das Problem nicht.
Laurent
1

Als ich auf diese Fehlermeldung stieß. Ich musste meine Berechtigungen folgendermaßen anpassen:

chmod 2775 /usr/bin/screen

Und das löste das Problem für mich. Die 2 ist sehr wichtig für die korrekten Zugriffsberechtigungen.

Sie sollten mehr über SUID, SGID, Sticky Bit, ACLs und deren Auswirkungen auf den Zugriff erfahren.

Roric
quelle
u + s funktioniert. Es ist nicht schön, aber ich kann im Moment keine anderen Lösungen sehen.
Antti Rytsölä Circles Consult
0

Der Bildschirmbefehl wurde bereits ausgeführt. Also habe ich es beendet und den Befehl erneut getippt. Ja, dies ist keine so gute Auflösung wie die anderen, aber dafür wird weniger Zeit benötigt.

Einfach ps und finde die pid, töte die PID und tippe den Bildschirm erneut ein.

Wenn Sie mehrere Bildschirmbefehle ausführen, stellen Sie sicher, dass Sie den richtigen Prozess beenden, der Ihrem Terminal zugeordnet ist.

Shree Harsha
quelle
0

Ich fand dieses Problem behoben, nachdem ich die folgende Zeile in / etc / fstab kommentiert und neu gestartet hatte:

devpts         /dev/pts        devpts  defaults        0       0
Uto Dev
quelle
0

Stellen Sie sicher, dass kein anderer screenBenutzer dieses Gerät verwendet

Dies kann erreicht werden mit /superuser/97844/how-can-i-determine-what-process-has-a-file-open-in-linux :

sudo lsof /dev/ttyS0

Und dann beenden Sie diesen Prozess, wenn dies der Fall ist.

Aus irgendeinem Grund kann unter dieser Bedingung sudo screenimmer noch auf das Gerät zugegriffen werden, aber in diesem Fall fehlen Zeichen, die vom anderen verwendet werden screen.

Stellen Sie sicher, dass der Benutzer Lese- und Schreibrechte für die Datei hat

ZB unter Ubuntu möchten Sie den Benutzer der dialoutGruppe hinzufügen : /ubuntu//a/133244/52975

Ciro Santilli ist ein Schauspieler
quelle