Linux 具有shellshock固定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还使用另一个值“

我有一个简单的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还使用另一个值“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