"sudo sh -c"和"su -c"的区别

The difference between "sudo sh -c" and "su -c"

我想在启动时以 root 身份启动一个程序,并将以下行之一添加到 rc.local:

sudo /path/my_prog
sudo sh -c "/path/my_prog"
su -c "/path/my_prog"

这三行有什么区别,哪一行是正确的?

  • sudo /path/my_prog 将以 sudo 权限执行 /path/my_prog

  • sudo sh -c "/path/my_prog" 将使用 sudo 权限执行 /path/my_prog(由标志 -c 指定)和 sh

  • su -c "/path/my_prog" 将使用您当前的 shell 使用 sudo 权限执行 /path/my_prog(由标志 -c 指定)。

使用正确的取决于您的用例,所以实际上这取决于您。恕我直言,sudo foosu -c foo 基本相同。

你不需要它们中的任何一个; rc.local 运行 具有 root 权限。正确答案是 运行 你的命令。

/path/my_prog

su 如果您 root 并想切换到其他帐户,

是有意义的。

sudo 如果您 运行 正在使用非特权帐户,并且已被授予切换到另一个帐户的权利(通常,但并非总是 root),那么

sudo 是有意义的,通常要求能够以交互方式提供您的密码(尽管如果您确实需要可以关闭此功能;显然,您需要在弄乱 security-related 东西之前了解自己在做什么)。

sh -c "command" 只是 运行 command 的一种低效方式。 运行 当您实际需要 shell 功能(例如通配符扩展、重定向等)或 shell 内置函数(例如 cd.[=24=)时,shell 才有意义]

理想情况下,您可能希望确保 my_prog 运行 在专用的非特权系统帐户上;那么,语法将是

su otheraccount -c /path/my_prog

显然您需要创建 otheraccount 并确保它具有执行此特定任务所需的权限。

su 可选地让您在帐户名前添加一个破折号以使其 运行 登录会话;但是对于服务帐户,这可能没有意义。