Bash有条件地使用sudo

时间:2018-07-10 13:38:35

标签: bash eval sudo

所以我有一个bash脚本,根据它针对的版本,可能需要使用sudo运行一些命令。我提出了两个选择,但是我想我正在寻找其他建议。这是我正在做的示例脚本:

根据每个命令进行版本检查

#!/usr/bin/bash

# script is run by "user1"

version="$1"
export version

if [[ "$version" -eq "10" ]]
then
  cp /tmp/file.txt /data/application/files/file.txt
elif [[ "$version" -eq "11" ]]
then
  sudo -u user2 cp /tmp/file.txt /data/application/files/file.txt
fi

exit 0

使用eval

#!/usr/bin/bash

# script is run by "user1"

version="$1"
export version
export run_as=""

if [[ "$version" -eq "10" ]]
then
  run_as=""
elif [[ "$version" -eq "11" ]]
then
  run_as="sudo -u user2"
fi

eval "$run_as" cp /tmp/file.txt /data/application/files/file.txt

exit 0

该脚本将始终由user1运行。无论版本如何,都需要以user1身份运行某些命令。只有较高版本的命令才需要以user2身份运行命令的子集。

我喜欢eval,因为我可以检查一次,只需将变量添加到必要的命令中即可。我不喜欢评估,因为它似乎有点危险,而且感觉很邪恶。但是我还没有想到更好的解决方案。有输入吗?

2 个答案:

答案 0 :(得分:1)

您采用的eval方法一切都很好,但是您不需要使用eval,只需删除run_as变量周围的引号并执行以下操作:< / p>

$run_as cp /tmp/file.txt /data/application/files/file.txt

Bash将插值$run_as的值,并创建一个字符串,解释器将尝试执行该字符串。

答案 1 :(得分:0)

或者更好地使用像这样的数组:

run_as=(sudo -u user2)
"${run_as[@]}" cp /tmp/file.txt /data/application/files/file.txt

它将解释命令