【问题标题】:How to run command in su mode in bash script?如何在 bash 脚本中以 su 模式运行命令?
【发布时间】:2013-11-29 18:32:57
【问题描述】:

我需要运行这两个命令:

ulimit -s 1024

echo 120000 > /proc/sys/kernel/threads-max

第一个只能在用户模式下运行(不使用 sudo 或 su),第二个只能在 su mode 下运行。我想编写一个 bash 脚本,让我运行这两个命令。第一个没问题。对于第二个,我需要 su(将用户更改为 root),运行命令,然后退出。实际上,我想使用 bash 脚本在 su 模式下运行第二个命令。有什么想法吗?

【问题讨论】:

  • 您知道您可以使用 su (root) 权限运行整个脚本,从而以相同的权限运行其中包含的所有命令吗?如果你这样做了,你有什么理由避免这样做?

标签: linux bash su


【解决方案1】:

如果您的用户有权使用“sudo tee”,那么一种解决方案是:

echo 120000 | sudo tee /proc/sys/kernel/threads-max

【讨论】:

  • 我想你想要一个管道而不是>
  • 我觉得答案太具体了。问题更多的是“我有一些命令要启动,可能有空格,可能有管道,可能有间接”我如何su user -c 没有解析问题......
【解决方案2】:

作为一项安全措施,如果不添加 sudo,您将无法以超级用户身份运行脚本。如果您希望它是无密码的,您需要运行visudo 并允许您(或执行用户)以超级用户身份运行此命令而无需确认密码。

另一种方法是在编译后的代码上使用 setuid 位。编译一个简单的程序来执行echo 120000 > /proc/...,然后把它改成root拥有:chown 0:0 executable_namechmod u+s executable_name设置setuid位。这将导致该程序的执行以其所有者的权限运行,即 root。

这与允许passwd 修改需要超级用户权限而不实际上是超级用户或sudoer 的文件的方式相同。

【讨论】:

  • 参见维基百科条目en.wikipedia.org/wiki/Setuid。它说“许多操作系统在应用于可执行的 shell 脚本时会忽略 setuid 属性。”。我在我的系统(Ubuntu 14.04)上经历过这种情况
  • 这不仅适用于 Ubuntu,这也是大多数(如果不是全部)Linux 发行版的行为方式。对于其他 UNIX 操作系统也是如此。因此,正如我在答案中所写,您必须编译 一个程序。编写 shell 脚本和编译程序是两件不同的事情。
猜你喜欢
  • 2011-04-13
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2014-12-02
相关资源
最近更新 更多