簡體   English   中英

如何設置代理值並在python中運行linux命令

[英]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在交互式程序中無法正常工作。

很難確定是否確切地知道您要運行的命令,但是我很確定您要在這里執行的操作只是使用Popenenv參數為子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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM