在Multiix中将Multiline,Quoted字符串作为单个命令行参数传递?

时间:2012-09-25 05:59:06

标签: linux string bash unix

我只需要将任何HTML内容作为命令行参数传递,其中包含',',`等字符?什么不是?如何在unix中将其作为单个参数传递?

4 个答案:

答案 0 :(得分:2)

如果我理解你的要求,你可以用命令行中的双引号传递任何东西,即“”。它将被视为单个参数,并在程序中作为字符串接收,可以根据需要进行解析。

这是一个c程序

#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/)' />

对于参数内的特殊字符,如“”(双引号),反斜杠\等,只需为那些带有额外转义序列的字符添加前缀\

答案 1 :(得分:2)

如果您在命令行输入内容,则可以使用以下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写​​的spawn的Lua有一个很好的实现,但我不知道它是否仍然保留。如果做不到这一点,你仍然可以使用第二个黑客:

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)        

答案 2 :(得分:1)

我一直在寻找问题的答案,但我在这里看不到,所以这里是我最终的解决方案 (不是我不传递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"

实际上用双引号将行包装成单行命令。

我希望这对其他人有用。

答案 3 :(得分:1)

这对我有用。

以下是文件(setup.json)中的多行文本,例如,内部用双引号引起来:

{
   "fieldA": "foo"
}

以及将其作为单个参数发送的方法:

setup=$(cat setup.json)
./my_util "$setup"

使用@fayyazkl的c程序(其他答案)进行测试。