web-dev-qa-db-ja.com

別のサーバーからの環境変数設定のインポート

別のボックスからローカルマシンにすべての「env」変数をインポートしたいと思います。 env変数をローカルボックスのenv_var.txtにコピーしました。私は以下を実行しました:

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

ただし、これではすべての環境変数が正しく設定されていないようです。変更しました

do export $i

do echo $i

変数はすべて正常に表示されているようです。この問題の原因は何ですか。または、すべての環境変数をインポートする別の方法はありますか?

2
keyboard_solo

TL、DR:エクスポート

export -p >env_var.sh

とインポート

. env_var.sh

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

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

引用符で囲まれていないコマンド置換が必要な場合はめったにありません。この場合、それは間違いなく必要なものではありません。ただし、ファイルの構文が次の場合は機能します。 envの出力と変数の値に*?\[または空白が含まれていない。

env_var.txtenvの出力である場合、意味のない構文解析メソッドを使用するよりも、実際の構文(改行区切りの割り当て)に従って構文解析すると、より良い結果が得られます。 。これを行う最も簡単な方法であるsplit + glob演算子を使用する場合は、IFSを改行のみに設定し、ワイルドカード照合をオフにします。

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

ただし、受信側では解決できない問題があり、envの出力があいまいです。次の内容を考えると:

foo=bar
hello=world

2つの変数(値がfoobarと呼ばれるものと、値helloworldと呼ばれるもの)があるか、または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を以前の値に設定しても、出力に違いはありません。これは、環境に存在せず、これを実行した後でもないか、または環境とその値に存在します変わりません。ただし、exportを使用したbash固有の構文ではなく、export -pの出力でdeclareを使用した移植可能な構文をbashに使用させるだけで十分です。

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

その方法でbash "source"コマンドを使用します。

source env_var.txt

すべての変数をインポートする必要があります。

詳細: https://en.wikipedia.org/wiki/Dot_(command)

1
guile