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

时间:2015-07-12 07:46:24

标签: linux bash permissions

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

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

  • sed i s/xxx/mod_to_make/ <user_config_file>
  • git clone <plugin>
  • wget <plugin>

理想情况下,我会以常规用户身份执行此操作,因为我不希望这些git repos和文件归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 

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

或者有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

仅仅因为我们通常将 sudo 与成为root用户联系起来,并不意味着root用户不能成为用户。

因此,只需将您需要以$ USER运行的命令作为前缀

sudo -u $USER ....

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

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

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

确保USER不是root用户。

答案 1 :(得分:2)

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

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

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