【问题标题】:URL encoding a string in bash script在 bash 脚本中对字符串进行 URL 编码
【发布时间】: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

标签: linux bash command-line wget urlencode


【解决方案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) 为我工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2014-03-27
    • 2011-10-06
    • 2010-09-18
    • 2014-07-14
    • 2011-09-26
    • 2012-02-29
    相关资源
    最近更新 更多