He instalado la pantalla en Fedora 19. Cuando pruebo el comando como root de forma remota a través de SSH, funciona perfectamente. Por ejemplo, si ingreso screen
un nuevo emulador de terminal se inicia y espera los comandos. Puedo desconectarlo, etc. Sin embargo, cuando trato de hacer lo mismo una vez que estoy conectado de forma remota a través de SSH como usuario estándar, el comando termina inmediatamente. El único mensaje que veo es [screen is terminating]
.
¿Alguien ya ha tenido este problema? ¿Está relacionado con malos permisos?
Actualizar:
$ 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 +++
Intenté cambiar los permisos a 777 pero luego cuando ejecuto screen
, obtengo:
El directorio '/ var / run / screen' debe tener el modo 775.
Por lo tanto, he revertido mis cambios.
permissions
gnu-screen
Laurent
fuente
fuente
strace -e trace=file screen
para verificar si falla en el acceso al archivo. O usatmux
como una solución alternativa, funciona igual excepto que usa ^ b en lugar de ^ a.Respuestas:
El flip-flop entre "debe tener el modo 777" y "debe tener el modo 775" es causado por
strace
.screen
generalmente es un programa setuid o setgid. Obtiene privilegios adicionales cuando se ejecuta, que se utiliza para crear archivos de socket y / o modificar utmp.Cuando se rastrea un proceso, setuid y setgid están deshabilitados. El proceso de rastreo, controlado por el usuario menos privilegiado, puede hacerse cargo del proceso rastreado, por lo que debe ejecutarse sin sus privilegios adicionales para evitar darle demasiado poder al usuario original.
screen
detecta si se está ejecutando con privilegios setuid, privilegios setgid o ninguno de los dos, y ajusta sus expectativas de los permisos del directorio en consecuencia.Entonces, esto crea una clase de problemas que no se pueden depurar fácilmente
strace
.Pero si eres root, ¡hay una solución! Si el proceso de rastreo se ejecuta como root, entonces el proceso rastreado puede obtener privilegios normalmente. Entonces, esto es lo que haces:
ps
para obtener el PID del proceso de shell del usuario normal en el segundo terminalstrace -f -p SHELLPID
La adición clave al
strace
comando es la-f
opción, que le dice que rastree los procesos secundarios. Lo necesita para rastrear la pantalla que será un elemento secundario del proceso de shell que especificó-p
.También me gusta usar
-ff
y especificar un archivo de salida con-o
, como enque creará un archivo de salida separado para cada proceso secundario. Luego los lees
less /tmp/screentrace*
y el resultado suele ser más limpio que el que obtienes usando uno solo-f
.ACTUALIZAR
Ahora que he visto la salida de strace, no sé exactamente qué salió mal, pero esta línea es lo más sorprendente en la traza:
Unas pocas líneas antes, creó una pty, que fue revelada por
TIOCGPTN
ser la número 2.Pero no pudo reconocerlo. No sé por qué ese chown fallaría, pero el fallo del chown da una razón plausible por la cual la pantalla se rindió. Puede obtener un poco más de información agregando
-v
a las opciones de strace y mirandostat
despuésTIOCGPTN
para ver quién posee la/dev/pts/
entrada.fuente
Una de las posibles razones de ese error: políticas incorrectas de selinux, pero de acuerdo con redhat bugtracker, dichos errores se corrigieron en fedora 17/18.
Como solución alternativa, puede cambiar la variable
SCREENDIR
en usted~/.bashrc
a algo así$HOME/.screen
.fuente
Cuando encontré este mensaje de error. Tuve que ajustar mis permisos con lo siguiente:
chmod 2775 /usr/bin/screen
Y esto resolvió el problema para mí. El 2 es muy importante para los permisos de acceso correctos.
Debería leer más sobre SUID, SGID, Sticky Bit, ACL y cómo afectan el acceso.
fuente
El comando de pantalla ya se estaba ejecutando. Así que lo terminé y volví a escribir el comando. Sí, esta no es una resolución bastante buena como otras, pero lleva menos tiempo hacer esto.
Simplemente ps y encuentre el pid, elimine el PID y continúe con volver a escribir el comando de pantalla.
Si está ejecutando múltiples comandos de pantalla, asegúrese de finalizar el proceso correcto asociado con su terminal.
fuente
Encontré este problema resuelto después de comentar la siguiente línea en / etc / fstab y reiniciar:
fuente
Asegúrese de que nadie más
screen
esté usando ese dispositivoEsto se puede lograr con /superuser/97844/how-can-i-determine-what-process-has-a-file-open-in-linux :
Y luego elimine ese proceso si ese es el caso.
Por alguna razón, bajo esta condición,
sudo screen
aún puede acceder al dispositivo, pero esa conexión perderá caracteres, que son consumidos por el otroscreen
.Asegúrese de que el usuario tenga permiso de lectura y escritura para el archivo
Por ejemplo, en Ubuntu desea agregar el usuario al
dialout
grupo: /ubuntu//a/133244/52975fuente
Obtuve exactamente el mismo problema y una salida strace bastante similar.
Esto lo solucionó:
créditos: https://www.linuxquestions.org/questions/linux-newbie-8/screen-terminates-immediately-4175444530/
fuente