从sudo提升的脚本以标准用户身份运行命令

时间:2014-10-07 14:58:31

标签: macos bash shell sudo

如果使用sudo执行了bash脚本,脚本中的命令如何作为当前登录用户而不是root运行,然后恢复为root以继续运行其他命令?

例如: -

#!/usr/bash

touch fileOwnedByRoot.txt
touch fileOwnedByUser.txt
touch otherRootFile.txt

如果使用sudo运行此脚本,而不更改命令的顺序,那么第二触摸命令如何作为标准用户运行?

脚本只是一个简单的例子,因此使用chmod更改所创建文件的所有权是无关紧要的。

我使用的实际脚本由安装程序运行,因此需要使用提升的权限运行,但必须以运行安装程序的用户运行特定命令,其名称未知。

3 个答案:

答案 0 :(得分:4)

不要将脚本作为sudo运行,只需要提升需要提升权限的命令。

#!/bin/bash
sudo touch fileOwnedByRoot.txt
touch fileOwnedByUser.txt
sudo touch otherRootFile.txt

答案 1 :(得分:4)

使用su - another_user -c "<command>"运行该特定命令:

#!/bin/bash

touch /tmp/f1
su - another_user -c "touch /tmp/f2"
touch /tmp/f3

如下面chepner所述,您需要使用$SUDO_USER$SUDO_UID来获取运行sudo命令的真实用户的名称:

su - $SUDO_USER -c "touch /tmp/f2"

这样,运行该命令的用户将触摸该文件。

您可以使用以下方式进行测试:

#!/bin/bash
echo "sudo_user: $SUDO_USER"
echo "sudo_uid: $SUDO_UID"

使用./scriptsudo ./script运行脚本。在第二种情况下,将填充值。

答案 2 :(得分:2)

根据man page环境变量,在运行sudo时设置了SUDO_USER,所以你可以这样做:

#!/usr/bash

touch fileOwnedByRoot.txt
sudo ${SUDO_USER} touch fileOwnedByUser.txt
touch otherRootFile.txt

我还没有对此进行过测试,也不知道它在OSX上是否有所不同,但值得一试。