Sudoを使用したBashスクリプト機能の実行

Sudoを使用したBashスクリプト機能の実行

私はさまざまなタスクを実行するスクリプトを持っていますが、そのほとんどは特別な権限を必要としません。ただし、関数に含まれる特定の部分の1つにはroot権限が必要です。

スクリプト全体をrootとして実行する必要はありません。スクリプト内でroot権限でこの関数を呼び出すことができます。とにかく大部分はインタラクティブなので、必要に応じてパスワードを要求することは問題ではありません。ただし、使用しようとすると、次の結果sudo functionxが表示されます。

sudo: functionx: command not found

予想どおりにexport違いはありませんね。いくつかの理由で関数を分割して別のスクリプトとして実行するのではなく、スクリプトから直接関数を実行できることを願っています。

私の関数を抽出せずにsudoに「表示」して適切なディレクトリを見つけて、スタンドアロンスクリプトで実行する方法はありますか?

関数自体は1ページ程度の長さで、複数の文字列を含みます。一部は二重引用符で囲まれ、一部は一重引用符で囲まれています。また、基本スクリプトの他の場所で定義されているメニュー機能にも依存します。

sudo ANYを使用している人がその機能を実行できることを願っています。その機能の1つがパスワードを変更することです。

ベストアンサー1

これを行う簡単で直感的な方法はなく、やや古いものであることを認めています。しかし、次のようにすることができます。

function hello()
{
    echo "Hello!"
}

# Test that it works.
hello

FUNC=$(declare -f hello)
sudo bash -c "$FUNC; hello"

またはより簡単に:

sudo bash -c "$(declare -f hello); hello"

これは私にとって効果的です。

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
$ hello
Hello!
$
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Hello!

デフォルトでは、declare -f関数の内容が返され、bash -cインラインに渡されます。

FUNC=$(declare -f hello)bashの外部インスタンスからすべての機能をエクスポートするにはFUNC=$(declare -f)

編集する

引用に関するコメントを処理するには、次の例をご覧ください。

$ hello()
> {
> echo "This 'is a' test."
> }
$ declare -f hello
hello ()
{
    echo "This 'is a' test."
}
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Password:
This 'is a' test.

おすすめ記事