在 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()))' <<< "$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 编码的主要内容,如果未能解决你的问题,请参考以下文章
为 AJAX 请求在 jQuery 中对字符串进行 URL 编码