在具有多个功能的 bash 脚本中执行 sudo 命令?

在具有多个功能的 bash 脚本中执行 sudo 命令?

在脚本中,我使用了主要的函数创建一个新的 sudo-bash 来完成 sudo 的所有操作。

#!/bin/bash
function sudo_stuffs() { 
  install_ss
}
function install_ss() {
  echo something
}



main() {
  # 切换目录
  cd /tmp 
  if [[ ! -d "install_shadowsocks" ]]; then
    mkdir install_shadowsocks
  fi
  cd install_shadowsocks

  # 如果没有sudo权限
  if ! sudo -v 1>/dev/null 2>&1 ; then
    # 提示登录有权限的账户 
    echo "--- You don't have authority, login to the root or others in sudoers. ---"
    exit 1
  fi

  export -f install_ss
  FUNC=$(declare -f sudo_stuffs)
  sudo bash -c "$FUNC; sudo_stuffs"
}

main "$@"

但实际上在sudo_stuffs功能,还有更详细的功能,例如 安装_SS功能。

我什至曾经export -f install_ss确保可以在使用 调用的子 shell 中找到 install_ss sudo bash -c "$FUNC; sudo_stuffs"

但结果还是来了

bash:第 2 行:install_ss:未找到命令

请问我能做什么?

答案1

不要使用function,即第 2-4 行将是:

sudo_stuffs() { 
  install_ss
}

然后调用它,只需使用:

sudo_stuffs

最后,要在用户不是 root 时获得 root 权限,请将这 3 行添加到脚本的开头(第 1 行之后)。这将通过 运行脚本sudo,它将检查用户是否有权运行sudo并(通常)要求输入密码:

if [ `id -u` -gt 0 ]; then
    exec sudo "$0" "$@"
fi

答案2

我发现了一个重复项,但根据 StackExchange 的规则我无法设置它。

所以我在这里发布:

https://askubuntu.com/questions/57915/environment-variables-when-run-with-sudo

命令丢失的真正原因是sudo命令丢弃了从 shell 导出的环境变量,因此 sudo 生成的子 shell 将无法知道什么是install_ss函数。

答案3

你的行 sudo bash -c "$FUNC; sudo_stuffs" 对我来说看起来是错误的。 sudo -c 后面应该是您希望在引号中执行的命令,结束引号,然后将您希望执行该命令的用户名放在末尾。

sudo -c "bash FUNC sudo_stuffs" MY_USERNAME

我不确定是否可以通过这种方式调用函数。我通常会在脚本中调用我的函数,如果您希望组成函数的命令作为特定用户运行,您可以将 suco -c“command”my_username 添加到函数中。

相关内容