还有一个类似的问题涉及“包装”方案,您想在其中替换为例如cd
调用buildin的命令cd
。
但是,鉴于shellshock等人,并且知道bash从环境中导入功能,所以我进行了一些测试,但找不到cd
从脚本中安全调用内置函数的方法。
考虑一下
cd() { echo "muahaha"; }
export -f cd
在此环境中使用调用的所有脚本cd
都会中断(请考虑类似的效果cd dir && rm -rf .
)。
有用于检查命令类型的命令(通常称为type
)和用于执行内置版本而不是功能(builtin
和command
)的命令。但是,瞧,这些也可以使用函数覆盖
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
将产生以下内容:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
有什么方法可以安全地强制bash使用内置命令,或者至少在不清除整个环境的情况下检测到该命令不是内置命令?
我知道,如果有人控制了您的环境,您可能还是很烦,但是至少对于别名,您可以选择不插入别名来调用\
它。
env
未将其也重新定义为函数时。这太可怕了。我首先想到特殊字符会有所帮助-使用完整路径调用,包括/
,.
用于来源等。但是这些也可以用于函数名称!您可以重新定义所需的任何函数,但是很难回到调用原始命令的位置。
#/bin/sh
如果这不是默认的交互式外壳程序,请编写脚本。
env
命令之前运行脚本,如下所示:env -i <SCRIPT.sh>