Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用printf%q使带引号的字符串可用作shell脚本输入_Linux_Bash_Printf_Double Quotes_Single Quotes - Fatal编程技术网

Linux 使用printf%q使带引号的字符串可用作shell脚本输入

Linux 使用printf%q使带引号的字符串可用作shell脚本输入,linux,bash,printf,double-quotes,single-quotes,Linux,Bash,Printf,Double Quotes,Single Quotes,在bash脚本中,我试图将单引号和双引号的命令字符串附加到文件(.profile) 我想使用echo,然后使用>命令来.profile。当然,我愿意接受任何可行的解决方案 我想使用的命令是echo“curl-X POST-H”内容类型:application/json“-d'{“value1”:“PHONENUMBER”,“value2”:“MESSAGE”}https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &>/dev/null“>>.p

在bash脚本中,我试图将单引号和双引号的命令字符串附加到文件(
.profile

我想使用
echo
,然后使用
>
命令来
.profile
。当然,我愿意接受任何可行的解决方案

我想使用的命令是
echo“curl-X POST-H”内容类型:application/json“-d'{“value1”:“PHONENUMBER”,“value2”:“MESSAGE”}https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &>/dev/null“>>.profile
,但显然这在我的bash脚本中不起作用

我不清楚
printf%q
是如何工作的,也不知道如何将其应用于我的问题

我试过这个

`CMDSTRING='curl -X POST -H "Content-Type: application/json" -d '`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}'{"value1":"+PHONENUMBER","value2":"MESSAGE"}'`
`CMDSTRING=${CMDSTRING}"'"`
`CMDSTRING=${CMDSTRING}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null'`

`echo $CMDSTRING`

使用
printf“%q”
生成
.profile
内容如下所示:

{
  printf '%q ' \
    curl -X POST -H "Content-Type: application/json" \
      -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
      https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY
  printf '%s\n' "&>/dev/null" 
} >> .profile
请注意,如果希望将
&>/dev/null
解析为语法,则不能使用
%q
格式字符串,因为就其本质而言,它将传递给解析为数据的所有内容格式化

因此,我们对实际命令本身使用
printf“%q”命令名“第一个参数”…
,并格式化带外重定向


也就是说,请注意,只有在替换来自不受信任源的变量(而不是像示例中那样硬编码变量)并且担心无效值被滥用用于命令注入时,上述内容才有价值。如果您真的只是在文件末尾追加一个常量字符串,则引用的herdoc将允许您手动构建更自然的shell引用(事实上,正如您已经做过的!),并逐字传递:

cat >>.profile <<'EOF'
curl -X POST -H "Content-Type: application/json" \
  -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' \
  https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null
EOF

cat>.profile乐于看到光明,并以“正确”的方式行事。我原以为这会很快又脏,但现在却很慢,很难看,很痛苦。您建议采用什么方法有效?顺便说一句,如果您的消息来自不受信任的来源,那么使用
jq
或其他JSON语法感知工具将其格式化以供包含会更安全一些;这样一来,包含文字
的消息将无法逃脱其引用并能够添加额外的有效负载参数。(我不知道IFTTT的API,但如果它支持回调,这些参数甚至可能是恶意的)。re:edit,请参阅为什么
echo$var
总是有错误(需要是
echo“$var”
)。我希望反勾号只是一个格式错误;您永远不会希望在实际代码中使用它们。顺便说一句,还要注意,所有caps变量名称都位于shell和POSIX指定的实用程序本身使用的命名空间中,而小写名称保留给应用程序使用,并保证不会发生冲突。(我们有很多人遇到问题,因为他们在…
中运行路径
,而在…
中运行路径
,符合标准的建议,不会无意中改变shell的操作方式)。请参阅,记住shell和环境变量共享一个名称空间。顺便说一句,请注意,
printf“%q”
生成的代码对于bash的评估是安全的,但对于所有兼容POSIX的shell的评估不一定是安全的。这使它成为在
中生成内容的正确工具。bash\u profile
(如果您实际使用的是以前未知的值),但是
.profile
的工具错误(除bash外,shell也可以使用该工具)。谢谢。让我试试看。CAPS中的值在这篇文章中是模糊的,但实际上是常量。这是我为网络安全研究生建立的实验室的一部分,所以它是一个封闭的、已知的群体。他们需要找到这种折衷办法。如果一切都是常量,那么根本没有理由使用
printf%q
;它的目的是s获取仅动态已知的内容,并找到一种方法将其格式化为无法解释为代码的文本。如果您以熟悉语言语法的人的身份编写这些文本,您已经可以防止手动将其解析为非文本。考虑到这一点,是否有一种更简单的方法来附加mmand字符串到.profile文件?这是我在回答的后半部分中展示的herdoc方法。