[英]how to set proxy value and run linux command in python
在linux中設置代理值,請執行以下操作。
proxy=http://$user:$password@proxy.server.com:${NUM}
http_proxy="$proxy" https_proxy="$proxy" ${COMMAND}
出於安全原因,如果在子外殼中運行此密碼,則不會明確地將密碼公開或記錄在日志中。 這種方法的問題是,每次我要運行命令時,都必須設置用戶名和密碼。
因此決定為其編寫一個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,但我確實知道子流程不允許您使用export,因為它實際上不是命令。 Linux上python中帶有'export'的子處理模塊錯誤?
這是我的實現
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的輸出,所以我知道解碼,編碼或代理不是問題。 有什么建議么?
POST-ANSWER EDIT: Python腳本和linux shell之間的交互
env確實解決了我的問題,但是我也不得不參考上面的線程。 我運行的某些命令是交互式命令,並且正如它在線程中很好地說明的那樣,PIPE在交互式程序中無法正常工作。
很難確定是否確切地知道您要運行的命令,但是我很確定您要在這里執行的操作只是使用Popen
的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:
幾乎總是需要。 ==
是必需的但不足夠的情況很少。 有關更多詳細信息,請參閱PEP 8中的編程建議 。
還有一點說明:您可以只編寫finalCommand.extend(x)
。 list.extend
方法的作用與循環遍歷可迭代的元素並一個接一個地append
每個元素相同,不同之處在於它更具可讀性,更容易出錯,更簡潔,而且速度更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.