複数の機能を使用してbashスクリプトでsudoコマンドを実行しますか?

複数の機能を使用してbashスクリプトでsudoコマンドを実行しますか?

私が使ったスクリプトから基本この関数は、すべての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_ssinstall_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 を追加します。

関連情報