在su期间将“无法设置终端进程组”作为另一个登录用户


16

注意:请阅读本文中途附近的以“ EDIT”开头的更新信息-此问题的环境和背景已更改

我在这里安装了标准的Debian 6.0沼泽,我决定将其降级到Debian Testing信息库。我这样做是通过在我的sources.list中换掉对Squeeze仓库的引用来代替使用Testing仓库。

软件包安装并重新启动后,尝试向其他用户输入su时出现以下错误:

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

如果我省略-,则不会发生。

请注意,用户可以正确地成为root用户,这似乎仅在从root用户切换到其他人并使用-获得该用户的环境时才会发生。

Google在这里几乎没有用。我唯一能找到的是2011年关于sux软件包的,该文献似乎在此期间已得到修复。

这看起来和闻起来很像是升级错误,可以通过以正确的方式调整正确的软件包来修复。我只是不知道从哪里开始-除此之外,我的系统完全可以正常运行,并且符合预期。

编辑

我现在在Debian马stable上发生这种情况如上所述机。这次无需升级或执行任何操作,只需稳定即可。

是的,一年后。仍然不知道问题到底在哪里。

现在是这样(没有太大变化):

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

如下所示生成一个strace:

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

..还会出现一些令人困惑的行为。这些消息令人困惑。一些选定的行:

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)

我已经链接了该strace会话的全部输出 -我所做的只是运行su命令,然后立即ctrl + d退出终端。


1
嗨,迈克。您找到问题了吗?
Mircea Vutcovici 2012年

Answers:


33
  • su - username解释为您su的意思是“运行用户名的shell作为交互式登录shell运行”
  • su username -解释su为“将以下非交互式命令(-)作为用户名运行
  • 后者之所以起作用,是因为:
    • 您的su传递尾随参数为sh进行解析
    • sh需要-表示“运行作为登录shell(读取/etc/profile...)”

但是您真正感兴趣的是:为什么不互动?在有特权的父母与没有特权的孩子之间共享控制终端会使您容易受到“ TTY推回特权升级 ”(又名TIOCSTIBug)的困扰,因此除非您确实需要,否则请不su 要这样做。当您使用su username -表格时,su 推断您不需要控制终端

只有具有控制终端的流程才能拥有操纵流程组(执行作业控制)的会话负责人;你给的踪迹是bash表明它不能成为会话负责人。

您提到:

奇怪的是,这两种形式都可以在Ubuntu和CentOS 6上正常运行,但是在香草Debian上,只有第一种形式可以正常工作。

忽略变种喜欢suxsudo有至少三种[1]版本的suLinux上:coreutilsutil-linux以及shadow-utils从Debian的来了。后者的手册指出:

此版本的su有许多编译选项,在任何特定站点中都只能使用其中的一些。

并且Debian的带有旗帜old_debian_behavior; 其他版本可能具有类似的编译时/运行时选项。可变性的另一个原因可能是关于是否应该使用这种方式放弃特权以及该错误是否 根本就是一个错误的争论[2](Redhat最初将其关闭为“ WONTFIX”)。suTIOCSTI

[1]:编辑:添加SimplePAMAppshardened-shadow

[2]:Solar Designer 那里一些(旧的)观点,我认为值得一读。


2
这是一个很好的答案,而最重要的一点就是可以确切解释原因。希望您一年前来过这里:)
Mikey TK

1

我将检查/ dev / pts *上的所有权和权限,或者检查与/ dev / pts设备相关的udev的新配置,该配置在升级过程中不会被替换。

您还可以尝试通过以root用户身份运行来找出是什么syscal产生了错误:

strace -f su - username 2>stderr.log

2
最好将其添加-f到该strace中,以防su决定将Shell作为子进程运行,这种情况现在似乎很常见。设置终端的前台进程组的syscall是,ioctl(..., TIOCSPGRP, ...)并且我们已经知道它因ENOTTY(设备的不适当的ioctl)而失败,因此strace的部分无济于事。但命令(有和没有的两个版本的strace的-)所不能比拟的,找出原因的TIOCSPGRP失败。
艾伦·库里

这看起来是一个有希望的领先者。在我的/ dev / pts文件夹中,正好有两个项目,即0,我设置为登录用户的权限设置为600 ptmx,根用户的权限为零。
Mikey TK

1
No job control消息后出现shell提示时,运行命令tty,它将告诉您正在使用哪个tty。然后ls -l
艾伦·库里

@AlanCurry,您是对的,我会补充-f。谢谢!
Mircea Vutcovici 2012年

@AlanCurry-它回来了。我已经用Mircea建议的信息更新了原始问题。
Mikey TK
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.