如何在以root身份运行的shell脚本中变成非root用户?是否可行?

3

假设我有一个运行一堆子脚本的shell脚本。我决定必须以root身份运行我的脚本,因为它运行的前几个子脚本需要以root身份运行。但是,有两个被超级脚本运行的子脚本不能以root身份运行。假设我的脚本已经以root身份运行,如何取消root身份以运行最后两个子脚本?这是否可能?

2个回答

4

您需要一个特定的非root用户,以便您的子脚本可以在其下运行。我们将称此用户为fred。然后,您拥有root权限的脚本可以简单地执行以下操作:

su fred /path/to/subscript-A
su fred /path/to/subscript-B

与nsayer的回答相反,您可能不能使用nobody,因为nobody的整个重点在于它对任何东西都没有写权限。有时这正是您想要的,但我打赌您的子脚本需要写入文件系统...

Zack 的观点是用户必须是一个具有 shell 的“人类”用户才能做任何有用的事情,因此例如 nobodywww-data 是行不通的。这是一个好观点,但并不需要每次都执行 su fred (some command)... 只需执行 su fred,然后在单独的命令中以 fred 的身份发出任何命令,最后执行 exit 即可。 - Dagg Nabbit
2
那只有在交互式 shell 中才有效;在脚本中,您必须给 su fred 一个命令。当然,您可以将一堆命令打包到子脚本中,并将其传递给 su,但这似乎是 OP 已经完成的工作。另外,值得注意的是,即使 fred/etc/passwd 中没有 shell,su -s /bin/sh fred -- -c exec /path/to/subscript 也可以工作,如果该帐户仅从脚本中使用(这可能是个好主意),您可能更喜欢让 fred 保持这种状态。 - zwol

1

使用su命令以其他用户身份运行所需的命令。

su nobody ls /tmp

这并不一定是错误的,但很可能下标需要写入文件系统,在这种情况下(AIUI),不能使用“nobody”。 - zwol
他并没有那么具体。他问如何以非root用户身份运行脚本。我回答了他的问题,并提供了一个示例。唉。 - nsayer
1
我不是故意找茬,但我会指出那些随意使用“nobody”的例子,因为滥用“nobody”会导致安全漏洞。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接