bash -c至少在以下示例中命令不相同:

bash -c至少在以下示例中命令不相同:

$somevariable可能包含空格和其他需要 bash 的特殊字符,并引入安全风险。以下命令等效吗?如果没有,你能给他们排名吗?

bash -c 'somecommand "$1"' bash "$somevariable"
bash -c "somecommand '$somevariable'"
bash -c "somecommand \"$somevariable\""

以下命令等效吗?如果没有,你能给他们排名吗?

find -exec sh -c 'something "$@"' sh {} \;
find -exec sh -c "something '{}'" \;
find -exec sh -c "something \"{}\"" \;
find -exec sh -c 'something "{}"' \;

我找不到每个组中的命令之间的不等效性。

来源于为“bash -c”执行的命令提供参数的方法。这里我想弄清楚findutils手册是否提示的原因

find -exec sh -c 'something "$@"' sh {} \;

代替

find -exec sh -c "something {}" \;

是因为

  • 引用或

  • 移动{}到要执行的命令之外sh -c

我在上面第二组中编写的其他命令也同样有效吗?

谢谢。


要攻击组find -exec sh -c "something '{}'" \;中的第二个命令find

$ touch "'; echo world '"
$ find . -exec sh -c "ls '{}'" \;
''\''; echo world '\'''
''\''; echo world '\'''
world 

答案1

bash -c至少在以下示例中命令不相同:

$ var='a
$(uname)'

$ bash -c 'echo "$1"' bash "$var"
a
$(uname)

$ bash -c "echo '$var'"
a
$(uname)

$ bash -c "echo \"$var\""
a
Darwin

命令find也有所不同:

$ touch 'a
> $(uname)'

$ find . -exec sh -c 'echo "$@"' sh {} \;
.
./a
$(uname)

$ find . -exec sh -c "echo '{}'" \;
.
./a
$(uname)

$ find . -exec sh -c "echo \"{}\"" \;
.
./a
Darwin

$ find . -exec sh -c 'echo "{}"' \;
.
./a
Darwin

所以看来以下内容允许任意代码执行:

  • bash -c "echo \"$var\""
  • find . -exec sh -c "echo \"{}\"" \;
  • find . -exec sh -c 'echo "{}"' \;

相关内容