我正在使用 Ubuntu 10.04 LTS 服务器,具有默认安全模型(root 锁定,sudo用于提升权限)。sudo -i当我需要以提升的权限运行一系列命令时,或者当我需要在仅具有 root 权限的目录中翻找时,我偶尔会喜欢使用。
有时,在设置将作为自己的非特权系统帐户 ( adduser --system --group --no-create-home --disabled-login some-daemon-user)运行的软件时,我发现我需要以该用户的身份运行一系列命令,而不是我自己或 root 用户。我试过使用sudo -i -u some-daemon-user,但它只返回一个1状态而没有任何错误消息。
我已经检查了syslog、messages、auth和debug日志文件/var/log,它们都没有包含任何引用sudo或相关帐户的消息。
那么,是否有可能成为另一个非 root 用户,sudo 风格而不只是设置密码并登录(作为他们)?我的系统是否以某种方式“损坏”了还是我做错了?
我正在尝试将 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 …Run Code Online (Sandbox Code Playgroud)