运行 bash 以 root 身份安装脚本 - 如何处理普通用户的文件?

Running a bash install script as root - how to handle regular users' files?

我正在编写一些 bash 脚本来安装 和配置 一些程序。
因为脚本需要安装包 - 我 运行 脚本作为 root - 这本身没有问题(即我有 root 权限等)。

然而,一旦安装了软件包,脚本就需要配置普通用户文件和获取插件等,例如

理想情况下,我会以普通用户的身份执行此操作,因为我不希望这些 git 存储库和文件归 root 所有,

示例程序片段类似于

#! /bin/bash

# Because this statement needs to be run as root - the entire script is 
# also run as root
apt-get install -y tmux

cat << EOF > ~/.tmux.conf
# 
# config stuff
#
EOF

我是否需要在脚本末尾手动将文件权限恢复给普通用户,例如

chown $USER:$USER ~/.tmux.conf 
chmod 755 ~/.tmux.conf 

或者由一个 root 另一个作为普通用户编写 2 个单独的脚本 1 运行 ?

或者有更好的方法来处理这个问题吗?

只是因为我们通常将sudo作为成为root的手段,并不意味着它不能被root用来成为用户。

因此只需在 运行 作为 $USER 的命令前加上

sudo -u $USER ....

为了更容易在一个脚本中拥有所有代码,将所有根代码收集到一个函数中,将所有用户代码收集到另一个函数中,然后 运行 脚本作为根,然后它可以 运行 与 USER 相同的脚本。我们检查脚本中人 运行 的 ID 并执行一个或另一个功能。例如:

#!/bin/bash
rootstuff(){
  ....
  [ "$USER" != root ] && sudo -u $USER [=11=]
}
userstuff(){
  ....
}

if [[ $(id) = uid=0* ]]
then  echo root
      rootstuff
else  echo user
      userstuff
fi

确保 USER 不是 root。

如果你有一堆连续的代码应该是 运行 作为普通用户(不是 root),那么你可以这样做:

sudo -s -u $USER<<EOF
echo "running codes as normal user"
EOF

注意:您可能需要检查 $USER 是普通用户还是根用户。如果您 运行 根 shell 中的脚本,$USER 的值将是 root,这是正常和预期的行为,即您正在创建的任何用户特定文件都是预计在根环境中创建。