linux命令中的转义空间
我想用其他东西替换linux命令中的空间。 例如:linux命令中的转义空间,linux,bash,Linux,Bash,我想用其他东西替换linux命令中的空间。 例如: echo "test" ---> echo\040"test" cmd="echo,foo" IFS=, eval $cmd 我知道\040不起作用,但我正在寻找合适的替代品。由于chepner的洞察力,我现在确信只要您需要传递一个参数就不可能了(因为您必须将命令与参数分隔一个空格)。但是,如果您不这样做(即,如果参数始终相同),您可以创建一个脚本或函数,该脚本或函数将执行包含空格的代码,这些代码可以在不使用空格的情
echo "test" ---> echo\040"test"
cmd="echo,foo"
IFS=,
eval $cmd
我知道\040不起作用,但我正在寻找合适的替代品。由于chepner的洞察力,我现在确信只要您需要传递一个参数就不可能了(因为您必须将命令与参数分隔一个空格)。但是,如果您不这样做(即,如果参数始终相同),您可以创建一个脚本或函数,该脚本或函数将执行包含空格的代码,这些代码可以在不使用空格的情况下调用。通常,您无法执行此操作。shell解析器的工作原理大致如下:
在某些上下文中,可以使用
eval
执行预解析的命令。例如:
echo "test" ---> echo\040"test"
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,要么打印一条错误消息。我不知道这是否是您所期望的
$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')
$(catYes,这已经有一个空格了!我需要一个不包含任何空格的替代方案!!哦!那么Mark Plotnik的评论就适合你了。我将修改我的答案以扩展它。不,Mark的评论在这种情况下没有帮助:尝试IFS=,
然后是echo,foo
。你会得到一个“找不到命令”错误,而不是打印“foo”.@chepner这就是我目前正在尝试的,但它不应该工作吗?或者IFS的使用仅限于某一组函数性?解析器首先根据空格将行拆分为单词;IFS
仅用于在最终执行命令之前扩展行的后期阶段进行单词拆分。c是什么ontext?通常情况下,您无法更改解析器最初解析命令行时使用的内容。@LucM我的服务有限,只能传递带有参数的有限关键字。例如,ping x.x.x.x我尝试过,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。我是一支钢笔-测试员和我要完成观察,我需要确保此漏洞的危险程度。例如,用户是否能够修改或添加并执行文件?用户(入侵者)必须更改命令由于命令解析器似乎对空间敏感,因此无法使用无空间命令。我的服务有限,只能传递带有参数的有限关键字。例如,ping x.x.x.x我尝试过,发现它容易受到混合输入的影响。例如ping x.x.x.x&ls将执行ping并列出当前目录。另外还有关于ping x.x.x.x&cat