簡體   English   中英

使用Python使用ftp設置代理

[英]Setting up proxy with ftp with Python

我們正在嘗試開發一個Python模塊,該模塊將命中FTP服務器並將文件下載到我的本地計算機上。 當我們嘗試運行模塊的FTP部分時,它正在超時。

我們有一個代理服務器(簡稱為“ officeproxy.com:8080”)來處理此問題,並且在使用FileZilla或Windows資源管理器之類的FTP客戶端訪問FTP站點時,我們是成功的。

讓我們將ftp站點稱為“ ftp.cal.com”。 用戶名是“ papa”。 密碼是“ tango123”。

到目前為止,我們有:

Proxy = officeproxy.com:8080

FTP = ftp.cal.com

User = papa

PW = tango123 

以上不是真實實體,因此如果您想將它們換成真實實體,請成為我的客人。

我需要一個模塊來首先加載代理服務,然后運行FTP部分。

我正在運行Python 2.7。

我到處搜索並獲得了此代碼。 OP表示,這只是測試與FTP的連接並讀取一個文件的簡短模塊。

(注意:我故意將#放在很多地方以顯示我不知道填寫的內容或其他原因):

import urllib2
# I have filled in the proxy info
proxy_host = 'officeproxy.com:8080'

# I don't think this needs any modification, right?  
proxy_handler = urllib2.ProxyHandler({'ftp': proxy_host})

# ditto here 
proxy_auth_handler = urllib2.ProxyBasicAuthHandler() 

# now here is where I am unsure what to put; 
# also, I really need FTP user and FTP password, and NOT Proxy... 
# so what do I need to change here?
proxy_auth_handler.add_password(None, proxy_host, proxy_user, proxy_passwd) 
opener_thru_proxy = urllib2.build_opener(proxy_handler, proxy_auth_handler)

# I filled in this part
conn = opener_thru_proxy.open('ftp://ftp.cal.com/hello.txt') 

# I don't believe I need to change this, right?
print conn.read()

注意,我在SO上發現了一些類似的 問題 ,但是當OP請求一個詳細的,初學者級的答案時,我決定發布此問題。

為了澄清,這是我對要完成的工作的理解:

  • 您在代理后面有一個FTP服務器。
  • FTP服務器需要用戶/密碼憑據,但代理服務器本身不需要。

一種選擇是使用ftplib軟件包。 諸如Python之類的流行語言的最大優點之一是提供了特定功能的良好實現的廣泛選擇軟件包。 在這種情況下,一個ftp客戶端:

import ftplib  # 1

ftp = ftplib.FTP("officeproxy.com:8080")  # 2
ftp.set_debuglevel(1)  # 3
ftp.login("papa", "tango123")  # 4

filename = "hello.txt"
f = open(filename, 'wb')  # 5 
ftp.retrbinary("RETR " + filename , f.write)  # 6

f.close()   # cleanup file handle
ftp.quit()  # cleanup ftp client 

這是代碼的作用:

  1. 導入ftplib軟件包。
  2. 通過代理連接到FTP服務器。 我編寫它的方式假定已將代理設置為在指定的端口(本例中為8080)上轉發FTP協議。 如果不是這種情況,將無法使用。
  3. 啟用調試日志記錄。 ftplib文檔中

FTP.set_debuglevel(level)0 ,不產生調試輸出... 1產生適中的調試輸出... 2或更高版本產生最大的調試輸出

  1. 使用user =“ papa”,passwd =“ tango123”登錄到FTP服務器。 同樣,這來自ftplib文檔中的login()
  2. 打開一個本地文件,以寫入要從FTP服務器檢索的文件內容。 第一個參數是您要保存到的文件的文件名(可以是任何東西,我決定使用與FTP服務器上的文件名相同的文件名)。 第二個參數是您要打開文件的模式 ,它是一串標志:w ='寫入模式',b ='二進制模式',因為我們將以二進制形式檢索文件並將其以二進制形式寫入。
  3. 我建議您閱讀ftplib文檔以獲取retrbinary 首先,要理解這一點有些棘手。 第一個參數"RETR" + filename是發送到FTP服務器的命令,在本例中為RETR hello.txt 第二個參數f.write是您希望ftp.retrbinary函數在ftp.retrbinary來自服務器的數據塊時調用的回調函數。 在其實現中,每當retrbinary有數據時,它將調用f.write(data) ,其中data是它擁有的最新數據塊。 要了解更多有關回調在Python中的工作方式的信息,請參見Python 中的異步API簡介。

我希望這對您有用,並且希望答案足夠詳細,以使您了解它的工作原理。 如果它不起作用,請發布堆棧跟蹤輸出以獲取錯誤信息。

這個問題有點過時了,但是我本人沒有找到任何最新的解決方案,因此我想我會提供找到的解決方案。 就我而言,辦公室代理需要憑據,因此這些憑據將包含在解決方案中。 我想如果您的代理不需要憑據,就可以刪除proxy_user和proxy_passwd。 我在Python 3.6中工作的代碼是:

from ftplib import FTP

ftp = FTP("officeproxy.com")
ftp.set_debuglevel(1)
ftp.login(user='ftp_user@ftp_host proxy_user', passwd='ftp_passwd', acct='proxy_passwd')

# Do whatever you need on the FTP server here

ftp.quit()

我希望這有幫助。

將其添加為最重要的結果之一,並努力尋找解決方案。

如果您的代理服務器是HTTP代理服務器,並且您需要對其進行身份驗證 ,則方法如下:

import socks
import socket

socks.set_default_proxy(socks.HTTP, 
        proxy_host, 
        proxy_port, 
        username=proxy_username, 
        password=proxy_password
)
socket.socket = socks.socksocket
ftp = FTP(ftp_host)
ftp.set_debuglevel(1) 
ftp.login(
        user=ftp_user,
        passwd=ftp_password
)

否則,對於FTP代理,馬丁的答案有效。 您也可以在FileZilla中看到FTP代理的行為,這將有助於為您的要求編碼

希望這對某人有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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