私が使ったスクリプトから基本この関数は、すべてのsudo操作を完了するために新しいsudo-bashを生成します。
#!/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
install_ssがusingというサブシェルで見つかることも確認しましたsudo bash -c "$FUNC; sudo_stuffs"
。
しかし、結果はまだ出てきました。
bash:行2:install_ss:コマンドが見つかりません
どうですか?
答え1
を使用しないでくださいfunction
。つまり、2-4行は次のようになります。
sudo_stuffs() {
install_ss
}
その後、呼び出すには次のようにします。
sudo_stuffs
最後に、ユーザーがrootでないときにroot権限を取得するには、スクリプトの先頭(1行目の後ろ)に次の3行を追加します。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によって生成されたサブシェルが関数が何であるsudo
かがわからないためです。install_ss
答え3
あなたの行 sudo bash -c "$FUNC; sudo_stuffs" 私にとっては間違っているようです。 sudo -cの後には引用符で囲んだ実行したいコマンド、閉じる引用符、最後にコマンドを実行するユーザー名が続く必要があります。
sudo -c "bash FUNC sudo_stuffs" MY_USERNAME
このように関数を呼び出すことが可能かどうかはわかりません。私は通常スクリプトから関数を呼び出しますが、関数を構成するコマンドが特定のユーザーとして実行されるようにするには、関数に suco -c "command" my_username を追加します。