'sudo' 对 root 意味着什么?

Xia*_*Liu 5 root sudo 14.04

我在 Ubuntu 14.04 中运行以下命令:

root@ubuntu:~# service rpki-ca restart 
stop: Unknown job: rpki-ca
start: Unknown job: rpki-ca
root@ubuntu:~# sudo service rpki-ca restart 
rpki-ca stop/waiting
rpki-ca start/running
root@ubuntu:~#
Run Code Online (Sandbox Code Playgroud)

sudo第二个命令的作用是什么?为什么需要root sudo

kos*_*kos 3

好吧,谷歌搜索,找到这个U&L 答案,检查其修订历史记录并遵循修订版 #1中引用的来源,这恰好是一个Upstart 错误;问题是,当切换到 root 运行时,su环境$UPSTART_SESSION变量是从以前的环境中携带的,而不是再次设置。

经过一番绞尽脑汁和谷歌搜索后,我发现了一篇文章(https://unix.stackexchange.com/questions/120050/sudo-service-vsftpd-returns-unknown-job-vsftpd)表明

sudo service xxxx start(或停止,或重新启动)

有效,同时

`service xxxx start(在 su 会话中)

不起作用。

所以罪魁祸首显然是环境:如果你使用“su”而不是“sudo su”或“su -”进入root,“service”也无法正常工作,因为“su”将承载大部分正常用户环境到根会话。

经过一些测试,我发现罪魁祸首是 UPSTART_SESSION 环境变量,它在您“su”时设置,但在您“sudo su”或“su -”时未设置。以下是一些测试结果:

-- 不起作用

jsveiga@dell:~$ su
Password:
root@dell:/home/jsveiga# service smbd restart
stop: Unknown job: smbd
start: Unknown job: smbd
Run Code Online (Sandbox Code Playgroud)

-- 甚至可以在 su 会话中工作

root@dell:/home/jsveiga# sudo service smbd restart
smbd stop/waiting
smbd start/running, process 3823
Run Code Online (Sandbox Code Playgroud)

——作品

root@dell:/home/jsveiga# exit
jsveiga@dell:~$ sudo su
root@dell:/home/jsveiga# service smbd restart
smbd stop/waiting
smbd start/running, process 3862
Run Code Online (Sandbox Code Playgroud)

——作品

root@dell:/home/jsveiga# exit
jsveiga@dell:~$ su -
Password:
root@dell:~# service smbd restart
smbd stop/waiting
smbd start/running, process 3905
Run Code Online (Sandbox Code Playgroud)

-- 执行 su 然后取消 UPSTART_SESSION 的设置

root@dell:/home/jsveiga# exit
jsveiga@dell:~$ su
Password:
root@dell:/home/jsveiga# service smbd restart
stop: Unknown job: smbd
start: Unknown job: smbd
root@dell:/home/jsveiga# unset UPSTART_SESSION
root@dell:/home/jsveiga# service smbd restart
smbd stop/waiting
smbd start/running, process 4244
Run Code Online (Sandbox Code Playgroud)

因此,启动/停止脚本仅因UPSTART_SESSION环境变量的存在而失败。

BR,若昂·S·维加

要解决此问题,只需取消设置$UPSTART_SESSION

unset UPSTART_SESSION
Run Code Online (Sandbox Code Playgroud)

或通过其他方式切换到 root,例如su -sudo susudo -i