どうですか:sudoを使用し、環境、特に$ SUDO_USERを設定しないでください。

どうですか:sudoを使用し、環境、特に$ SUDO_USERを設定しないでください。

プロセスを別のプロセスとして開始したいので、uid情報が不要なので、実行する$(env)前に環境を削除しました。sudo -u powerlessuser /bin/processCmd

env -i sudo -u powerlessuser /bin/processCmd

sudoは環境を補充する必要があると思うので、そうしないように頼みたいです。たとえば、$SUDO_USERコマンドを呼び出した私(tm)に関する情報までお知らせするセットがありますがpowerlessuser、非常に不明だと思われます。/bin/processCmd助けが必要ですか?

env -isudoの後にストリッピングを使用することも可能だと思います。つまり、次のようにします。

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

sudoこれで問題はある程度解決されましたが、情報を追加せずにこれを行う方法があるかどうかを知りたかったのです。マン8スドsudo環境の追加に関するドキュメントが見つかりましたが、sudoこれを実行しない方法についてのヘルプはありません。

@terdonCheck:不要な環境変数をすべて整理したいです。どの環境変数が必要かはわかりませんが、質問に固執するために$SUDO_USERプロセスを権限のないユーザーと呼ぶ必要がある理由が見つかりませんでした。だからsudo漏れないようにする方法を知ってうれしいです。SUDO_USER

修正する- XYの問題

私はxyの問題を避けることに非常に興味がありますが、ここではそうではありません。その理由は、実際に質問に記載されているものとは別の問題がないためです。sudoが何もしないようにする方法を探しています。、私は合理的に期待することができます:sudoはきれいな環境を取得し、せいぜいここに項目を追加しないでください$SUDO_USER。つまり、すでに問題を解決しているので、他の問題はないと確信していますsudo。つまり、私はこれを行うことができます。

sudo -u powerlessuser /usr/bin/env -i /bin/processCmd

「sudoの後にクリーンアップする」ので、followを使用するとenv -i問題が解決するため、私の問題は決して他のものではありません。私が必要とする唯一のことは、 sudo --empty-env少なくとも$SUDO_USERどのプロセスがuid元のプロセスを実行したかを知らせずに、空の環境で新しいプロセスを作成する方法が実際にあるかどうかを知ることですsudo

この問題を解決することに興味を持っているすべての人に感謝の言葉を伝えたいです!私も少し時間を置いているが、まだそのような--empty-env転換が起こる可能性があるかもしれない。そうでなければ、内部の誰かがsudosudoが不要なものだけを入れることができるので、そのような作業が不可能であるとソースを参照することができるでしょう$SUDO_USER

繰り返しますが、xyの問題はありません。実際には実際に問題ではないからです。つまり、「Unixの哲学でうまく機能するものの1つであるsudo後続の作業で解決されているので、ここで欠点はありません。env -ienv -i、つまりクリーンな環境。sudosudoは他の単一の目的を持っており、環境変数の漏洩を気にしないので、そこで合理的な動作をするべきではありません。それにもかかわらず、sudo環境変数に関連するいくつかのフラグを提供するという事実は、人々が環境変数をうまく処理すると誤解する可能性があります。

答え1

ツールが要件を満たしていない場合は、ラッパースクリプトを使用してツールを改善できます。私はこのスクリプトを使います(noenv)ビルド環境をきれいに保ちます。次のように使用してください

sudo -u powerlessuser noenv /bin/processCmd

必要なことをします。 (スクリプトは完全修飾パスになければなりません。そうでない場合は、コマンドにそのパスを指定する必要があります。)

スクリプト:

#!/bin/sh
# $Id: noenv,v 1.3 2014/05/10 22:43:32 tom Exp $
# trim the environment to minimal (PATH may still be long...)
env | sed -e 's/=.*//' -e '/^[  ].*/d' | \
while true
do
    read value
    if test -z "$value" ; then
        # honor assignments to variables in the parameter list
        while test $# != 0
        do
            case "x$1" in
            *=*)
                eval $1
                name=`echo "$1"|sed -e 's/=.*//'`
                export $name
                shift 1
                ;;
            *)
                break
                ;;
            esac
        done
        exec "$@"
        break
    fi
    case "$value" in
    HOME|PATH|USER|_|SHLVL|TMPDIR|LOGNAME)
        ;;
    *\ *|*\(*|*\)*|*\!*)
        #echo "...skipping $value"
        ;;
    *)
        #echo value:"$value"
        unset "$value"
        ;;
    esac
done

/usr/bin/env明確にするために、私が作成しているいくつかのシステムには問題がないため、前述のPOSIX機能を使用してこの記事を書いていません:options -i。これらは、以下を含む古いBSDシステムです。Sun OS 4そしてHPUX 10(FreeBSDの「env」マニュアルページと比較してメモリを確認してください。)

ちなみに、このスクリプトは複数行の値を削除します(ただし、これは発生する可能性がある唯一の値であり、TERMCAP非常に古いシステムでのみ可能です)。 2番目のsed式はtabsumを含む範囲でなければなりませんspace

POSIX(より興味がある可能性がある)の場合、関数を使用して親環境で選択した値を渡す操作を実行できます。たとえば、次のようになります。

env -i foo="bar"

したがって、両方をカスタマイズできます。変数が多い場合は扱いにくい可能性があるため、スクリプトを使用する方が良いでしょう。

sudoTERMCAPとにかくそれを拒否してください。これは、環境からこれらの変数を削除するのに役立つ変数の(長い)リストです。

sudo特定の変数設定にこだわります。ソースコードを読むplugins/sudoers/env.c、最後に次のブロックが表示されますrebuild_env

/* Add the SUDO_USER, SUDO_UID, SUDO_GID environment variables. */
CHECK_SETENV2("SUDO_USER", user_name, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_uid);
CHECK_SETENV2("SUDO_UID", idbuf, true, true);
snprintf(idbuf, sizeof(idbuf), "%u", (unsigned int) user_gid);
CHECK_SETENV2("SUDO_GID", idbuf, true, true);

debug_return_bool(true);

つまり、関数が正常に返される直前にそれ自身を設定します。変わりやすい、自分のものを使う価値

答え2

SUDO_USERなどの特定の環境変数のみを設定解除したい場合は、sudoを呼び出すときに "env -u"オプションを使用してそれらをフィルタリングできます。

例えば、

sudo -u powerless env -u SUDO_USER -u SUDO_UID ./some_script.sh

./some_script.sh スクリプトが実行されている環境で SUDO_USER と SUDO_UID を設定解除します。

sudoとenvが後に来るときは-uの意味が異なるので、順序に注意してください。

関連情報