Bash 有条件地使用 sudo

Nic*_*k S 6 bash sudo eval

所以我有一个 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
Run Code Online (Sandbox Code Playgroud)

使用评估

#!/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
Run Code Online (Sandbox Code Playgroud)

该脚本将始终由 user1 运行。而且无论版本如何,有些命令都需要以user1身份运行。只有较高版本才需要以 user2 身份运行一部分命令。

我喜欢 eval 因为我可以检查一次并将变量添加到必要的命令中。我不喜欢 eval 因为它看起来有点危险而且感觉很恶心。但我还没有想到更好的解决方案。有什么意见吗?

Tom*_*son 4

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

$run_as cp /tmp/file.txt /data/application/files/file.txt
Run Code Online (Sandbox Code Playgroud)

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