我想用别的东西替换linux命令中的空间。 例如:Linux中的转义空间命令
echo "test" ---> echo\040"test"
我知道\ 040无法正常工作,但我正在寻找一个合适的替代品。
我想用别的东西替换linux命令中的空间。 例如:Linux中的转义空间命令
echo "test" ---> echo\040"test"
我知道\ 040无法正常工作,但我正在寻找一个合适的替代品。
感谢chepner的洞察力,现在我确定只要您需要传递一个参数(因为您必须将命令与参数分隔开一个空格),这是不可能的。但是,如果你不这样做(即,如果参数总是相同的话),你可以创建一个脚本或函数来执行包含空格的代码,这些代码可以在不使用空间的情况下被调用。
一般来说,你不能这样做。 shell解析器的工作原理大致如下:
你的问题是,你想改变在第1步中如何识别单词;你不能这样做。
在某些情况下,您可以使用eval
执行预解析命令。例如:
cmd="echo,foo"
IFS=,
eval $cmd
此输出foo
因为当无引号$cmd
膨胀时,它字分裂,echo
和foo
后产生两个空格分隔单词。然后由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
,要么执行单个参数,否则脚本会输出错误消息。
我有有限的服务,我只能通过有限的关键字参数。例如ping x.x.x.x我试过了,我发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。关于ping x.x.x.x&cat var/log/...我是一个笔测试者,我想完成我的观察,我需要确保这个漏洞有多危险。例如用户是否可以修改或添加和执行文件?用户(入侵者)必须将命令更改为无空格命令,因为它似乎是命令解析器对空间敏感。 – Giac
我不知道这是否是您所期望的
$cat j
echo "test"
新行
$ cat j|sed -e 's/\s/\xC/'g
echo
"test"
更换空间,您可以尝试其他空白比空间。标签,CR,LF,...
如果直接运行在bash,你可以使用定义的shell变量:
echo$IFS"test"
或被C类的字符串逃过你的命令,并运行一个:
$(cat<<<$'echo\x20test')
完美!第二个很棒... – Giac
我只是想知道为什么? –
什么是上下文?一般来说,不能改变解析器用于初始解析命令行的内容。 – chepner
@LucM我有一个有限的服务,我能够通过参数只有有限的关键字。例如ping x.x.x.x我试过了,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。我是笔测试人员,我想完成我的观察,我需要确保这个漏洞有多大危险。例如用户是否可以修改或添加和执行文件?用户(入侵者)必须将命令更改为无空格命令,因为它似乎是命令解析器对空间敏感。 – Giac