2015-11-05 104 views
0

我想用别的东西替换linux命令中的空间。 例如:Linux中的转义空间命令

echo "test"  --->  echo\040"test" 

我知道\ 040无法正常工作,但我正在寻找一个合适的替代品。

+0

我只是想知道为什么? –

+1

什么是上下文?一般来说,不能改变解析器用于初始解析命令行的内容。 – chepner

+0

@LucM我有一个有限的服务,我能够通过参数只有有限的关键字。例如ping x.x.x.x我试过了,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。我是笔测试人员,我想完成我的观察,我需要确保这个漏洞有多大危险。例如用户是否可以修改或添加和执行文件?用户(入侵者)必须将命令更改为无空格命令,因为它似乎是命令解析器对空间敏感。 – Giac

回答

0

感谢chepner的洞察力,现在我确定只要您需要传递一个参数(因为您必须将命令与参数分隔开一个空格),这是不可能的。但是,如果你不这样做(即,如果参数总是相同的话),你可以创建一个脚本或函数来执行包含空格的代码,这些代码可以在不使用空间的情况下被调用。

+0

是的,这已经有一个空间!我需要一个不包含任何空间的替代品! – Giac

+0

哦!然后Mark Plotnik的评论是适合你的。我会重做我的答案,以扩展它。 – Aaron

+0

不,Mark的评论在这种情况下不起作用:试着'IFS =,'后面加'echo,foo'。你会得到一个“找不到命令”的错误,而不是打印“foo”。 – chepner

1

一般来说,你不能这样做。 shell解析器的工作原理大致如下:

  1. 根据单独的空格(空格和制表符)将行拆分为单词。
  2. 对每个初始单词应用扩展。
  3. 确定要运行并执行的命令。

你的问题是,你想改变在第1步中如何识别单词;你不能这样做。


在某些情况下,您可以使用eval执行预解析命令。例如:

cmd="echo,foo" 
IFS=, 
eval $cmd 

此输出foo因为当无引号$cmd膨胀时,它字分裂,echofoo后产生两个空格分隔单词。然后由eval执行,产生期望的结果。然而,它是强烈建议你不要在实践中写这样的代码,因为它很容易执行代码,你不打算与eval


对于你给的例子(用户输入ping x.x.x.x),你应该做这样的事情。不要将输入作为代码执行,而应将其视为执行脚本提供的代码的请求。

read cmd argument 
case $cmd in 
    ping) ping "$argument" ;; 
    *) printf 'Unrecognized command "%s"\n' "$cmd" >&2 ;; 
esac 

现在,没有任意的执行。无论用户输入什么内容,脚本要么执行ping,要么执行单个参数,否则脚本会输出错误消息。

+0

我有有限的服务,我只能通过有限的关键字参数。例如ping x.x.x.x我试过了,我发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。关于ping x.x.x.x&cat Giac

0

我不知道这是否是您所期望的

$cat j 
echo "test" 

新行

$ cat j|sed -e 's/\s/\xC/'g 
echo 
    "test" 
1

更换空间,您可以尝试其他空白比空间。标签,CR,LF,...

如果直接运行在bash,你可以使用定义的shell变量:

echo$IFS"test" 

或被C类的字符串逃过你的命令,并运行一个:

$(cat<<<$'echo\x20test') 
+0

完美!第二个很棒... – Giac