gpt4 book ai didi

bash - curl -F 换行符未正确解释

转载 作者:行者123 更新时间:2023-11-29 09:12:01 29 4
gpt4 key购买 nike

我正在尝试在 bash 脚本中使用 curl 通过 pushover 发送通知。不过,我无法让 curl -F 正确解释换行符。

curl -s \
-F "token=TOKEN" \
-F "user=USER" \
-F "message=Root Shell Access on HOST \n `date` \n `who` " \
https://api.pushover.net/1/messages.json > NUL

我试过:

\n 
\\\n
%A0

我宁愿直接推送消息,而不是通过文件。

最佳答案

curl 不解释反斜杠转义,因此您必须在 curl 看到的参数中插入一个实际的换行符。换句话说,您必须获得 shell(在本例中为 bash)来解释 \n,否则您需要插入一个真正的换行符。

Posix 标准 shell 不会像 \n 那样解释 C 转义符,尽管标准实用程序命令 printf 可以。然而,bash 确实提供了一种方法来做到这一点:在引用形式中 $'...' C 风格的反斜杠转义将被解释器。否则,$'...' 就像 '...' 一样,因此不会发生参数和命令替换。

但是,任何 shell——包括 bash——都允许换行符出现在引号内,并且换行符只是按原样传递。所以你可以这样写:

curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST
$(date)
$(who)
" \
https://api.pushover.net/1/messages.json > /dev/null

(注意:我在原始 curl 命令中似乎缺少参数扩展的地方插入了参数扩展,并将已弃用的反引号命令替换更改为推荐的 $(...) 形式。)

如上所述,包含文字换行符的唯一问题是,如果您关心外观,它会弄乱缩进。所以你可能更喜欢 bash 的 $'...' 形式:

curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST"$'\n'"$(date)"$'\n'"$(who)" \
https://api.pushover.net/1/messages.json > /dev/null

这也有点难以阅读,但它是完全合法的。 shell 允许单个参数(“word”)由任意数量的带引号或不带引号的段组成,只要段之间没有空格即可。但是您可以通过预定义一个变量来避免使用多引号语法,有些人认为这样更具可读性:

NL=$'\n'
curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "message=Root Shell Access on $HOST$NL$(date)$NL$(who)" \
https://api.pushover.net/1/messages.json > /dev/null

最后,如果您更习惯这种风格,您可以使用标准实用程序 printf:

curl -s \
-F "token=$TOKEN" \
-F "user=$USER" \
-F "$(printf "message=Root Shell Access on %s\n%s\n%s\n" \
"$HOST" "$(date)" "$(who)")" \
https://api.pushover.net/1/messages.json > /dev/null

关于bash - curl -F 换行符未正确解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23932899/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com