Linux 具有shellshock固定bash版本的非导入环境变量
我有一个简单的bash脚本,它修改了将由后续二进制文件使用的环境变量。下面是我的基本脚本:Linux 具有shellshock固定bash版本的非导入环境变量,linux,bash,shellshock-bash-bug,Linux,Bash,Shellshock Bash Bug,我有一个简单的bash脚本,它修改了将由后续二进制文件使用的环境变量。下面是我的基本脚本: #!/bin/bash export DBROOT="NEW_DIRECTORY" export TERM=xterm su -c " <test_process> " - omni #/bin/bash export DBROOT=“新建目录” 导出术语=xterm su-c”“-omni DBROOT变量被“test_process”用作环境变量。此外,DBROOT还使用另一个值“
#!/bin/bash
export DBROOT="NEW_DIRECTORY"
export TERM=xterm
su -c " <test_process> " - omni
#/bin/bash
export DBROOT=“新建目录”
导出术语=xterm
su-c”“-omni
DBROOT变量被“test_process”用作环境变量。此外,DBROOT还使用另一个值“OLD_DIRECTORY”作为全局环境变量定义。脚本的目标是强制“test_进程”使用新的_目录值(导出值)
对于未打补丁的bash版本,测试成功了。但是,在修补bash上的shellshock bug之后,test_进程不会读取DBROOT的导出值,也不会读取全局环境变量。这就好像“test_进程”忽略了导出的和全局变量
我没有“测试过程”的源代码。
bash版本是版本2.05b.0(1)-发行版(rpm版本是bash-2.05b-41.7.i386.rpm),我在Red Hat Enterprise Linux上作为版本3运行
更新:
在通过设置编译时定义重新编译bash 2.05b last源代码之后
#定义非交互式登录shell
剧本又起作用了。
没有这个定义,bash错误地解释了
-
su命令之后的-
字符,这是您正在使用的非常古老的软件
我建议尝试:
su -c "DBROOT='NEW_DIRECTORY' TERM='xterm' <test_process> " - omni
su-c“DBROOT='NEW_目录'TERM='xterm'”-omni
这会将环境设置移动到由
su
运行的shell中,而不是依赖su
来中继环境。这是您正在使用的非常古老的软件
我建议尝试:
su -c "DBROOT='NEW_DIRECTORY' TERM='xterm' <test_process> " - omni
su-c“DBROOT='NEW_目录'TERM='xterm'”-omni
这会将环境设置移动到由
su
运行的shell中,而不是依赖su
来中继环境。最后一个为shellshock接受的补丁将导出的函数移动到它们自己的命名空间中(并修复了一系列解析器错误)。我发现很难相信它会对您的代码产生任何影响,尽管当然,无论是谁将RHEL3的古老外壳进行后移,都可能会犯一些错误。另外,su
通常有很多运动部件——壳外可能出现问题的东西并不缺乏。不管怎样——如果你想确定su
不是问题,就把它拿出来,看看你是否能重现;如果您只需在最后运行bash
(而不是su
命令)并查看是否设置了DBROOT
,就可以产生问题。事实上,如果在那个时候没有设置,那么(并且只有在那个时候)您才知道这确实是发行版的shellshock补丁中的一个bug,而不是系统中的其他地方发生的任何事情。su
通常故意转储su之前的环境变量,因为否则它们将是安全问题。它有一个不这样做的标志(实际上是两个):-m
。虽然我不知道在3使用的任何古代版本中是否都是这样。你猜对了,如果我在没有su
命令的情况下运行脚本,进程将继承导出的和全局变量。我找到了问题的根源。这不是由于su
造成的。这是因为狂欢节。我用config top.h文件*/中定义的#define NON_INTERACTIVE_LOGIN_SHELLS/*重新编译了源代码,我的旧脚本成功了。shellshock的最终接受补丁将导出的函数移动到它们自己的名称空间中(并修复了一系列解析器错误)。我发现很难相信它会对您的代码产生任何影响,尽管当然,无论是谁将RHEL3的古老外壳进行后移,都可能会犯一些错误。另外,su
通常有很多运动部件——壳外可能出现问题的东西并不缺乏。不管怎样——如果你想确定su
不是问题,就把它拿出来,看看你是否能重现;如果您只需在最后运行bash
(而不是su
命令)并查看是否设置了DBROOT
,就可以产生问题。事实上,如果在那个时候没有设置,那么(并且只有在那个时候)您才知道这确实是发行版的shellshock补丁中的一个bug,而不是系统中的其他地方发生的任何事情。su
通常故意转储su之前的环境变量,因为否则它们将是安全问题。它有一个不这样做的标志(实际上是两个):-m
。虽然我不知道在3使用的任何古代版本中是否都是这样。你猜对了,如果我在没有su
命令的情况下运行脚本,进程将继承导出的和全局变量。我找到了问题的根源。这不是由于su
造成的。这是因为狂欢节。我用config top.h文件*/
中定义的#define NON_INTERACTIVE_LOGIN_shell/*重新编译了源代码,
和我的旧脚本通过设置DBROOT
如您所建议的那样工作,
继承该值。但是,由于其他环境变量未继承,因此会出现其他问题。通过尝试su-c”“
命令继承了全局变量和导出变量。通过调查bash代码,我发现su-c
命令导致启动-bash
。所以-
就是问题所在。通过在bash代码中设置#define NON_INTERACTIVE_LOGIN_SHELLS
,问题得到了解决。通过按照您的建议设置DBROOT
,
继承该值。但是,由于其他环境变量未继承,因此会出现其他问题。通过尝试su-c”“
命令继承了全局变量和导出变量。通过调查bash代码,我发现su-c
命令导致启动-bash
。所以-
就是问题所在。通过在bash代码中设置#定义非交互式登录shell