为什么我没有root就得到“屏幕正在终止”?


23

我已经在Fedora 19上安装了屏幕。当我通过SSH以root身份远程测试命令时,它可以正常运行。例如,如果我输入screen一个新的终端仿真器,则会启动并等待命令。我可以分离它,等等。但是,当我尝试以标准用户身份通过​​SSH远程登录后,该命令立即终止。我唯一看到的消息是[screen is terminating]

有人已经有这个问题了吗?与权限错误相关吗?

更新:

$ 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 +++

我尝试将权限更改为777,但是当我执行时screen,我得到:

目录“ / var / run / screen”必须具有模式775。

因此,我恢复了更改。


命令是什么?
ewwhite

最简单的一个:“屏幕”。我在shelr.tv/records/525179c7966080791000005f

您是否偶然在VPS或托管服务器上?
ewwhite

它是一台托管服务器

strace -e trace=file screen检查文件访问是否失败。或tmux用作解决方法,除了使用^ b代替^ a之外,其工作原理相同。
伊曼纽尔

Answers:


5

“必须模式777”和“必须模式775”之间的触发是由引起的strace

screen通常是setuid或setgid程序。它在执行时会获得额外的特权,该特权用于创建套接字文件和/或修改utmp。

跟踪进程时,将禁用setuid和setgid。由特权较少的用户控制的跟踪过程可以接管被跟踪的过程,因此它必须在没有额外特权的情况下运行,以避免赋予原始用户过多的权力。

screen 检测是否正在使用setuid特权,setgid特权或两者都不运行,并相应地调整对目录许可权的期望。

因此,这会产生一类无法使用轻松调试的问题strace

但是,如果您是root用户,则有一种解决方法!如果跟踪进程以root用户身份运行,则被跟踪进程可以正常获得特权。因此,这是您的工作:

  1. 开设2个新终端
  2. 在第一个终端中,以超级用户身份登录到远程计算机
  3. 在第二个终端中,以普通用户身份登录到远程计算机
  4. 用于ps在第二个终端中获取普通用户的shell进程的PID
  5. 在第一个终端中,运行 strace -f -p SHELLPID
  6. 在第二个终端中,运行屏幕并观看失败
  7. 在第一个终端中,您现在有了strace日志,以查找真正的错误所在。

strace命令的关键附加内容是-f选项,它告诉它跟踪子进程。您需要它来跟踪屏幕,该屏幕将是您使用指定的shell进程的子级-p

我还喜欢使用-ff并指定带有的输出文件-o,例如

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

它将为每个子进程创建一个单独的输出文件。之后,您将它们与一起阅读less /tmp/screentrace*,其结果通常比使用单个所获得的结果更干净-f

更新

既然我已经看到了strace的输出,我不知道到底出了什么问题,但是这一行是跟踪中最令人惊讶的事情:

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

几行之前,它创建了一个pty,显示TIOCGPTN为2。

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

但是它无法将它塞住。我不知道为什么那个chown会失败,但是chown的失败确实给出了屏幕放弃的合理原因。您可以通过添加-v到strace选项并查看stat之后的内容TIOCGPTN以了解谁拥有/dev/pts/条目来获得更多信息。


感谢您的详细过程。我试图查看strace生成的输出,但是我无法弄清楚出了什么问题。以下是strace生成的三个文件的内容的链接:pastebin.com/raw.php? i= aeqDwTBX,欢迎提出任何想法:)
Laurent


1

当我遇到此错误消息。我必须使用以下内容调整权限:

chmod 2775 /usr/bin/screen

这就为我解决了这个问题。2对于正确的访问权限非常重要。

您应该阅读有关SUID,SGID,粘性位,ACL以及它们如何影响访问的更多信息。


你的作品。不好,但目前看不到其他解决方案。
AnttiRytsölä2015年

0

屏幕命令已在运行。所以我终止了它并重新输入了命令。是的,这不是像其他解决方案一样好的解决方案,但是花费的时间更少。

只需ps并找到pid,杀死PID,然后再次重新键入屏幕命令即可。

如果您正在运行多个屏幕命令,请确保终止与终端关联的正确过程。


0

在/ etc / fstab中注释以下行并重新启动后,我发现此问题已解决:

devpts         /dev/pts        devpts  defaults        0       0

0

确保没有其他人screen正在使用该设备

这可以通过/superuser/97844/how-can-i-determine-what-process-has-a-file-open-in-linux来实现:

sudo lsof /dev/ttyS0

如果是这样,然后终止该过程。

由于某种原因,在这种情况下,sudo screen仍然可以访问该设备,但是该连接将丢失字符,这些字符被另一个消耗screen

确保用户具有对该文件的读写权限

例如,在Ubuntu上,您要将用户添加到dialout组中:https : //askubuntu.com/a/133244/52975


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.