Linux 将环境变量传递给嵌套的子级
我有一些正在设置的环境变量,我试图通过子进程的子进程访问它们。我正在尝试使用shell启动另一个进程。在我的示例中,它只是另一个保持简单的shell脚本 我浏览了shell文档,并尝试使用Linux 将环境变量传递给嵌套的子级,linux,bash,shell,environment-variables,sh,Linux,Bash,Shell,Environment Variables,Sh,我有一些正在设置的环境变量,我试图通过子进程的子进程访问它们。我正在尝试使用shell启动另一个进程。在我的示例中,它只是另一个保持简单的shell脚本 我浏览了shell文档,并尝试使用-a标志,但没有成功。如果我显式地将env变量从父级复制到子级,它将起作用 a、 嘘 #/垃圾箱/垃圾箱 #这里不行 回声$FOO parent.sh #/垃圾箱/垃圾箱 导出FOO=bar sudo-H-u用户名nohup sh-c“echo$FOO#在这里工作;sh./a.sh” 但是,如果我显式地将F
-a
标志,但没有成功。如果我显式地将env变量从父级复制到子级,它将起作用
a、 嘘
#/垃圾箱/垃圾箱
#这里不行
回声$FOO
parent.sh
#/垃圾箱/垃圾箱
导出FOO=bar
sudo-H-u用户名nohup sh-c“echo$FOO#在这里工作;sh./a.sh”
但是,如果我显式地将FOO传递给内联shell脚本,它将起作用
#/垃圾箱/垃圾箱
导出FOO=bar
sudo-H-u用户名nohup sh-c“echo$FOO;export FOO=$FOO;sh./a.sh”
是否有一种更优雅的解决方案可以将env变量传递给嵌套的子级
在我的实际实现代码中,我尝试使用的不是shell脚本,而是启动另一个依赖于env变量的进程,因此源代码脚本是不可行的。
sudo
不会保留调用方的环境,除非使用-E
选项,即使如此,sudo
也必须配置为允许为给定用户或命令保留环境
您的第一个示例,sudo-H-u username nohup sh-c“echo$FOO”在这里工作;sh./a.sh“
,与
但是由sudo
启动的sh
进程的环境中不会有FOO
。
(sudo-H-u username-E nohup sh-c“sh./a.sh”
可能会工作,但这取决于本地安全策略。-E
是一个请求,而不是命令。)
在shell处理之后的第二个示例是
sudo -H -u username nohup sh -c "echo bar;export FOO=bar; sh ./a.sh"
这里,
sh
不是从调用sudo
的shell继承FOO
;相反,您正在运行一个shell进程,该进程本身在其环境中定义了一个新变量FOO
,该变量a.sh
,然后继承。由于sudo在启动新进程时默认不保留环境,您应该指示它显式保留某个变量:
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
好问题。我的理解是,只要它是从同一个用户的进程运行,环境就会被继承。根据您的系统,“sh”可能表示实际的/bin/sh或bash的符号链接。此外,a.sh上的shebang可能指向与父shell不同的shell。IIRC,导出一个变量实际上没有限制有多少子级可以看到它,因此问题似乎与这些变量有关,而不是子级无法使用的变量。shellI刚刚更新了示例以包括shebangs。这里的问题特定于
sudo
,由于安全原因,它不会将继承的环境变量传递给它运行的进程。(如果您使用-E
选项,则会这样做,但仅当sudo
配置为允许对给定的用户或命令使用该选项时才会这样做。)-E应该可以工作,但通常您不希望将所有环境传递给子进程(例如,传递路径/主环境变量可能会导致问题),因此VAR=value更准确,尽管这些仍然受本地安全策略的约束,并且可能不被允许。它也适用于VAR=value方法吗?“在命令行上传递的变量受安全策略插件施加的限制。”但是,我认为该策略可以允许显式列出变量,同时整体拒绝继承变量。在我看来,任何解决方法都超出了问题的范围,因为它们需要系统管理员的合作,以便在sudoers
文件中提供必要的配置。
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