PIP如何在密码中转义字符#?

时间:2016-08-29 13:17:20

标签: python python-3.x pip http-proxy

想继续提问 How to get pip to work behind a proxy server

我有Windows Server和Python 3.5(64)。

在密码中,我的用户包括#。

我尝试使用一些解决方法:

"C:\Program Files\Python35\scripts\pip.exe" install --proxy http://proxy_user:pwd#123@proxy.su:1111 TwitterApi

"C:\Program Files\Python35\scripts\pip.exe" install --proxy "http://proxy_user:pwd#123"@proxy.su:1111 TwitterApi

"C:\Program Files\Python35\scripts\pip.exe" install --proxy http://"proxy_user:pwd#123"@proxy.su:1111 TwitterApi

"C:\Program Files\Python35\scripts\pip.exe" install --proxy http://proxy_user:"pwd#123"@proxy.su:1111 TwitterApi

但是得到错误

  File "c:\program files\python35\lib\site-packages\pip\_vendor\requests\package
s\urllib3\util\url.py", line 189, in parse_url
    raise LocationParseError(url)
pip._vendor.requests.packages.urllib3.exceptions.LocationParseError: Failed to p
arse: proxy_user:pwd

在这种情况下如何转义字符#?

2 个答案:

答案 0 :(得分:4)

快速退出:以编码形式输入,即# -> %23

OR

  

pip处理此问题的更好方法可能是添加--proxy-auth   采取的标志:和编码   用户在将其添加到代理URL之前。

问题 - 这是不允许的:

  

严格地说,字面#字符在。中无效   根据RFC 3986,URI的userinfo部分应该是   百分比编码。然而,许多工具并不奇怪   处理这个问题:显然没有任何实际的歧义   字符。但请注意,如果中有@符号   密码你肯定要对它进行urlencode:因此,它是   这是一个很好的习惯,可以在密码输入之前对其进行urlencode   进入URI。

对提交的问题的回复parse_url fails when given credentials in the URL with '/', '#', or '?'

  

The RFC says specifically

     

权限组件前面有双斜杠(" //")并且是   由下一个斜杠(" /"),问号("?")或数字终止   签名(" #")字符,或URI的末尾。换句话说,   当前的行为在期待权威时是正确的   在前一个之后找到的第一个/(或?或#)终止   //。我是否同情那些尝试使用pip代理URI的人?   绝对。我认为一起攻击违反RFC的东西   有可能在以后发生令人讨厌的惊喜。

答案 1 :(得分:0)

else examples

    $user = str_replace('@', '%40', $user);
    $pass = str_replace('%', '%25', $pass); // don't down! (%)
    $pass = str_replace('#', '%23', $pass);
    $pass = str_replace('@', '%40', $pass);
    $pass = str_replace(':', '%3a', $pass);
    $pass = str_replace(';', '%3b', $pass);
    $pass = str_replace('?', '%3f', $pass);
    $pass = str_replace('$', '%24', $pass);
    $pass = str_replace('!', '%21', $pass);
    $pass = str_replace('/', '%2f', $pass);
    $pass = str_replace('\'', '%27', $pass);
    $pass = str_replace('"', '%22', $pass);