如果使用sudo执行了bash脚本,脚本中的命令如何作为当前登录用户而不是root运行,然后恢复为root以继续运行其他命令?
例如: -
#!/usr/bash
touch fileOwnedByRoot.txt
touch fileOwnedByUser.txt
touch otherRootFile.txt
如果使用sudo运行此脚本,而不更改命令的顺序,那么第二触摸命令如何作为标准用户运行?
脚本只是一个简单的例子,因此使用chmod更改所创建文件的所有权是无关紧要的。
我使用的实际脚本由安装程序运行,因此需要使用提升的权限运行,但必须以运行安装程序的用户运行特定命令,其名称未知。
答案 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"
使用./script
或sudo ./script
运行脚本。在第二种情况下,将填充值。
答案 2 :(得分:2)
根据man page环境变量,在运行sudo时设置了SUDO_USER,所以你可以这样做:
#!/usr/bash
touch fileOwnedByRoot.txt
sudo ${SUDO_USER} touch fileOwnedByUser.txt
touch otherRootFile.txt
我还没有对此进行过测试,也不知道它在OSX上是否有所不同,但值得一试。