首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Bash在启动脚本时将PS4值重置为其默认值?

为什么Bash在启动脚本时将PS4值重置为其默认值?
EN

Stack Overflow用户
提问于 2022-10-11 12:32:12
回答 1查看 42关注 0票数 1

下面是一个简单的测试脚本(名为"testps")

代码语言:javascript
复制
#!/bin/bash
echo PS4=$PS4

我设置并输出了这样的PS4:

代码语言:javascript
复制
export PS4='$LINENO:'

当我使用./testpsbash ./testps运行它时,结果是:

代码语言:javascript
复制
PS4=+

看来"PS4“的值已经被重置了。

到目前为止,我发现定制PS4的唯一方法是在bash -l中添加了export PS4='$LINENO:'之后使用.bashrc运行脚本。

我错过了什么?

还请注意,在使用ksh时,PS4是从环境(如果有的话)用它的值初始化的。

EN

回答 1

Stack Overflow用户

发布于 2022-10-11 12:43:20

这种行为并不会发生在所有用户身上--只有在作为root用户运行时才会忽略来自环境的PS4副本,因为shell版本4.4。

引用bash源中的CHANGES

作为根用户运行的

g. Shells不再继承环境中的PS4,从而关闭了一个涉及执行命令替换的PS4扩展的安全漏洞。

这是因为环境变量被传递给setuid可执行文件,而一些setuid可执行文件(不明智地)使用system()popen()等来调用shell。在setuid中运行时,ld.so会忽略LD_LIBRARY_PATHLD_PRELOAD和类似的内容,而bash在历史上不会对可能导致任意执行的环境变量这样做。

正如在https://www.openwall.com/lists/oss-security/2016/09/26/9中所描述的,可以利用以下方法来利用这个问题:

代码语言:javascript
复制
env -i SHELLOPTS=xtrace PS4='$(id)' ./test

...would运行id,而不是将$(id)打印为xtrace的一部分,即使对./test的调用跨越了特权边界。

就我个人而言,我在我的脚本中设置了PS4 --它被忽略了,除非它们是与set -x一起运行的,那么为什么不建立一个有意义的值呢?

如果您想强迫它产生的副作用少于从bash -lbash -i获得的副作用,请将BASH_ENV设置为具有可用于执行所需初始化的文件的名称。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74028211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档