我正在尝试配置 Upstart 以运行一个小型实用程序,该实用程序需要访问 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/status
vs id YOURUSER
。