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.

答え2

Sudoそのために、関数とエイリアスを呼び出すことができるbash関数を直接作成しました。

function Sudo {
        local firstArg=$1
        if [ $(type -t $firstArg) = function ]
        then
                shift && command sudo bash -c "$(declare -f $firstArg);$firstArg $*"
        elif [ $(type -t $firstArg) = alias ]
        then
                alias sudo='\sudo '
                eval "sudo $@"
        else
                command sudo "$@"
        fi
}

答え3

「問題」は、sudoセキュリティリスクから保護するために環境を整理し(許可されているいくつかの変数を除く)、特定の変数を事前定義された安全な値に設定することです。つまり、実際には問題にはなりません。これは特徴です。

たとえば、PATHを事前定義された値に設定またはPATH="/path/to/myevildirectory:$PATH"設定sudoしないと、実行するすべてのコマンド(つまりほとんどのスクリプト)のフルパス名を指定しないスクリプトは、/path/to/myevildirectory他のディレクトリの前に検索されます。lsあるいは、他の一般的なツールなどのコマンドをそこに置くことで、grepシステムが望むすべての操作を簡単に実行できます。

最も簡単で最も良い方法は、関数をスクリプトとして書き換えてパスのどこかに保存することです(または、コマンドラインsudoでスクリプトのフルパスを指定します。コマンドのsudo実行を許可するように設定しない限り、とにかくこれを行う必要があります) 。ルートとして)実行可能にします。chmod +x /path/to/scriptname.sh

シェル関数をスクリプトに書き換えることは、関数定義内のコマンドをファイルに保存するのと同じくらい簡単です(そして行を除くfunction ...)。{}

答え4

関数とエイリアスを組み合わせることができます。

例:

function hello_fn() {
    echo "Hello!" 
}

alias hello='bash -c "$(declare -f hello_fn); hello_fn"' 
alias sudo='sudo '

それからsudo hello仕事

関連情報