如何管道netcat的输出? xargs 和引号的问题

如何管道netcat的输出? xargs 和引号的问题

我正在尝试通过以下方式传输 nc 收到的任何内容:

nc -l 20000 | xargs /root/test

...它工作得很好,除非 xargs 收到带引号的参数 - 它将它们分开,就好像它们是分开的一样...

迭代参数 ( /root/test) 显示它们未正确传递:

for i in $*; do 
    echo "$i"
done

发送echo 'test1 test2'到端口 20000 (nc) 会导致:

echo
'test1
test2'

我尝试将请求( nc 收到的内容)封装在双引号中,并"echo \'test1 test2\'"根据以下答案转义任何引号(例如 ):https://unix.stackexchange.com/a/38151/224371,但这没有帮助,我只是得到:

echo
\'test1
test2\'

答案1

netcat 不应该影响通过它发送的数据,因此我将跳过它并专注于通过管道传输到 xargs。

这里:

echo "aa 'bb cc'" | xargs     

shell 删除一组引号,将字符串发送aa 'bb cc'到 xargs。 xargs 默认情况下将带引号的字符串作为单个元素(删除引号),将字符串传递aabb cc它运行的命令。

另一方面,这里:

echo "aa \'bb cc\'" | xargs   

shell 再次删除一组引号,留下aa \'bb cc\'.单引号(带或不带反斜杠)在双引号内并不特殊。不过,双引号内的双引号需要转义。

xargs 看到该字符串,执行自己的引号删除,但由于现在引号已转义,因此它只是删除反斜杠并在空格上拆分。留下三个字符串:aa'bbcc'。这就是你所看到的。

通常,我们希望相反:避免让 xargs 处理引号,因为它们可能是文件名的一部分。所以你会在这里看到五打问题推荐xargs -0xargs -d'\n'替代。但是如果您希望 xargs 处理带引号的字符串,则需要将引号发送给它而不进行转义。

另一个问题是您的测试脚本使用$*.如果没有引号,这将拆分空格上的所有参数并对结果单词执行通配。 (使用引号,它将导致参数连接为单个字符串。)您几乎总是想使用它"$@"。或者在这里只是:

for i do
  echo "$i"
done

甚至:

printf '%s\n' "$@"

因此,请检查引号的转义并使用"$@"代替$*

$ cat args.sh 
for x in "$@" ; do echo ":$x" ; done

$ echo "aa 'bb cc' \"dd ee\""
aa 'bb cc' "dd ee"

$ echo "aa 'bb cc' \"dd ee\"" | xargs ./args.sh 
:aa
:bb cc
:dd ee

相关内容