シェルスクリプトが呼び出された元の環境に復元できますか?私は元の環境にアクセスする能力に依存するプログラムを書くことを意図していません。それが正しいかどうか知りたい。アクセシビリティ保証。
新しい環境変数を生成し、PATH値を変更する単純なシェルスクリプトがあります。
#!/bin/sh
PATH=/usr/bin
NEW_VAR=new_var_value; export NEW_VAR
env
元の値を復元する方法はありますか、またはシェルスクリプトを実行するときに最初に存在しないようにPATH
指示する方法はありますか?NEW_VAR
実行可能ファイルのパスがすべてシステムコールの初期に設定されているargv
ことはわかっていますが、実行可能ファイルが「どこ」または「どのように」保存されているかはわかりません。私の考えには、 を使用してパラメータベクトルと環境を操作する機能が実際におよび のデフォルト設定を変更しないようです。シェルの内部には、他のコマンド(たとえば)を呼び出すときに新しい呼び出しが正しいコマンドを使用することを確認するロジックのみがあります。envp
execv*(2)
shift
export
unexport
argv
envp
execv*(2)
envp
some-command | LC_ALL=C sort
ベストアンサー1
ほとんどのシステムでは、このコマンドを使用して、コマンドの実行中にps
環境を表示できます。移植性がなく、すべてのシステムが安定した解析を可能にするわけではありませんが、必要なものが特定のUnixバリアントで動作するように初期環境の「興味深い」部分を抽出するのは簡単です。たとえば、Linux および *BSD では、次のようになります。
ps eww $$
またはSolarisおよびLinuxの場合:
cat /proc/$$/environ
またはSolarisおよびAIXの場合:
pargs -e $$
環境の古いコンテンツを非表示にする必要がある場合は、すべてのシェルプロセス(バックグラウンドサブシェルを含む)が終了していることを確認してください。リークしない方法でデータを渡すには、環境変数の代わりにパイプを使用します。
exec sh -c 'unset pw; pw=$PASSWORD; unset PASSWORD; printf %s "$pw" | exec theprogram'
ほとんどの(すべて最新の)Unixバリアントでは、プロセス環境は同じユーザーにのみ表示されます。通常、実行中のユーザーはパラメータのみを表示できますps
。したがって、環境全体に機密データを渡すことは大丈夫です。これを排除するのは基本的なセキュリティではなく、強化の問題にすぎません。