我只需要将任何 HTML 内容作为命令行参数传递,其中包括诸如 '、" 、` 之类的字符等等?如何在 unix 中将其作为单个参数传递?
4 回答
如果您在命令行键入,则可以使用以下 hack:
some_program -some_option some_argument "$(cat)"
any text you like with ` or " or $ or < or whatever
^D
最后一件事是 control-D(文件结束)
要将其放入 bash 脚本中,您可以使用 Here 文档:
some_program -some_option some_argument "$(cat <<'EOF'
any text you like with ` or " or $ or < or whatever
EOF
)"
只要文本不完全是 EOF 字符(如果是,您只需将两个地方的 EOF 都更改为其他内容),这将起作用。
但我认为这些都不是你想要做的。我认为您正试图从另一个程序(在 Lua 中)调用一个程序。不幸的是,开箱即用的 Lua 不提供任何可以做到这一点的功能。它只提供 os.execute,它使用 shell(/bin/sh,而不是 bash)来解释命令行。
Mark Edgar为 Luaspawn
编写了一个很好的实现,但我不知道它是否仍然被维护。如果做不到这一点,您仍然可以使用第二个技巧:
require("os")
function call_with_arg(prog, rawtext)
return os.execute(prog.." \"$(cat <<'EOF'\n"..rawtext.."\nEOF\n)\"")
end
local html =
[=[<html><body><img src="image.png" onload='alert("loaded")'/></body></html>]=]
call_with_arg("echo >somefile.txt", html)
我一直在寻找问题的答案,但我在这里并没有真正看到,所以这是我最终得到的解决方案(不是我没有传递 HTML 或类似的东西,而是类似的)
例如,这些psql
工具接受可以是多行的命令,但它们需要在双引号字符串中传递。
我从推荐以下内容的其他答案开始:
CMD=$(cat << EOM
CREATE TABLE mytable
(
id bigint NOT NULL,
sid bigint NOT NULL,
obs timestamp without time zone NOT NULL,
rcv timestamp without time zone NOT NULL,
uid bigint NOT NULL,
CONSTRAINT pkey PRIMARY KEY (id)
)
EOM
)
sudo -u postgres psql db -c $CMD
但这不起作用,因为该命令现在缺少引号,并且使用 "$CMD" 不会删除换行符,因此它仍然作为多行传递...
然而
echo $CMD
将在一行中打印命令
所以最后使用:
CMD=$(echo $(cat << EOM
CREATE TABLE mytable
(
id bigint NOT NULL,
sid bigint NOT NULL,
obs timestamp without time zone NOT NULL,
rcv timestamp without time zone NOT NULL,
uid bigint NOT NULL,
CONSTRAINT pkey PRIMARY KEY (id)
)
EOM
))
sudo -u postgres psql db -c "$CMD"
实际上将该行用双引号括起来,形成一个单行命令。
我希望这对其他人有用。
如果我正确理解您的要求,您可以从命令行用双引号传递任何东西,即“”。它将被视为单个参数并在程序中作为字符串接收,可以根据需要进行解析。
这是交流程序
#include <stdio.h>
int main(int c, char *argv[])
{
printf("argument is %s\n", argv[1]);
return 0;
}
在控制台上,我编译并运行它
$ gcc args.c
$ ./a.out "<img src=\"image.png\" onload='alert(/loaded/)' />"
输出是
论据是
<img src="image.png" onload='alert(/loaded/)' />
对于参数中的特殊字符,例如“”(双引号)、反斜杠 \ 等,只需在这些字符前面加上一个额外的转义序列 \
这对我有用。
这是文件 ( setup.json
) 中的多行文本,例如带有内部双引号:
{
"fieldA": "foo"
}
以下是如何将其作为单个参数发送:
setup=$(cat setup.json)
./my_util "$setup"
使用来自@fayyazkl 的 c 程序(其他答案)来测试它。