我正在尝试将 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
Run Code Online (Sandbox Code Playgroud)
所以我将用户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
Run Code Online (Sandbox Code Playgroud)
<IP_ADDRESS>本地框的 IPv4 地址在哪里,在 192.168.0.0/16 之内。
setuid不设置补充组,只设置主要组。请参阅新贵错误https://bugs.launchpad.net/upstart/+bug/812870。
要验证这种情况,您可以检查grep Gid /proc/YOURPID/statusvs id YOURUSER。
| 归档时间: |
|
| 查看次数: |
9678 次 |
| 最近记录: |