他のサーバーから環境変数設定を取得する

他のサーバーから環境変数設定を取得する

別のボックスのすべての "env"変数を私のローカルコンピュータにインポートしたいと思います。環境変数をローカルボックスのenv_var.txtにコピーしました。私は次のことをしました。

for i in `cat env_var.txt`; do export $i; done

しかし、これはすべての環境変数を正しく設定していないようです。すでに編集しています。

do export $i

入力する

do echo $i

そして変数はすべてが大丈夫だと思われます。この問題の原因は何ですか?それとも、すべての環境変数を取得する別の方法がありますか?

ベストアンサー1

TL、DR:輸出

export -p >env_var.sh

そして収入

. env_var.sh

env_var.txtコードが有効かどうかは、変数名と値の書式と特殊文字(つまり、シェル構文で特別な意味を持つ文字)によって異なります。

`cat env_var.txt`引用符のないコマンドの置き換えです。引用符で囲まれていない変数コマンドの置き換えには、「split + glob」演算子が適用されます。まず、コマンドの出力を変数valueの文字に分割し、IFS各部分をファイル名のワイルドカードパターンとして解釈し、一致する各パターンの一部のファイルを一致するファイルに置き換えます。名前。結果はforループが繰り返される単語のリストです。

引用符のないコマンドの置き換えは、ユーザーが望むことはほとんどなく、この場合は確かに望むものではありません。ただし、ファイル構文が次の場合には機能します。env 変数の値には*?\[スペースが含まれていません。

env_var.txtyesの場合env、理解できない解析方法を使用する代わりに、実際の構文(改行で区切られた割り当て)に基づいて解析すると、より良い結果が得られます。最も簡単な方法である分割+グローブ演算子を使用するには、IFS改行文字にのみ設定してワイルドカードの一致をオフにします。

set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS

しかし、受信側では解決されない問題、すなわち出力がenv不明であるという問題がある。以下を考慮すると:

foo=bar
hello=world

foo2つの変数(1つは値として呼び出され、1つはbarhelloとして呼び出されます)があるのworldか​​、1つだけがfoo値として呼び出されるのかわかりません。

bar
hello=world

明示的な方法で環境変数をエクスポートするには使用せず、env代わりにexport使用してください。このコマンドは、export -pすべての環境変数の値をシェルから解析できる形式で一覧表示します。したがって、輸出の面で以下を実行します。

export -p >env_var.sh

インポートの観点から、以下を実行します。

. env_var.sh

警告:Bashでは出力をexport -p解析できますが、bashでのみ可能です。他のshスタイルシェルで動作する出力を取得するには、POSIXLY_CORRECT任意の値に設定します。これは他のシェルに有害な影響を与えないため、次のことができます。

(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh

以前の値に設定しても、出力POSIXLY_CORRECTには何の影響もありません。環境内になく、実行後に表示されないか、環境内にあり、その値は変更されません。しかし、これはbashがexport出力でexport -pbash固有の構文の代わりに移植可能な構文を使用するように強制するのに十分ですdeclare

環境変数をインポートすると任意のコードが実行される可能性があるため、env_var.txt信頼できるソースからのみインポートまたはインポートしてください。原因はenv_var.shコードが実行されるという事実ではなく、環境変数です。単に、、などの変数を取得するだけでコードが追加で実行されることがあります。. env_var.shPATHLD_PRELOADENV

おすすめ記事