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

标签 macos bash shell sudo

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

例如: -

#!/usr/bash

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

如果这个脚本是用sudo运行的,不改变命令的顺序,第二个touch命令如何以标准用户的身份运行?

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

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

最佳答案

使用 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"

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

关于macos - 从 sudo 提升的脚本以标准用户身份运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26239022/

相关文章:

macos - 无法找到或加载类 : org. apache.hadoop.hdfs.server.namenode.NameNode

macos - 如何在 Cocoa 应用程序中显示文件列表?

macos - 无法将分支推送到 github "Use git@github.com:Paratron/spacebattles.git"

bash - 如何在 bash 中将一列数字更改为以空格分隔的列表

linux - 当我们在 bash shell 中将 $ 放在变量之前时——什么时候不呢?

linux - 如何在 bash 中打印感叹号?

bash - 在 Bash 中,如何查看字符串是否不在数组中?

swift - Swift 中的 USB 设备路径

linux - 删除名称为 mongoID 且早于特定时间戳的文件

node.js - 如何从 "sh"shell(在 Nodejs 上)激活 Conda 环境?