Ich habe screen auf Fedora 19 installiert. Wenn ich den Befehl als root über SSH teste, funktioniert er einwandfrei. Wenn ich zum Beispiel screen
ein 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.
quelle
strace -e trace=file screen
um zu überprüfen, ob der Dateizugriff fehlschlägt. Oder verwendet estmux
als Umgehungsmöglichkeit. Es funktioniert genauso, außer dass es ^ b anstelle von ^ a verwendet.Antworten:
Das Flip-Flopping zwischen "must have mode 777" und "must have mode 775" wird durch verursacht
strace
.screen
ist 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:
ps
diese Option , um die PID des Shell-Prozesses des normalen Benutzers im zweiten Terminal abzurufenstrace -f -p SHELLPID
Der Schlüsselzusatz zum
strace
Befehl ist die-f
Option, 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
-ff
und spezifiziere auch gerne eine Ausgabedatei mit-o
, wie inDadurch 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:
Ein paar Zeilen zuvor wurde eine Pty erstellt, die sich
TIOCGPTN
als Nummer 2 herausstellte .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 ,
-v
um den Strace Optionen, und auf der Suchestat
nach demTIOCGPTN
zu sehen , wer der Eigentümer/dev/pts/
Eintrag.quelle
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
SCREENDIR
in dir~/.bashrc
auf so etwas wie ändern$HOME/.screen
.quelle
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.
quelle
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.
quelle
Ich fand dieses Problem behoben, nachdem ich die folgende Zeile in / etc / fstab kommentiert und neu gestartet hatte:
quelle
Stellen Sie sicher, dass kein anderer
screen
Benutzer dieses Gerät verwendetDies kann erreicht werden mit /superuser/97844/how-can-i-determine-what-process-has-a-file-open-in-linux :
Und dann beenden Sie diesen Prozess, wenn dies der Fall ist.
Aus irgendeinem Grund kann unter dieser Bedingung
sudo screen
immer noch auf das Gerät zugegriffen werden, aber in diesem Fall fehlen Zeichen, die vom anderen verwendet werdenscreen
.Stellen Sie sicher, dass der Benutzer Lese- und Schreibrechte für die Datei hat
ZB unter Ubuntu möchten Sie den Benutzer der
dialout
Gruppe hinzufügen : /ubuntu//a/133244/52975quelle
Ich habe genau das gleiche Problem und eine ziemlich ähnliche Ausgabe.
Das hat es behoben:
Credits: https://www.linuxquestions.org/questions/linux-newbie-8/screen-terminates-immediately-4175444530/
quelle