プロセスを別のプロセスとして開始したいので、uid
情報が不要なので、実行する$(env)
前に環境を削除しました。sudo -u powerlessuser /bin/processCmd
env -i sudo -u powerlessuser /bin/processCmd
sudoは環境を補充する必要があると思うので、そうしないように頼みたいです。たとえば、$SUDO_USER
コマンドを呼び出した私(tm)に関する情報までお知らせするセットがありますがpowerlessuser
、非常に不明だと思われます。/bin/processCmd
助けが必要ですか?
env -i
sudoの後にストリッピングを使用することも可能だと思います。つまり、次のようにします。
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
転換が起こる可能性があるかもしれない。そうでなければ、内部の誰かがsudo
sudoが不要なものだけを入れることができるので、そのような作業が不可能であるとソースを参照することができるでしょう$SUDO_USER
。
繰り返しますが、xyの問題はありません。実際には実際に問題ではないからです。つまり、「Unixの哲学でうまく機能するものの1つであるsudo
後続の作業で解決されているので、ここで欠点はありません。env -i
」env -i
、つまりクリーンな環境。sudo
sudoは他の単一の目的を持っており、環境変数の漏洩を気にしないので、そこで合理的な動作をするべきではありません。それにもかかわらず、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"
したがって、両方をカスタマイズできます。変数が多い場合は扱いにくい可能性があるため、スクリプトを使用する方が良いでしょう。
sudo
TERMCAP
とにかくそれを拒否してください。これは、環境からこれらの変数を削除するのに役立つ変数の(長い)リストです。
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の意味が異なるので、順序に注意してください。