考虑以下:
$ a='friend'
$ b='printf "%s\n" "$a"'
$ eval "$b"
friend
这应该是完全安全的。然而,我们可以说这$b
是相同的但$a
未知。那么是否存在任何安全隐患?eval "$b"
如果有,我可以采取什么措施来减轻这些隐患?
答案1
如果b
包含文字 string ,即您事先printf "%s\n" "$a"
没有扩展它,那么是的,应该没问题。不过,不知道为什么你需要那里,因为你只有一个静态命令。直接运行就可以了。$a
eval "$b"
eval
printf "%s\n" "$a"
您在评论中说您想存储一些命令以备将来使用。这就是函数的工作。例如,该printf
命令可以变成这样的函数:
println() {
printf "%s\n" "$1"
}
你以什么方式运行println "hello there"
,println "$a"
或者什么。"$1"
是函数的第一个参数,但当然您可以改为读取 stdin,或使用多个参数("$2"
, "$3"
, ...; 或将它们全部作为列表"$@"
(类似"${array[@]}"
))。
类似地,对于较长的操作集:
#!/bin/bash
say_hi() {
echo "hello, $1"
}
louder() {
echo "$1!"
}
funcs=(say_hi louder)
names=(Huey Dewey Louie)
for name in "${names[@]}"; do
tmp=$name
for func in "${funcs[@]}"; do
tmp=$($func "$tmp")
done
echo "result: $tmp"
done