下面是一个简单的测试脚本(名为"testps")
#!/bin/bash
echo PS4=$PS4我设置并输出了这样的PS4:
export PS4='$LINENO:'当我使用./testps或bash ./testps运行它时,结果是:
PS4=+看来"PS4“的值已经被重置了。
到目前为止,我发现定制PS4的唯一方法是在bash -l中添加了export PS4='$LINENO:'之后使用.bashrc运行脚本。
我错过了什么?
还请注意,在使用ksh时,PS4是从环境(如果有的话)用它的值初始化的。
发布于 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_PATH、LD_PRELOAD和类似的内容,而bash在历史上不会对可能导致任意执行的环境变量这样做。
正如在https://www.openwall.com/lists/oss-security/2016/09/26/9中所描述的,可以利用以下方法来利用这个问题:
env -i SHELLOPTS=xtrace PS4='$(id)' ./test...would运行id,而不是将$(id)打印为xtrace的一部分,即使对./test的调用跨越了特权边界。
就我个人而言,我在我的脚本中设置了PS4 --它被忽略了,除非它们是与set -x一起运行的,那么为什么不建立一个有意义的值呢?
如果您想强迫它产生的副作用少于从bash -l或bash -i获得的副作用,请将BASH_ENV设置为具有可用于执行所需初始化的文件的名称。
https://stackoverflow.com/questions/74028211
复制相似问题