我应该在启动脚本中使用“sudo”还是“su”?

我应该在启动脚本中使用“sudo”还是“su”?

我有一个个人程序,具有服务器/客户端设计。

它的服务器守护进程部分应该作为其自己的受限用户运行,并且该程序的设计目的不是像某些 Linux 程序那样放弃其 root 权限(如果以 root 身份启动)。

所以我的问题是,在它的启动脚本中/etc/init.d/,我应该使用sudosu以另一个用户身份运行这个守护进程吗?这有什么不同吗?两者中的任何一个都可以工作吗?还有别的事吗?

该操作系统是一种定制的 GNU/Linux 操作系统,使用“Linux From Scratch”指令构建,并且两个程序都可以正确运行。

答案1

在这两者中,我将用于su此目的,因为它的可配置性较低,因此更可预测。如果您sudo在 init 脚本中使用,然后(无意或故意)删除root ALL=(ALL) ALL中的条目/etc/sudoers,您的 init 脚本将神秘地中断。

此外,我将使用以下形式来进一步减少配置占用空间:

su -s /bin/sh -c "my_program my_args etc" my_user

-s选项意味着您可以将用户的默认 shell 更改为 /bin/false 或 /sbin/nologin 或其他内容,而不会破坏脚本。/dev/null如果您的程序本身尚未处理该问题,您可能还希望将标准 I/O 重定向到或其他合适的位置。

答案2

为了方便起见,我建议你看看CHPST来自 runit 管理程序堆栈的程序。它非常方便,可以避免命令行参数转义等混乱,这对sudo/来说是一种痛苦su

如果你想以另一个用户的身份运行程序,你可以这样调用它:

chpst -u my_user /path/to/program

它确实setsid在你的程序上setgidexecve仅此而已(它还有很多其他不错的功能)。

如果您的发行版包括忙碌盒,你也可以检查它是否chpst编译了小程序,你可能已经有了它并且不需要单独的包。

答案3

如果您可以轻松地更改程序以使其放弃其特权,那么这是最好的方法。在启动脚本中切换用户 ID 很麻烦而且相当不灵活,即使它确实“有效”。

答案4

从技术上讲,两者都应该可以正常工作,但是您可能希望在这里遵循约定。 sudo 通常用于提升到 root 权限以运行单个命令,而 su 通常用于更改为新用户,然后以该新用户身份运行命令:

也就是说,如果您快速进行 Google 搜索,就会发现关于 sudo 与 su 的一些看法:

相关内容