在脚本中,我使用了主要的函数创建一个新的 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 添加到函数中。