【问题标题】:Pass environment variables to nested children将环境变量传递给嵌套的子级
【发布时间】:2019-12-10 02:28:13
【问题描述】:

我有一些正在设置的环境变量,并试图通过子进程的子进程访问它们。我正在尝试使用 shell 启动另一个进程。在我的示例中,它只是另一个使事情变得简单的 shell 脚本。

我浏览了 shell 文档,并尝试使用 -a 标志,但没有成功。如果我明确地将环境变量从父级复制到子级,它将起作用。

a.sh

#!/bin/sh
# does not work here

 echo $FOO

parent.sh

#!/bin/sh
export FOO=bar
sudo -H -u username nohup sh -c "echo $FOO #works here; sh ./a.sh"

但是,如果我将 FOO 显式传递给内联 shell 脚本,它将起作用

#!/bin/sh

export FOO=bar
sudo -H -u username nohup sh -c "echo $FOO;export FOO=$FOO; sh ./a.sh"

是否有更优雅的解决方案将环境变量传递给嵌套子级?

在我的实际实现代码中,它不是我尝试使用的 shell 脚本,而是启动另一个依赖于环境变量的进程,因此获取脚本是不可行的。

【问题讨论】:

  • 很好的问题。我的理解是,只要它是从同一用户的进程运行的,环境就会被继承。
  • 所以可能会发生一些事情。根据您的系统,“sh”可能意味着实际的 /bin/sh 或 bash 的符号链接。此外,a.sh 上的 shebang 可能指向与父 shell 不同的 shell。 IIRC,导出一个变量对于有多少孩子会看到它几乎没有限制,因此问题似乎与这些问题有关,而不是孩子外壳无法使用该变量
  • 我刚刚更新了示例以包含 shebangs。
  • 这里的问题是sudo特有的,出于安全原因,它不会将继承的环境变量传递给它运行的进程。 (如果您使用 -E 选项,它会这样做,但前提是 sudo 配置为允许给定用户或命令使用该选项。)

标签: linux bash shell environment-variables sh


【解决方案1】:

因为sudo在启动新进程时默认不保留环境,所以你应该明确指示它保留某个var:

sudo FOO=100 -H -u username nohup sh -c "sh ./a.sh"
nohup: ignoring input and appending output to ‘nohup.out’
cat nohup.out
100

【讨论】:

    【解决方案2】:

    sudo 不会保留调用者的环境,除非您使用 -E 选项,即使这样,sudo 也必须配置为允许为给定用户或命令保留环境.

    您的第一个示例 sudo -H -u username nohup sh -c "echo $FOO #works here; sh ./a.sh" 等效于(在 shell 处理之后)

    sudo -H -u username nohup sh -c "echo bar; sh ./a.sh"
    

    但是由sudo 启动的sh 进程在其环境中不会有FOO。 (不过,sudo -H -u username -E nohup sh -c "sh ./a.sh" 可能 起作用,具体取决于本地安全策略。-E请求,而不是命令。)

    你的第二个例子,经过外壳处理,是

    sudo -H -u username nohup sh -c "echo bar;export FOO=bar; sh ./a.sh"
    

    这里,sh 没有从调用sudo 的shell 继承FOO;相反,您正在运行一个 shell 进程,该进程 自身its 环境中定义了一个 new 变量 FOO,然后 a.sh 将继承该变量。

    【讨论】:

    • -E 应该可以工作,但通常你不想将所有环境传递给你的子进程(例如传递 PATH/HOME 环境变量可能会导致麻烦),所以 VAR=value 是更准确的方法
    • 好点,尽管这些仍受当地安全政策的约束,可能不允许。
    • 它是否也适用于 VAR=value 方法?
    • "在命令行中传递的变量受安全策略插件的限制。"但是,我认为该策略可以允许明确列出的变量,同时拒绝作为一个整体继承的变量。
    • IMO,任何变通方法都超出了问题的范围,因为它们需要系统管理员的合作才能在 sudoers 文件中提供必要的配置。
    猜你喜欢
    • 2013-12-29
    • 2021-09-05
    • 2020-03-27
    • 2017-03-30
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多