在 bash 脚本中对字符串进行 URL 编码

Posted

技术标签:

【中文标题】在 bash 脚本中对字符串进行 URL 编码【英文标题】:URL encoding a string in bash script 【发布时间】:2012-08-06 06:16:48 【问题描述】:

我正在编写一个 bash 脚本,我试图在其中提交一个 post 变量,但是我相信 wget 将它视为多个 URL,因为它不是 URLENCODED ......这是我的基本想法

MESSAGE='I am trying to post this information'
wget -O test.txt http://xxxxxxxxx.com/alert.php --post-data 'key=xxxx&message='$MESSAGE''

我收到错误,alert.php 没有收到 post 变量,而且它在说

无法解决我 无法解决我 无法解决尝试 ..等等。

我上面的例子是一个简单的 sudo 例子,但我相信如果我可以对它进行 url 编码,它会通过,我什至尝试过 php 之类的:

MESSAGE='I am trying to post this information'
MESSAGE=$(php -r 'echo urlencode("'$MESSAGE'");')

但是 php 出错了.. 有什么想法吗?如何在不执行 php 的情况下传递 $MESSAGE 中的变量?

【问题讨论】:

寻找我的答案here。 【参考方案1】:

在 CentOS 上,不需要额外的软件包:

python -c "import urllib;print urllib.quote(raw_input())" <<< "$message"

【讨论】:

此解决方案仅适用于 python 2 Python 3 版本看起来像python3 -c "import urllib.parse; print(urllib.parse.quote(input())" @JasonR.Coombs 你忘了一个右括号:) 正确的 Python 3 版本看起来像 python3 -c "import urllib.parse; print(urllib.parse.quote(input()))"(这次测试)。 Python 版本不可知:python -c $'try: import urllib.request as urllib\nexcept: import urllib\nimport sys\nsys.stdout.write(urllib.quote(input()))' &lt;&lt;&lt; "$message" 并且不添加 \n【参考方案2】:

您希望 $MESSAGE 用双引号括起来,这样 shell 就不会将其拆分为单独的单词,然后将其作为参数传递给 PHP:

ENCODEDMESSAGE="$(php -r 'echo rawurlencode($argv[1]);' -- "$MESSAGE")"

【讨论】:

【参考方案3】:

为 Python 3 和文件的多行输入扩展 Rockallite's very helpful answer(这次是在 Ubuntu 上,但这不重要):

cat any.txt | python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.stdin.read()))"

这将导致文件中的所有行连接成一个 URL,换行符被 %0A 替换。

【讨论】:

不,这不起作用。将sys.stdin.read() 替换为input()。使用read() 添加%0A 这是文件终止字符。 使用 input() 只会返回第一行,但我的意图是从文件中获取所有行,并在一个 URL 中编码。如有必要,您可以轻松地将%0A 再次转换为换行符:[...] | sed "s/%0A/\n/g" @Murphy (28/01/2020) 为我工作

以上是关于在 bash 脚本中对字符串进行 URL 编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Excel VBA 中对字符串进行 URL 编码?

为 AJAX 请求在 jQuery 中对字符串进行 URL 编码

如何正确地在 PHP 中对字符串进行 URL 编码?

如何在 WinForms 中对 URL 进行编码?

如何对bash中的所有字符(特殊和非特殊)进行url编码[重复]

URL中的保留字符和不安全字符编码