【问题标题】:The difference between "sudo sh -c" and "su -c"“sudo sh -c”和“su -c”的区别
【发布时间】:2022-01-21 08:34:59
【问题描述】:

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

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

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

【问题讨论】:

  • grep '^' filecat file 有什么区别? :-)
  • 也许另见 Running a command with bash -c vs without(显然问题是关于 Bash,而不是 sh;但部分问题显然也适用于 sh -c commandcommand)。跨度>

标签: linux bash sudo


【解决方案1】:

你不需要它们中的任何一个; rc.localroot 权限运行。正确的答案是简单地运行你的命令。

/path/my_prog

如果您是root 并且想要切换到其他帐户,那么su 是有意义的。

sudo 如果您在非特权帐户上运行,并且已被授予切换到另一个帐户的权利(通常但不总是,root),通常需要能够以交互方式提供您的密码(尽管如果您确实需要,可以将其关闭;显然,在弄乱与安全相关的内容之前,您需要了解自己在做什么)。

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

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

su otheraccount -c /path/my_prog

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

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

【讨论】:

  • 以另一个用户身份运行,我见过su - otheraccount -c /path/my_prog。这和su otheraccount -c /path/my_prog有什么区别?
  • man su 很容易显示,单独的破折号指示它运行登录会话。用一句话更新了答案。
【解决方案2】:
  • sudo /path/my_prog 将以 sudo 权限执行/path/my_prog

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

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

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

【讨论】:

  • 不,它们完全不同。 su 要求你有root密码; sudo 的全部目的是使管理员能够有选择地向用户授予权限共享root密码。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2011-08-09
相关资源
最近更新 更多