Bash 有条件地使用 sudo

Bash conditional use of sudo

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

使用每个命令有条件地检查版本

#!/usr/bin/bash

# script is run by "user1"

version=""
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

使用评估

#!/usr/bin/bash

# script is run by "user1"

version=""
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 运行。而且无论版本如何,某些命令都需要 运行 as user1。只有较高版本的命令子集需要 运行 as user2.

我喜欢 eval 因为我可以检查一次并将变量添加到必要的命令中。我不喜欢 eval,因为它看起来有点危险而且让人恶心。但是我还没有想出更好的解决方案。有任何输入吗?

您采用的 eval 方法一切正常,但您不需要使用 eval,只需删除 run_as 变量周围的引号并像这样执行:

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

Bash 将插入 $run_as 的值并创建解释器随后将尝试执行的字符串。

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

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

它将解释命令