我试图在python脚本中执行curl命令,无法通过符号传递密码。
import os; os.system("curl -H 'Content-Type: text/xml;charset=UTF-8' -u 'appuser:appuser!@3pass' -i -v 'http://app.com/webservice/getUserData' -o userdata.xml")
我得到了拒绝访问的消息,用户名和密码都是正确的。 我想这是因为密码中的特殊字符。 我试图逃脱像appuser\!\@3pass
但没有帮助。
任何人都可以通过此指导?
您正在使用的命令无法正常工作,因为单引号在Windows中没有特殊的含义,所以它们直接传递给了curl
程序。 所以,如果你从Linux复制命令行(它会工作),这不会在这里工作(虚假的引号传递appuser!@3pass'
例如登录/密码字段接收'appuser
和appuser!@3pass'
,也Content-Type: text/xml;charset=UTF-8
完全不受保护,被理解为2个独立的参数)
从控制台进行简单的测试:
K:\progs\cli>curl.exe -V curl 7.50.3 (x86_64-pc-win32) libcurl/7.50.3 OpenSSL/1.0.2h nghttp2/1.14.1 Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM SSL HTTP2
(如果我用双引号使用"-V"
,也可以使用),但是如果我在版本arg上使用简单的引用,则会得到:
K:\progs\cli>curl.exe '-V' curl: (6) Could not resolve host: '-V'
正如o11c所评论的那样,有一个用于处理卷曲的python模块,你最好用它来处理。
对于其他情况,如果你不能这样做,使用os.system
已经被弃用了。 使用subprocess.check_call
例如更好(python 3.5有一个统一的run
功能):
让我们来修复你的例子:
subprocess.check_call(["curl","-H","Content-Type: text/xml;charset=UTF-8","-u",'appuser:appuser!@3pass',"-i","-v",'http://app.com/webservice/getUserData',"-o","userdata.xml"])
请注意,我特意混合了单双引号。 Python不关心。 如果参数中有空格, check_call
机制会自动处理参数保护/引用。
当调用这个脚本时,我得到了像下面这样的userdata.xml
:
HTTP/1.1 301 Moved Permanently Date: Fri, 15 Sep 2017 20:49:50 GMT server: Apache Location: http://www.app.com/webservice/getUserData Content-Type: text/html; charset=iso-8859-1 Transfer-Encoding: chunked <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>301 Moved Permanently</title> </head><body> <h1>Moved Permanently</h1> <p>The document has moved <a href="http://www.app.com/webservice/getUserData">here</a>.</p> </body></html>