【发布时间】:2014-09-15 04:47:54
【问题描述】:
在 linux 中设置代理值,您可以执行以下操作。
proxy=http://$user:$password@proxy.server.com:${NUM}
http_proxy="$proxy" https_proxy="$proxy" ${COMMAND}
出于安全原因,如果您在子shell 中运行此程序,您并没有明确地让您的密码公开或记录在日志中。这种方法的问题是,每次我想运行命令时都必须设置用户名和密码。
因此决定为它编写一个python代码。我有一个 C 的工作版本。只是想在 Python 中学习更多。我找到了很好的方法来编码和解码我的密码,并且在大多数喧嚣之后,我将它传递给这个函数来测试代理连接。
def test_connection(creds,proxy_url):
import pycurl
import cStringIO
buf = cStringIO.StringIO()
test_url="http://www.google.com"
c = pycurl.Curl()
c.setopt(c.URL, test_url)
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(c.PROXY, proxy_url)
c.setopt(c.PROXYPORT, 8080)
c.setopt(c.PROXYTYPE, c.PROXYTYPE_HTTP)
c.setopt(c.PROXYAUTH, c.HTTPAUTH_NTLM)
c.setopt(c.PROXYUSERPWD, creds)
c.perform()
buf.close()
return c.getinfo(c.RESPONSE_CODE)
我在使用 suprocess 时遇到问题,我明白 subprocess 不允许您使用导出,因为它不是真正的命令。 Subprocess module errors with 'export' in python on linux?
这是我的实现
finalCommand = ["/bin/sh", "-c"]
finalCommand.append(http_proxy)
finalCommand.append(https_proxy)
for x in bashCommand:
finalCommand.append(x)
print subprocess.call(finalCommand)
process = subprocess.Popen(finalCommand,stdout=subprocess.PIPE)
out, err = process.communicate()
print "Output ... \n %s" % (out)
if err == None:
print "No errors"
else:
print "Errors ... \n %s" %(err)
不幸的是,经过几次测试,我的程序总是不返回任何输出,也没有错误。 我已经打印了 curl 的输出,所以我知道解码、编码或代理不是问题。有什么建议?
回答后编辑: Interaction between Python script and linux shell
env 确实解决了我的问题,但我也不得不参考上面的线程。我运行的一些命令是交互式的,正如它在线程中很好地解释的那样,PIPE 不能在交互式程序中正常工作。
【问题讨论】:
-
您只是在寻找
Popen的env参数吗?还是您实际上是在尝试启动一个 shell 并直接在其中而不是在子 shell 中运行脚本,或者其他时髦的东西? -
同时,请给我们一个MCVE——特别注意“完整”部分。在不知道
http_proxy、https_proxy和bashCommand中的内容的情况下,很难调试可能出现的问题。 (另外,您是否有原因首先对命令执行call,然后使用完全相同的命令创建Popen并在其上调用communicate?) -
“PIPE 不能在交互式程序中正常工作”并不是那么严重(尽管在 Python 3.2 之前确实如此,但您可能不会遇到这种情况,如果遇到这种情况,请安装 @ 987654336@ backport 来解决这个问题),这是一些交互式程序要求您更改缓冲,而其他程序根本不与标准输入对话(例如,他们正在读取密码而不回显它并且需要一个真正的 tty,或者他们只需让 libpam 为他们做这件事,等等),所以管道到标准输入没有任何好处。而且,编写代码以通过管道进行交互而不阻塞也很困难。
标签: python linux shell curl proxy