gpt4 book ai didi

python - 如何在 python 中设置代理值和运行 linux 命令

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:52 28 4
gpt4 key购买 nike

在 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 不允许您使用 export,因为它不是真正的命令。 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 不能与交互式程序一起正常工作。

最佳答案

如果不确切知道您要运行的命令是很难确定的,但我很确定您想在这里做的只是为您的子进程设置环境,使用 env Popen 的参数:

env = dict(os.environ)
env['http_proxy'] = proxy
env['https_proxy'] = proxy
for command in commands:
out = subprocess.check_output(command, env=env)

如果您想修改自己的环境,而不仅仅是子进程的环境,只需修改 os.environ到位。 (有关特定于平台的问题以及如何处理这些问题,请参阅文档。)


与此同时,您没有收到任何错误的原因很简单:

process = subprocess.Popen(finalCommand,stdout=subprocess.PIPE)
out, err = process.communicate()

如果你不将stderr=subprocess.PIPE传递给Popen构造函数,它不会捕获stderr,所以err结束设置为 None

作为旁注,您几乎不想检查 == None。通常,只需 if not err: 就足够了。如果不是,if err is not None: 几乎总是需要的。 == 是必要但并非不足的情况集非常小。查看Programming Recommendations在 PEP 8 中获得(稍微)更多的细节。

还有一个旁注:您可以只写finalCommand.extend(x)list.extend方法与遍历可迭代对象并逐一附加每个元素做同样的事情,除了它更具可读性、更难出错、更简洁、更快。

关于python - 如何在 python 中设置代理值和运行 linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920013/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com