当我有“setuid”并且用户是该组的成员时,为什么 Upstart 需要“setgid”?

当我有“setuid”并且用户是该组的成员时,为什么 Upstart 需要“setgid”?

我正在尝试配置 U​​pstart 以运行一个小型实用程序,该实用程序需要访问 tty 作为系统范围的守护进程。从命令行运行时,该实用程序保持在前台,直到按下 Ctrl+C 才会退出;因此我省略了节expect,Upstart 正确地跟踪了 PID。我还使用 为守护进程创建了一个非特权帐户adduser --system --no-create-home --disabled-login avrlirc

在我的系统上,实用程序需要访问的 tty 安装为:

crw-rw----   1 root dialout 166,   0 May 24 19:25 ttyACM0

因此我将用户avrlirc(上面创建的)添加到dialout组中。当我运行该实用程序时,avrlirc一切都按预期运行。我将节添加setuid avrlirc到 Upstart 配置文件中,但作业失败并显示“无法打开 tty”。

如果我省略了setuid节,它就可以正常工作(因此这可能是权限问题)。如果我setgid dialout在旁边添加节setuid,它也可以正常工作。

setgid那么,当我已经拥有并且用户是适当组的成员时,为什么我还需要它setuid——为什么这还不够?

作为参考,Upstart 作业配置文件是:

start on runlevel [2345]
stop on runlevel [016]
console log
setuid avrlirc
setgid dialout
exec /usr/local/bin/avrlirc2udp -f -H -h <IP_ADDRESS> -t /dev/ttyACM0

<IP_ADDRESS>本地盒子的 IPv4 地址在哪里以及 192.168.0.0/16 之内。

答案1

setuid不设置补充组,只设置主组。请参阅 Upstart 错误https://bugs.launchpad.net/upstart/+bug/812870

为了验证该情况,您可以检查grep Gid /proc/YOURPID/statusvs id YOURUSER

相关内容