从另一台服务器导入环境变量设置

从另一台服务器导入环境变量设置

我想将所有“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您的代码是否有效取决于变量名称和值中存在的格式以及特殊字符(即在 shell 语法中具有特殊含义的字符)。

`cat env_var.txt`是不带引号的命令替换。不加引号的变量命令替换会对其应用“split+glob”运算符:首先在变量值中的字符处拆分命令的输出IFS,然后将每个部分解释为文件名通配符模式并替换每个匹配的模式一些文件通过匹配文件的名称。结果是for循环迭代的单词列表。

不带引号的命令替换很少是您想要的,在这种情况下它绝对不是您想要的。但是,如果文件的语法是例如以下输出,它确实可以工作env 并且变量的值不包含任何*?\[或空格

如果env_var.txt是 的输出env,如果根据其实际语法(换行符分隔的赋值)对其进行解析,而不是使用没有意义的解析方法,可以获得更好的结果。如果您想使用 split+glob 运算符(这是最简单的方法),请设置IFS为仅换行符,并关闭通配符匹配。

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

然而,有一个问题在接收方无法解决,即 的输出env不明确。鉴于以下内容:

foo=bar
hello=world

无法判断是否有两个变量(一个foo用 value调用bar,一个hello用 value调用world),还是只有一个用foovalue调用

bar
hello=world

要以明确的方式导出环境变量,不使用envexport改用。该命令export -p以可由 shell 解析的方式列出所有环境变量的值。所以在导出方面,运行

export -p >env_var.sh

在导入方面,运行

. env_var.sh

警告:在 bash 中, 的输出export -p是可解析的,但只能由 bash 解析。要获得在其他 sh 样式 shell 中工作的输出,请设置POSIXLY_CORRECT为任意值。这对其他 shell 没有有害影响,所以你可以这样做

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

设置POSIXLY_CORRECT为之前的值不会对输出产生影响 - 要么它不在环境中并且运行后也不会出现,要么它在环境中并且它的值不会改变。但这足以强制 bash在 的export输出中使用可移植语法,export -p而不是 bash 特定的语法declare

请注意,导入环境变量可能会导致执行任意代码,因此请确保仅从您信任的源导入env_var.txt或导入。罪魁祸首是环境变量,而不是执行代码的env_var.sh事实:仅导入诸如、、等变量就可能导致代码进一步执行。. env_var.shPATHLD_PRELOADENV

答案2

以这种方式使用 bash“source”命令:

source env_var.txt

应导入所有变量。

了解更多信息:https://en.wikipedia.org/wiki/Dot_(命令)

相关内容