我正在做 Shellshock 实验室,该教程提供了一种通过环境变量将函数传递给子进程的方法:
$ foo='() { echo "hello"; }'
$ export foo
$ /bin/bash
$ foo
hello
但是,当我在 Ubuntu 20.04 上尝试执行此操作时,foo
它并没有转换为子进程中的函数。
$ foo='() { echo "hello"; }'
$ export foo
$ /bin/bash
$ foo
Command 'foo' not found, did you mean: ...
我是否遗漏了什么,或者这种方法仅适用于某些版本的 bash?
答案1
在 Bash 中你定义shell 函数像这样:
name () { ...; }
或者像这样:
function name { ...; }
多行代码如下:
name ()
{
...
...
}
或者像这样:
function name
{
...
...
}
并且是出口-f
像这样:
export -f name
因此,像这样声明你的函数:
foo () { echo "hello"; }
然后像这样导出:
export -f foo
技术通告
也就是说,您所描述的类似于大约十年前在 Bash 中存在的历史漏洞(特别是在“函数导出”功能/机制语法和后续解析中),但很久以前就已修复,因此不再适用于 Bash,除非您的系统上仍然有未修补/未更新的 Bash 版本。
请参见:
答案2
从 Bash 4.4 开始,函数现在导出为BASH_FUNC_foo%%
而不是foo
。这不是有效的 shell 变量名,因此您不能直接在 Bash 中设置它,但您可以使用其他命令(例如 )env
来设置它env BASH_FUNC_foo%%='() { echo "hello"; }' /bin/bash
。