日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

FTP上傳下載實戰(zhàn):ftplib、被動模式與斷點續(xù)傳排錯

FTP上傳下載實戰(zhàn):ftplib、被動模式與斷點續(xù)傳排錯 簡介面向Java開發(fā)者的FTP文件傳輸學(xué)習(xí)包圍繞從服務(wù)器上傳與下載文件的常見需求梳理連接建立、登錄驗證、主動/被動模式切換、目錄操作、二進制傳輸、文件收發(fā)及斷開清理等核心環(huán)節(jié)。壓縮包共2個文件以1個Java源碼和1個jar依賴庫為主整體約106KB源碼可用于對照理解FTPClient調(diào)用流程jar依賴便于直接補齊運行環(huán)境適合在本地搭建小型FTP客戶端示例并調(diào)試。已有251人學(xué)習(xí)下載說明該主題在Java網(wǎng)絡(luò)編程入門與日常運維腳本場景中具有一定參考需求。讀者可從中獲得一套可運行的FTP操作代碼骨架結(jié)合異常捕獲、傳輸模式設(shè)置與資源釋放等細節(jié)快速定位上傳下載失敗、目錄切換異?;蜻B接未關(guān)閉等問題并在此基礎(chǔ)上擴展超時控制、重試機制與安全傳輸配置形成適合自身業(yè)務(wù)的文件傳輸工具。1. FTP 上傳下載文件這件事老協(xié)議為什么還壓在生產(chǎn)線上「FTP 上傳下載文件」聽著像是上個時代的活但真正在機房待過的人都知道它離消失還早得很。我最近一次和它打交道是個凌晨跑完不對賬的定時任務(wù)控制連接一切正常登錄成功、命令一條條返回 226可目標目錄里就是少了一個包。后來定位到是數(shù)據(jù)連接被中間的防火墻掐了日志干凈得像沒事發(fā)生——這種「看起來很成功」的失敗是 FTP 最典型的一面。這份資源要解決的就是繞不開 FTP 的那幾類活老設(shè)備只肯吐 FTP、外部對接方只給一個賬號密碼、內(nèi)網(wǎng)機器之間搬運日志和備份包、需要按天做增量同步。新手可以照著腳本跑通第一次上傳和下載熟手更該盯住它的邊界——兩條獨立連接、被動模式的端口區(qū)間、文件名編碼、斷點續(xù)傳的偏移量每一項都能讓你在半夜被叫起來。下面按「先看懂模型、再動手寫腳本、最后把坑挖出來」的順序往下走。2. 兩條連接與兩種模式通信模型里最容易配錯的三處FTP 和 HTTP 最大的差別在于它一次會話要開兩條 TCP 連接而且這兩條連接的建立方向可以反過來。很多人腳本寫得沒問題、賬號密碼也沒錯最后卡在 425 或者「列表能拿到但文件傳不動」根子都在這一層。這一章把連接結(jié)構(gòu)、主動被動模式、傳輸類型與編碼三件事拆開配一段可以直接跑的探測代碼先把鏈路摸清楚再談上傳下載。2.1 控制連接與數(shù)據(jù)連接是兩套東西控制連接固定連服務(wù)器的 21 端口明文 FTP 的默認端口實際部署也可能改成別的整個會話期間一直保持所有命令和響應(yīng)都以文本行的形式在這條通道上走USER、PASS 完成認證CWD 切目錄PWD 看當前位置TYPE 設(shè)傳輸類型PASV 協(xié)商數(shù)據(jù)通道。你看到的220、230、250、226這些三位數(shù)字碼全是控制連接在說話。數(shù)據(jù)連接是臨時的只在實際傳文件或者列目錄的那一小段時間里存在。LIST、NLST、MLSD、RETR、STOR這些命令才會觸發(fā)數(shù)據(jù)連接傳完立刻關(guān)閉。問題在于這條數(shù)據(jù)連接由誰來發(fā)起、連到哪個端口是可以變的——這就是主動模式和被動模式的差別。理解這一點的實際價值在于控制連接通、數(shù)據(jù)連接不通是完全可能的。防火墻、NAT 網(wǎng)關(guān)、容器網(wǎng)絡(luò)策略任何一個環(huán)節(jié)都可能只管住數(shù)據(jù)連接那一側(cè)。我一般會先用一段最小的探測代碼把歡迎語、當前目錄、文件列表和傳輸類型都打出來判斷到底是哪條腿瘸了。from ftplib import FTP, error_perm ftp FTP() # 編碼必須先設(shè)很多老服務(wù)器回包是 GBK不設(shè)會直接拋 UnicodeDecodeError ftp.encoding utf-8 ftp.set_debuglevel(2) # 2 會把收發(fā)的每條命令打印出來排錯時非常有用 ftp.connect(ftp.example.com, 21, timeout15) ftp.login(demo_user, demo_pass) print(歡迎語:, ftp.getwelcome()) print(當前目錄:, ftp.pwd()) # TYPE I 表示二進制傳輸避免服務(wù)器做換行符轉(zhuǎn)換 print(TYPE 響應(yīng):, ftp.sendcmd(TYPE I)) print(目錄列表:, ftp.nlst(.)[:10]) # 只取前 10 條防止目錄太大刷屏 ftp.quit()這段代碼的價值不在功能而在診斷。set_debuglevel(2)會把-- PASV和-- 227 Entering Passive Mode (...)這類交互原樣打出來你能直接看到服務(wù)器返回的被動端口是不是落在了防火墻放行的區(qū)間里。nlst是一次典型的數(shù)據(jù)連接操作如果它拋TimeoutError或者ConnectionRefusedError而前面pwd明明返回正常那基本可以確診為數(shù)據(jù)通道被攔。參數(shù)上要留意三處encoding建議先按服務(wù)器實際情況選utf-8或gbk拿不準就兩種都試timeout不要設(shè)成默認的None卡死的連接會讓整個腳本掛在那里不動15 到 30 秒是個合理區(qū)間set_debuglevel只在排錯時開生產(chǎn)腳本里關(guān)掉否則日志會被撐爆。2.2 主動模式與被動模式425 多半出在這里主動模式PORT的流程是反的客戶端用 PORT 命令告訴服務(wù)器「你來連我的這個 IP 和端口」然后服務(wù)器從自己的 20 端口主動向客戶端發(fā)起數(shù)據(jù)連接。這在沒有 NAT 的年代很高效但在今天幾乎必然出事——客戶端躲在 NAT 后面時報給服務(wù)器的私網(wǎng) IP 服務(wù)器根本連不上或者客戶端本機的防火墻根本不接受外部主動連入。被動模式PASV把方向掰了回來客戶端發(fā) PASV服務(wù)器回一個227 Entering Passive Mode (h1,h2,h3,h4,p1,p2)里面是服務(wù)器開放的臨時端口客戶端主動去連。Python 的 ftplib 默認就是被動模式set_pasv(True)這也是絕大多數(shù)場景該用的模式。但被動模式有自己的坑服務(wù)器開放的是一段隨機端口區(qū)間常見做法是在服務(wù)端配置里把區(qū)間固定下來比如 50000 到 50100然后在防火墻和云安全組里把這段放行。區(qū)間不固定的話你永遠不知道下一次連接會撞到哪個被攔的端口。判斷方法很直接如果控制連接正常、PWD正常但一執(zhí)行LIST或RETR就報 425「Cant open data connection」先懷疑被動端口區(qū)間沒放行如果腳本在本地開發(fā)機跑得好好的一上生產(chǎn)服務(wù)器就掛八成是生產(chǎn)機的出網(wǎng)策略只放了 21 端口。from ftplib import FTP ftp FTP() ftp.encoding utf-8 ftp.connect(ftp.example.com, 21, timeout20) ftp.login(demo_user, demo_pass) # 顯式聲明使用被動模式等價于發(fā)送 PASV 命令 ftp.set_pasv(True) # 手動發(fā)一次 PASV看看服務(wù)器到底回了哪個 IP 和端口 resp ftp.sendcmd(PASV) print(PASV 響應(yīng):, resp) # 227 Entering Passive Mode (10,0,0,5,195,80) ftp.quit()把195,80這兩個數(shù)換算一下195 * 256 80 50000這就是服務(wù)器讓你去連的端口。這段換算值得記住因為排障時運維只問你「卡在哪個端口」你答得出來就能省半小時。如果這個端口落在安全組放行范圍之外解決辦法有兩個讓服務(wù)端把pasv_min_port/pasv_max_port固定成一段連續(xù)區(qū)間并放行或者臨時切到主動模式驗證——但主動模式只能作為定位手段不能作為長期方案尤其是在容器和云主機上。2.3 傳輸類型與文件名編碼看不見的破壞力TYPE命令決定數(shù)據(jù)連接上怎么解釋字節(jié)。TYPE AASCII會讓服務(wù)器在傳輸過程中做換行符轉(zhuǎn)換TYPE IIMAGE/Binary則原樣搬運。這兩個選錯了后果是靜默的傳一個壓縮包用 ASCII 模式大小可能差幾十個字節(jié)解壓直接報損壞傳一個 shell 腳本用二進制模式到了對端可能因為換行符不對而執(zhí)行失敗。我的習(xí)慣是無腦TYPE I然后在需要的地方自己處理換行。ftplib 的storbinary和retrbinary默認就走二進制這一點比裸寫 socket 省心但如果你的腳本混用了storlines那就要清楚它是按行讀寫的適合純文本且你確認對端接受當前換行風(fēng)格。編碼是第二個隱形殺手。FTP 協(xié)議早期是純 ASCII 的中文文件名怎么表示完全看服務(wù)器實現(xiàn)。常見的兩種做法是在登錄后發(fā)OPTS UTF8 ON聲明使用 UTF-8或者干脆用服務(wù)器本地的 GBK。ftplib 的encoding屬性必須和服務(wù)器一致否則你上傳時文件名是對的nlst列出來卻是一串亂碼后面按名字下載全部失敗。from ftplib import FTP, error_perm ftp FTP() ftp.encoding utf-8 ftp.connect(ftp.example.com, 21, timeout20) ftp.login(demo_user, demo_pass) # 嘗試開啟 UTF-8 模式服務(wù)器不支持會拋 500/502忽略即可 try: print(ftp.sendcmd(OPTS UTF8 ON)) except error_perm as e: print(服務(wù)器不支持 UTF8 選項:, e) ftp.set_pasv(True) ftp.sendcmd(TYPE I) # 二進制傳輸壓縮包、圖片、數(shù)據(jù)庫備份都必須用這個 # 用 MLSD 拿結(jié)構(gòu)化列表能同時得到文件名、大小和修改時間 for name, facts in ftp.mlsd(/, facts[type, size, modify]): print(name, facts) ftp.quit()MLSD比LIST和NLST都好用因為它返回的是機器可解析的鍵值對size和modify直接能拿來做增量判斷不用再去正則匹配ls -l格式的字符串??上Р皇撬欣戏?wù)器都支持遇到500 Unknown command就退回NLST加SIZE命令組合。如果mlsd拋出的文件名是亂碼把encoding換成gbk再試一遍這是我遇到中文名問題時固定的第一步。3. ftplib 落地上傳、下載、遞歸拉目錄的四段可抄代碼模型清楚之后剩下的就是把動作固化成函數(shù)。這一章的四段代碼對應(yīng)四種最常見的活穩(wěn)定連接、上傳帶進度、下載并保留目錄結(jié)構(gòu)、傳完做校驗。每一段都可以單獨摳出來用也可以拼成一個腳本。我一般會把連接參數(shù)抽到配置里認證信息走環(huán)境變量避免密碼硬編碼在倉庫里——這條不是潔癖是審計要求。3.1 連接骨架超時、重連與環(huán)境變量生產(chǎn)腳本和演示腳本最大的差別是容錯。FTP 服務(wù)器的空閑超時往往設(shè)在 300 秒左右一個跑批腳本如果中間有長時間的本地處理再回來發(fā)命令就可能收到421 Timeout然后控制連接被服務(wù)端關(guān)掉。這時候繼續(xù)用同一個連接對象發(fā)命令必然報error_temp或者直接EOFError。解決辦法是把「拿連接」封裝成函數(shù)每次用之前判斷連接是否還活著不活就重連。ftp.voidcmd(NOOP)是最輕量的探活方式服務(wù)器回200就說明通道還在。import os from ftplib import FTP, all_errors def get_ftp(host, timeout20): ftp FTP() ftp.encoding utf-8 ftp.connect(host, 21, timeouttimeout) # 認證信息從環(huán)境變量讀不要寫死在代碼里 ftp.login(os.environ[FTP_USER], os.environ[FTP_PASS]) ftp.set_pasv(True) ftp.sendcmd(TYPE I) return ftp def ensure_alive(ftp, host): try: ftp.voidcmd(NOOP) # 探活成功返回 200 return ftp except all_errors: try: ftp.close() except Exception: pass return get_ftp(host)all_errors是 ftplib 提供的異常元組把error_reply、error_temp、error_perm、error_proto和OSError都包了進去捕它比逐個列異常省事。ensure_alive的寫法看起來有點粗暴——連接斷了就整個重建——但在批量任務(wù)里這是最省心的策略因為 FTP 的連接狀態(tài)很難恢復(fù)到「干凈」的狀態(tài)重建比修復(fù)便宜。要提醒一點connect的timeout和login之后的數(shù)據(jù)傳輸超時是兩個概念。socket層面的超時由connect傳入的timeout控制會作用到之后所有的 socket 操作上。如果你的網(wǎng)絡(luò)抖動厲害把它設(shè)到 20 到 30 秒如果鏈路很穩(wěn)但要傳大文件設(shè)太小會在傳輸中途觸發(fā)超時那時候就只能靠斷點續(xù)傳來救代價更大。3.2 上傳storbinary 的回調(diào)與進度統(tǒng)計上傳的核心是storbinary(cmd, fp, blocksize8192, callbackNone, restNone)。第一個參數(shù)是命令字符串通常是STOR 遠程文件名第二個是打開的文件對象必須是二進制模式blocksize決定每次從本地讀多少字節(jié)往 socket 里寫默認 8192內(nèi)網(wǎng)可以調(diào)到 65536 提速跨公網(wǎng)保持在 8192 到 32768 更穩(wěn)。callback每次發(fā)送一個塊就被調(diào)用一次入?yún)⑹沁@一塊的字節(jié)數(shù)。用它做進度條或者日志最好用但注意不要在回調(diào)里做耗時操作否則會拖慢整體傳輸。import os from ftplib import FTP def upload_file(ftp, local_path, remote_dir, remote_nameNone): remote_name remote_name or os.path.basename(local_path) total os.path.getsize(local_path) sent 0 def _on_block(block): nonlocal sent sent len(block) percent sent * 100 // total if total else 100 print(f\r上傳 {remote_name}: {sent}/{total} 字節(jié) ({percent}%), end) # 確保遠程目錄存在不存在則逐級創(chuàng)建 try: ftp.cwd(remote_dir) except error_perm: for part in remote_dir.strip(/).split(/): try: ftp.mkd(part) except error_perm: pass ftp.cwd(part) with open(local_path, rb) as fp: ftp.storbinary(fSTOR {remote_name}, fp, blocksize32768, callback_on_block) print()這里有個細節(jié)值得說mkd在目錄已存在時會拋error_perm通常是 550直接吞掉繼續(xù)cwd就行這是 FTP 建目錄的常規(guī)寫法沒有冪等的mkdir -p。另外注意cwd的語義——FTP 的當前目錄是服務(wù)端會話狀態(tài)你的函數(shù)改完之后要記得它對后續(xù)操作有影響最穩(wěn)妥的做法是每次操作前顯式cwd到目標目錄不要依賴上一次殘留的位置。進度統(tǒng)計用nonlocal累加會出現(xiàn)一個偏差callback收到的塊大小是寫入 socket 的量正常情況下和文件大小一致但如果中途失敗sent會停在半路。所以這個進度只能用于人看不能當成成功的判據(jù)——真正的成功判據(jù)是storbinary正常返回且遠程SIZE對得上。3.3 下載retrbinary 與遞歸拉取整個目錄下載用retrbinary(RETR 文件名, callback, blocksize, restNone)回調(diào)收到的是數(shù)據(jù)塊需要自己往本地文件里寫。這一點和上傳不同上傳是 ftplib 幫你讀本地文件下載是 ftplib 把數(shù)據(jù)交給你怎么存由你決定。遞歸拉目錄的難點在于 FTP 沒有現(xiàn)成的遞歸命令只能自己維護一個棧。服務(wù)端的目錄遍歷有兩條路nlst只能列出名字MLSD能帶出type字段區(qū)分目錄和文件。優(yōu)先用MLSD不支持的話就用cwd試著切進去切成功就是目錄——這個技巧雖然土但兼容性最好。import os from ftplib import FTP, error_perm def download_tree(ftp, remote_dir, local_dir): os.makedirs(local_dir, exist_okTrue) try: entries list(ftp.mlsd(remote_dir, facts[type, size])) structured True except error_perm: entries [(n, {}) for n in ftp.nlst(remote_dir)] structured False for name, facts in entries: if name in (., ..): continue remote_path f{remote_dir.rstrip(/)}/{name} local_path os.path.join(local_dir, name) is_dir facts.get(type) dir if structured else False if not structured: # 沒有 MLSD 時用 cwd 試探是否為目錄 try: ftp.cwd(remote_path) ftp.cwd(remote_dir) is_dir True except error_perm: is_dir False if is_dir: download_tree(ftp, remote_path, local_path) else: with open(local_path, wb) as fp: ftp.retrbinary(fRETR {remote_path}, fp.write, blocksize32768) print(已下載, remote_path)遞歸函數(shù)里對目錄的判斷邏輯有個隱患cwd試探會改變當前目錄所以切進去之后必須立刻切回來代碼里ftp.cwd(remote_dir)那一行就是干這個的。如果服務(wù)端對CWD的響應(yīng)慢這個方案會明顯拖慢遍歷速度那時候就只能退而求其次約定好目錄結(jié)構(gòu)只同步固定層級。另外注意local_path里的文件名直接來自服務(wù)器中文名場景下如果encoding設(shè)錯這里會在本地創(chuàng)建出一堆亂碼文件名。跑之前先用一個小目錄試一遍確認文件名字節(jié)正確再放開全量。這個驗證動作我每次都做因為它屬于「出錯之后清理成本極高」的那類問題。3.4 校驗用 SIZE 和 MD5 把傳輸閉環(huán)傳輸成功不等于文件正確。FTP 在二進制模式下不做完整性校驗網(wǎng)絡(luò)中斷、磁盤寫滿、服務(wù)端中途返回 426都可能留下一個大小不對的文件。storbinary和retrbinary在不拋異常的情況下返回226 Transfer complete這只說明服務(wù)端認為傳完了不代表字節(jié)一定對齊。第一層校驗是SIZE命令單位是字節(jié)直接和本地os.path.getsize對比。這一層能擋住絕大多數(shù)截斷問題成本幾乎為零。import hashlib from ftplib import FTP, error_perm def remote_size(ftp, remote_path): try: return ftp.size(remote_path) # 返回 int單位字節(jié) except error_perm: return None # 服務(wù)器不支持 SIZE 命令時返回 None def remote_md5(ftp, remote_path): h hashlib.md5() ftp.retrbinary(fRETR {remote_path}, h.update, blocksize65536) return h.hexdigest() def local_md5(path): h hashlib.md5() with open(path, rb) as fp: for chunk in iter(lambda: fp.read(65536), b): h.update(chunk) return h.hexdigest()remote_md5的實現(xiàn)方式是把文件整個再拉一遍喂給哈希對象對于幾 GB 的備份包來說代價不小所以我的實際策略是分級的日常小文件用SIZE對比就夠了重要數(shù)據(jù)在傳完之后再跑一次MD5比對超大文件改成傳完立刻對端算哈希、通過別的通道回傳不在 FTP 里繞這一圈。還要注意ftp.size()在某些服務(wù)器上對 ASCII 模式的文件返回的是轉(zhuǎn)換后的大小所以前面強調(diào)TYPE I不是可選項。如果你拿到的大小和本地差幾字節(jié)且文件是文本類第一反應(yīng)應(yīng)該是傳輸模式被改過而不是文件壞了。4. 命令行側(cè)的打法curl 與 lftp 在批量同步腳本里的分工不是所有活都值得寫 Python。臨時拉一個文件、CI 流水線里傳個制品、crontab 里跑個每日同步命令行工具更直接出問題也更容易在日志里看到原始錯誤碼。這一章說清楚 curl 和 lftp 各自適合什么以及怎么把它們?nèi)M shell 腳本而不留隱患。4.1 curl 的四種姿勢單文件上傳下載與建目錄curl 支持 FTP 協(xié)議語法統(tǒng)一返回值規(guī)范是腳本里的首選。四種最常見的用法下載單文件、上傳單文件、上傳時自動建目錄、斷點續(xù)傳下載。# 1. 下載單個文件到當前目錄保留遠程文件名 curl -u $FTP_USER:$FTP_PASS \ --ftp-pasv \ --connect-timeout 15 \ -O ftp://ftp.example.com/data/report.csv # 2. 上傳單文件-T 指定本地文件 curl -u $FTP_USER:$FTP_PASS \ -T ./report.csv \ ftp://ftp.example.com/upload/report.csv # 3. 上傳時自動創(chuàng)建缺失的遠程目錄 curl -u $FTP_USER:$FTP_PASS \ --ftp-create-dirs \ -T ./report.csv \ ftp://ftp.example.com/upload/2024/06/report.csv # 4. 斷點續(xù)傳下載-C - 表示讓 curl 自動計算偏移 curl -u $FTP_USER:$FTP_PASS -C - -O ftp://ftp.example.com/data/big.tar.gz--ftp-pasv在新版 curl 里已經(jīng)是默認行為顯式寫上是為了讓腳本意圖清楚也防止某些環(huán)境變量把它改掉。--connect-timeout只控制建連階段傳輸階段的卡頓要靠--speed-time和--speed-limit來控制比如「連續(xù) 60 秒速度低于 1KB/s 就斷開」這在鏈路不穩(wěn)的場景下很實用能讓腳本快速失敗而不是掛一晚上。--ftp-create-dirs是最容易被忽略但最省事的一個參數(shù)。沒有它你把文件傳到不存在的目錄會直接得到550 No such directory而很多人會誤以為是權(quán)限問題去翻服務(wù)端配置翻半天。退出碼要檢查。curl 返回 0 才是成功$?非 0 時要按碼定位6 是域名解析失敗7 是連不上9 是 FTP 訪問被拒67 是登錄失敗78 是遠程文件不存在。把這幾個碼寫進腳本的錯誤分支比事后翻日志快得多。if ! curl -sS -u $FTP_USER:$FTP_PASS --ftp-create-dirs \ -T ./report.csv ftp://ftp.example.com/upload/report.csv; then code$? case $code in 67) echo 認證失敗檢查賬號密碼 2 ;; 78) echo 遠程路徑不存在 2 ;; *) echo 上傳失敗curl 退出碼 $code 2 ;; esac exit 1 fi-sS的組合值得解釋-s靜默掉進度條-S在出錯時仍然把錯誤信息打出來。只寫-s會讓腳本失敗得悄無聲息這是我在流水線里踩過的坑。4.2 lftp 的 mirror目錄級同步的正解單文件用 curl整目錄同步就該換 lftp。mirror子命令是 lftp 的核心競爭力它支持遞歸、支持斷點續(xù)傳、支持并行、支持排除規(guī)則寫起來還短。# 把遠程 /data/2024 同步到本地 ./backup-c 表示續(xù)傳-n 只拉新文件 lftp -u $FTP_USER,$FTP_PASS ftp.example.com -e set ftp:passive-mode true; set net:timeout 20; set net:max-retries 3; mirror -c -n --parallel4 /data/2024 ./backup; bye # 反向把本地 ./dist 推送到遠程 /public/release lftp -u $FTP_USER,$FTP_PASS ftp.example.com -e set ftp:passive-mode true; mirror -R -c --parallel4 --exclude-glob *.tmp ./dist /public/release; bye -c是續(xù)傳-n是只傳新文件基于大小和時間做判斷-R是反向鏡像本地到遠程--parallel4開 4 個并發(fā)連接。并發(fā)數(shù)不是越大越好很多 FTP 服務(wù)器對單 IP 的連接數(shù)有限制超過會直接被拒或者限速4 到 8 是比較安全的區(qū)間。set net:max-retries 3配合net:timeout是穩(wěn)定性關(guān)鍵。FTP 在大批量小文件場景下很容易出現(xiàn)個別文件超時沒有重試的話整個 mirror 會中斷。但重試也別設(shè)太大否則一個壞文件能把你卡到天亮。--exclude-glob用來排除臨時文件這個在鏡像構(gòu)建目錄時特別必要否則.tmp、.swp這些垃圾會反復(fù)被推送還會因為時間戳變化導(dǎo)致每次都被判定為「新文件」。4.3 定時同步腳本鎖、日志與失敗告警把上面的命令塞進 crontab 之前有三件事必須補上防并發(fā)、留日志、失敗可見。防并發(fā)用flock防止上一輪沒跑完下一輪又起來了兩個進程同時往一個目錄寫結(jié)果一定是災(zāi)難。日志按天切分別讓它無限增長。失敗告警最簡單的做法是靠退出碼觸發(fā)lftp在-e里的命令失敗時退出碼非 0可以在外層判斷。#!/usr/bin/env bash set -euo pipefail LOG_DIR/var/log/ftp-sync mkdir -p $LOG_DIR LOG_FILE$LOG_DIR/sync-$(date %Y%m%d).log { echo 開始 $(date %F %T) if ! lftp -u ${FTP_USER},${FTP_PASS} ftp.example.com -e set ftp:passive-mode true; set net:timeout 20; set net:max-retries 3; mirror -c -n --parallel4 /data/2024 /data/backup/2024; bye ; then echo 同步失敗 $(date %F %T) 2 exit 1 fi echo 結(jié)束 $(date %F %T) } $LOG_FILE 21crontab 里的寫法是*/30 * * * * flock -n /tmp/ftp-sync.lock /opt/scripts/ftp-sync.sh。flock -n表示拿不到鎖就立刻退出不會堆積。這套結(jié)構(gòu)看著樸素但比很多花哨的同步框架可靠因為它每一環(huán)的失敗都能在日志里找到對應(yīng)的一行。5. 避坑與排查亂碼、425、超時、550 的五條血淚記錄前面幾章講的是「怎么讓它跑起來」這一章講的是「它跑起來之后為什么還會出事」。下面五條都是我在實際環(huán)境里遇到過的按「現(xiàn)象 → 原因 → 解決」記能對上一個就省一晚上的時間。5.1 中文文件名變成亂碼上傳后下載不回來現(xiàn)象本地文件名是日報_20240601.csv上傳到服務(wù)器后用客戶端看是一串問號或者方塊用腳本nlst列出來是??_20240601.csv再按原名RETR直接報 550。原因控制連接上的文件名字節(jié)編碼和服務(wù)器解釋的編碼不一致。ftplib 的encoding默認是 UTF-8很多國內(nèi)老服務(wù)器默認 GBK字節(jié)流過去之后被按另一套碼表解碼就成了亂碼。另外有些服務(wù)器即使支持 UTF-8也需要顯式發(fā)OPTS UTF8 ON才切換。解決先試ftp.sendcmd(OPTS UTF8 ON)成功說明服務(wù)器支持 UTF-8保持encodingutf-8如果返回500或502把encoding改成gbk再跑一遍。命令行側(cè) curl 沒有直接的編碼開關(guān)我一般改用 lftp 并設(shè)置set ftp:charset gbk或set ftp:charset utf-8。驗證方法很簡單上傳一個中文名的小文件立刻nlst回來比對字節(jié)別等全量傳完再發(fā)現(xiàn)。5.2 425 打不開數(shù)據(jù)連接控制連接卻完全正?,F(xiàn)象登錄成功PWD正常返回一執(zhí)行LIST或RETR就報425 Cant open data connection重試幾次偶爾能成功。原因被動模式下服務(wù)器返回的臨時端口沒有在防火墻或安全組放行。偶爾成功是因為區(qū)間里個別端口恰好被放通了或者會話復(fù)用了上一次的連接。另一種可能是服務(wù)器返回的 PASV IP 是內(nèi)網(wǎng)地址客戶端在公網(wǎng)側(cè)根本連不上。解決先開set_debuglevel(2)或者手動發(fā)PASV把服務(wù)器返回的 IP 和端口算出來前面講過p1*256p2的換算。然后核對防火墻放行區(qū)間讓服務(wù)端把pasv_min_port和pasv_max_port固定成一段連續(xù)端口并整體放行。如果服務(wù)器返回的是內(nèi)網(wǎng) IP需要在服務(wù)端配置里指定對外通告的地址這一項各服務(wù)端軟件叫法不同得看具體實現(xiàn)。5.3 大文件傳到 90% 斷了重跑又從零開始現(xiàn)象幾 GB 的備份包傳了半小時在快結(jié)束時拋TimeoutError或ConnectionResetError腳本重跑一遍進度從 0% 重新開始反復(fù)幾次永遠傳不完。原因FTP 的空閑超時和數(shù)據(jù)傳輸超時都會在中途觸發(fā)尤其是鏈路質(zhì)量差的時候。更關(guān)鍵的是默認的STOR命令會截斷同名文件重新寫不具備續(xù)傳語義所以重跑必然是覆蓋。解決上傳用APPE命令追加或者用STOR配合rest參數(shù)指定偏移量下載用RETR配合rest。ftplib 的storbinary和retrbinary都有rest參數(shù)傳字節(jié)偏移即可。偏移量從遠程SIZE拿本地文件也按同樣大小截斷對齊。更省事的做法是直接用 lftp 的mirror -c或者 curl 的-C -它們內(nèi)部處理了這套邏輯。5.4 550 權(quán)限錯誤但賬號明明有寫權(quán)限現(xiàn)象上傳時報550 Permission denied或者550 No such file or directory運維確認賬號對目標目錄有寫權(quán)限。原因三種可能。一是目標目錄根本不存在FTP 不會自動建目錄550 No such file or directory很多時候就是這個意思二是當前工作目錄不在預(yù)期位置腳本上一步cwd到了別處三是服務(wù)端的chroot或家目錄限制讓絕對路徑不可達你用的/upload/xxx在服務(wù)端被解釋成了別的路徑。解決先用ftp.pwd()確認當前位置再用ftp.cwd(/)回到根看目錄結(jié)構(gòu)最后用相對路徑操作。目錄不存在就按前面mkd逐級創(chuàng)建的方式補上或者命令行加--ftp-create-dirs。如果cwd(/)之后看到的結(jié)構(gòu)和預(yù)期完全不同那就是被 chroot 了所有路徑都得按賬號家目錄的相對路徑來寫。5.5 腳本跑著跑著不報錯也不動了現(xiàn)象定時任務(wù)卡住沒有輸出進程一直掛著ps能看到但 CPU 和網(wǎng)絡(luò)都是 0。原因connect時用了默認的timeoutNonesocket 進入阻塞狀態(tài)永不超時。服務(wù)端已經(jīng)悄悄斷了控制連接客戶端還在傻等一個永遠不會來的響應(yīng)。解決所有connect調(diào)用強制傳timeout20 到 30 秒是常用值在長任務(wù)中間定期發(fā)NOOP探活失敗就重建連接。crontab 外面再套一層timeout 3600兜底讓卡死的進程自己被殺掉比事后手工清理干凈得多。這套「超時 探活 外層兜底」三重保險是我在吃過一次卡死一整晚的虧之后固定下來的寫法。6. 進階收口斷點續(xù)傳、顯式 FTPS 與傳輸后校驗把基礎(chǔ)的傳通之后剩下的價值都在「出事時能恢復(fù)」和「傳完之后能證明它是對的」這兩件事上。這一章說三個具體做法都是可以直接塞進現(xiàn)有腳本的。6.1 用 REST 和 SIZE 做真正的斷點續(xù)傳斷點續(xù)傳的核心是一個字節(jié)偏移量。下載時先用SIZE拿到遠程文件總大小再看本地已下載多少用rest參數(shù)告訴服務(wù)器從哪個字節(jié)開始發(fā)。上傳同理但方向反過來遠程用SIZE拿已上傳的字節(jié)數(shù)本地文件用seek跳到對應(yīng)位置。import os from ftplib import FTP def resume_download(ftp, remote_path, local_path): remote_total ftp.size(remote_path) local_size os.path.getsize(local_path) if os.path.exists(local_path) else 0 if local_size remote_total: print(本地文件已完整跳過) return mode ab if local_size else wb with open(local_path, mode) as fp: # rest 參數(shù)即偏移量服務(wù)器從該字節(jié)位置開始發(fā)送 ftp.retrbinary(fRETR {remote_path}, fp.write, blocksize65536, restlocal_size) # 傳完必須校驗不一致說明中途又斷了 if os.path.getsize(local_path) ! remote_total: raise RuntimeError(續(xù)傳后大小不一致需要整體重傳)這段邏輯里最容易錯的是最后那個校驗。rest參數(shù)在部分服務(wù)器上行為不規(guī)范可能忽略偏移量從頭開始發(fā)結(jié)果就是本地文件前面一段被重復(fù)追加大小直接超過遠程。加一道大小比對能第一時間發(fā)現(xiàn)這種「假續(xù)傳」代價只是一次getsize。上傳側(cè)的寫法和這個鏡像對稱用storbinary的rest參數(shù)配合本地fp.seek(local_size)。要注意storbinary從文件對象的當前位置開始讀所以seek必須在調(diào)用前完成。6.2 顯式 FTPS把明文通道關(guān)掉如果傳輸?shù)氖琴~號、日志、業(yè)務(wù)數(shù)據(jù)明文 FTP 意味著密碼和內(nèi)容都在網(wǎng)絡(luò)上裸奔。顯式 FTPSFTP over TLS在 21 端口上先明文建連再用AUTH TLS升級加密兼容性比隱式 FTPS 好大多數(shù)服務(wù)端都支持。import ssl from ftplib import FTP_TLS ftps FTP_TLS(contextssl.create_default_context()) ftps.encoding utf-8 ftps.connect(ftp.example.com, 21, timeout20) ftps.login(demo_user, demo_pass) ftps.prot_p() # 關(guān)鍵把數(shù)據(jù)連接也加密不加這行數(shù)據(jù)仍是明文 ftps.set_pasv(True) print(ftps.nlst(.)) ftps.quit()prot_p()這一行是分水嶺。很多腳本登錄之后忘了調(diào)用它控制連接加密了、數(shù)據(jù)連接還是明文等于白配。另外ssl.create_default_context()會啟用證書校驗如果服務(wù)端用的是自簽證書會直接拋SSLCertVerificationError生產(chǎn)環(huán)境應(yīng)該把服務(wù)端證書的 CA 加進信任鏈而不是圖省事用_create_unverified_context()關(guān)掉校驗——關(guān)掉之后加密就只能防旁觀防不了中間人。6.3 傳輸后的校驗清單最后說一個我固定執(zhí)行的動作每次批量傳輸結(jié)束后跑一遍校驗清單而不是相信「腳本沒報錯就是成功」。檢查項手段判定標準文件數(shù)量本地ls計數(shù) vs 遠程NLST計數(shù)數(shù)量一致缺一個都要查單文件大小os.path.getsizevsftp.size()逐字節(jié)相等關(guān)鍵文件哈希本地 MD5 vs 遠程RETR計算 MD5抽樣比對重要文件修改時間本地 mtime vsMDTM返回值增量同步時用于判斷新舊傳輸模式TYPE I是否生效文本文件大小不應(yīng)出現(xiàn)偏差這張表我一般做成一個獨立的小腳本傳完之后單獨跑輸出一份對賬結(jié)果。它的價值不在于發(fā)現(xiàn)大問題——大問題腳本早就拋異常了——而在于發(fā)現(xiàn)那些「差幾十字節(jié)」「少一個文件」的靜默失敗這類問題在第二天業(yè)務(wù)方找上門時才發(fā)現(xiàn)排查成本是當場發(fā)現(xiàn)的十倍。還有一個習(xí)慣任何一次改動過連接參數(shù)、編碼、路徑的腳本上線前先用一個只含兩三個小文件的測試目錄完整跑一遍包括上傳、下載、校驗和故意中斷后的續(xù)傳。FTP 的問題大多不是邏輯錯是環(huán)境差異本地跑通不代表生產(chǎn)跑通但本地跑不通一定別往生產(chǎn)推。那次凌晨少了一個包的教訓(xùn)之后我每次把同步腳本交給別人之前都會強制走一遍「小目錄全流程 斷網(wǎng)續(xù)傳 大小校驗」這三步寧可多花二十分鐘也不想再對著干凈的日志找一晚上原因。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人人爱操| 欧美综合天堂| 97色97干| 欧美日韩国第一区| 丁香九月婷婷| 一区二区你上我| 男人天堂无码| 日本一级性爱| 国产av色网| 激情五月天插| 内射中国少妇高清视频免费视频| 爽 好舒服 无码刺激久久| 中文字幕久久亚州无码| 人妻乱仑一区二区三区| 亚洲色婷婷综合久久一区二区三区| 黑人嘿嘿嘿超爽免费视频| 新精精品久久精品| av无码av无码专区| 97久久天天综合色天天综合色电影| 免费黄色片。| 啊啊啊啊,啊啊好多水 | 丝袜亚洲综合| 躁躁日曰躁2020| 国产91乱伦| 东京热熟女亚洲视频网站| 高清国产成人无码| 亚洲国产亚洲天堂| 久碰视频| 啪啪资源网| 综合情欲网| 99这里有精品视频| 999久久久免费精品国产牛牛| 嗯嗯啊啊操死我| 无码人妻一区二区三区色欲aⅴ | 国产在线不卡导航| 亚洲高清无毛一区二区| 日产成人久久| 亚洲国产第一页综合视频| 精品人妻中文字幕高清| 九一性生活免费视频| 911粉嫩人妻| 999国产精品999久久久久久| 午夜精品久久久久久久男人的天堂 | 国产丸一视频| 操狠狠| 操操逼视频| 99re在线视频国产| 久久久久久性爱视频| 东北丰满熟女国产一区 | 99re不伦| 九九毛片这里只有精品| 日本99久久| 婷婷爽人人婷婷爽视频| 好看的久久不射无码影视影院| 日本精品成人无码| 中文字幕第9页萱萱影音先锋 | 五月丁香| 欧美成人四级在线播放| 91丝袜视频在线观看| 亚洲色图加勒比| 国产精品爽爽va在线观看98| 久久这里只精品免费福利| 锕锕好爽 死我在线观看| 日日狠狠久久偷偷色综合免费| 亚洲欧美国产中文视频| 天天干人人乐| 精品无码少妇| 青娱乐手机日韩在线视频| 丰满人妻av一区二区三区| 日韩免费a级毛片无码a∨| 国产精品久久久999| 国产伦精品免编号公布| 亚洲国产激情国产av| 操逼无码操逼| 午夜一区| 亚洲成a人v欧美综合天堂下载| 曰本91情色| http://qxhbdz.com| 思思热免费视频观看| 亚洲乱码精品一区二区| 亚洲熟女综合网| 欧美亚洲厕所精品偷拍91 | 欧美性爱中文字幕无线码| 淫荡网址| 男人综合网| 精品中文一区二区| 国产精品国产| 中文一区二区| 综合97久久| 1区2区3区中文字幕日韩| 狠狠操夜夜操蜜桃视频三区| 五月香婷婷| 久草国产在线视频| 国产欧美岛国精品一区| 五月丁香啪| 激情五月天社区| 国产亚洲美日韩Aⅴ中文字幕无码成人| 92一区二区| 强乱老妇中文字幕| 欧美综合网在线| 五月天婷婷在线看| 欧美天天干| 日韩欧美丝袜诱惑| 国内成人圈中文字幕无码视频| 国产综合在线视频网站| 九月婷婷久久| 激情五月天色播| 国产女人91精品嗷嗷嗷嗷| 久久av成人无码免费| 国产精品久久天天干| 99热这里只有精品18| www.91视频网| 啊啊啊啊啊在线| 日本欧美不卡| 日韩成人性日韩成人性爱视频在线免费观看| 91殴美| 熟妇一区二区| 啊啊啊操死我| 看免费一级在线播放毛片| 九九九免费视频| 亚洲欧美日韩中文播放| 密乳无码| 国产精品熟女丝袜一区二区| 欧美一级三级| 九九英色视频| 人妻人妻天天碰| 国产高清在线自在拍69| 亚洲久9| 亚洲日韩av专区无码| 超碰色综合| 人妻干天天| 色狠狠 - 百度| 欧美熟女操屄| 熟女精品一区二区三区| 免费人人搞97| 深夜激情 | 久久极品一区二区| 麻豆a'v电影| 青草地一本线一区二区三区| 一级一性爱免费视频| WWW啪啪的com| 久久精彩视频| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 日日插夜夜| 久久三| 色五月综合| 国产美女91视频| 精品人妻视频一区二区在线播放| 97国产超碰| 无码直播久久久| 久久夜黄色无码A级大片| 涩五月婷婷| 久久久久久久国产| 熟女激情综合网| 国产精品成人蜜臀AV在线| 亚洲熟妇自偷自拍另欧美| 97超碰天天爱天天爱| 久区视频| 日韩美女操b| 天美AV片| 777超碰| 亚洲精品aa久久伊人| 翘臀vidoes| 日韩精品人妻中文字有码在线| 蜜臀久久99精品久久久久久婷婷| 国产AV毛片| 九九热免费国产视频婷婷伊人五月| 青青欧洲黑| 中文字幕在线免费观看2| 影音先锋中文字幕日本好一区二区| 欧美黑人性猛交91| 午夜视频久久久| 亚洲国产精品成人综合| 激情五月综合| 久久9999| 天美AV片| 亚洲久9| 国产做?爰片久久毛片?片美国| 99999精品视频| 欲色啪| 芊芊操逼视频无码| 日韩成人午夜精品久久高潮| 日本人妻丰满熟妇久久久久久| 极品极品色影院| 99只有精品| 午夜精品久久一区二区| 日本91白丝| 亚洲中文字幕久久无码精品| 乱伦Av网| 粉嫩av一区二区三区天美传媒| 欧美色视频在线| 欧美熟妇乱码在线一区| 眼镜人妻101.com| 亚洲91极品| 97超碰超| 蜜桃久久综合视频| 东京热双插| 五月天激情视频| 男人的天堂com| 操逼视频亚洲| 神马久久免费电影观看| 激情AV| 国产乱码久久久| 日韩无码成人电影| 日韩一卡二卡三卡| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 久久精品中文字幕无码l| 天天澡天天爽日日av| 亚洲一卡二卡在线免费| k频道色撸撸| 亚洲无码AV九九九| 天堂网亚洲区手机版| 中文字幕jul-617人妻熟女| 热热色AV| 狠狠狠一区二区三区| 超清中文乱码字幕| 91麻豆天美国产| 日本免费中文字幕在线| 色97欧美| 久久大香蕉手机高清视频| 91丨国产丨白浆秘 洗澡动漫| 欧美色图片91| 精品一二三区久久AAA片| 啪啪啪男女亚洲中文字幕99| 日产国产精品中文久久婷婷| 中国女人内射6XXXXX| 少妇熟女视频一区二区三区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美青青草视频| 欧美精品自慰系列寂寞少妇| 亚洲男人电影天堂| 欧美性爱一区| 久久露脸国产老熟女| 精品国产乱码久久久久久蜜臀| 久操B网| 久久亚洲AV无码专区首页| 色香91| 99爱精品| 久久美女国产| 国产路线专区| 日韩精彩视频| 东北少妇高潮zzzz| 久久精品成人一区二区三区蜜臀| 黑操B| 黄色片A级一区二区三区| 中文字幕伊人| 亚洲熟妇图片| 久久亚洲精品成人av| 久久少妇| 欧美日韩亚洲国产中文永久天天看| 国产成人精品日本亚洲语言| 国产亚洲精品无码三区| 欧美翘臀视频网站一区二区三区| 成人熟女区| 日韩另类色图| 日韩性爱高清免费视频| 手机看片日韩人妻| 欧美日韩资源| 国产嫩草精品A88AV| 10000部十八禁看电影| 日本免费中文一区二区三区四区| 男人的天堂午夜av| 男人的天堂 在线一区| 97超碰免费生活| 99re这里只有精品3| 久色网| 91午夜无码| 香蕉视频精品亚洲一区二区三区在线播| 妇人噜噜| 自拍丝袜美腿人妻| 亚洲熟妇极品| 嗯嗯嗯啊啊啊在线免费观看| 久久婷五月天| 亚洲Av无码成人精品国产| 国语对白露脸XXXXXX| 女生看匆91网站| 玖玖草久草99蜜月一区二区三区| 亚洲综合113页| 天天插天天干| 激情综合五月婷婷| 久久婷婷亚洲| 国产又操| 国产福利影视| 综合欧美日本三级| 久久精品国产96精品亚洲拳交| 在线岛国新天堂8| 新亚洲无码| 欧美日韩中文字幕人妻| 欧美亚洲手机在线| 国产精品一区二区密臀| 亚洲av资源| 美女91网| 91爱网| 后入合集| www.男人的天堂| 国产美女高潮视频| 亚洲久9| 亚洲精品99999| 久久丝袜| 人妻三级在线中文字幕| 亚洲一区中文精品| 777AV电影| 日韩无码a片| 日韩色欲久久一二三四区| 一本一道vs波多野结衣| 欧美精品日韩一区二区| 狠狠综合| 欧美少妇第一页| 91丝袜激情在线| 超碰人妻中文在线| 好湿好紧视频| 午夜精品久久99蜜桃的功能章节| 蜜乳中文字幕a在线| 日产操逼| 欧美极品性爱天天射| 久久久久久国产精品免费网站| 可以在线观看的黄色网址| 93人人操人人| 丁香婷婷久久| 欧美性爱一区二区三区四区 | 久久久工口| 久草色悠悠在线视频| 欧美操逼视频二区| 骚妻少妇精品性色无码四色A V| 九九九久久久W精品| 国产精品久久久啊| 强奸a片网| 欧美专利1区2区3区4区5区免费| 欧美精品 - 91爱爱| 黄色十八禁| 97亚洲中文| 国产JDAV无码视频在线观看| 操逼片中文| 2020中文字幕| 国产精品3| 清纯唯美第一页| 久久精品一区二区一8| 熟妇的味道HD中文字幕| 96精品在线| 91精品成人| 99在线精品观看视频中文 | 夜夜春夜夜操| 欧美爱三级日韩久久| 黄色免费网页无码| 色月天AV导航| 97色碰| 日韩一性一交一A片俄罗斯| 夜夜嗨一区二区| 夜夜爽爽夜夜精品视频| 欧美一区二区男人天堂| 天堂8在线新版官网| 亚洲 欧美 中文 日韩超碰| 蜜屁Av| 久久国产乱子伦精品免费女,网站| ,成人免费啪啪视频| 这里只有精品久久| 亚洲97资源| 久久夜黄色无码A级大片| 国产一区二区三区中文字幕| 国产精品色约约| 亚洲欧洲成人在线电影| 麻豆天美电影一区二区| 欧美97se| 操逼逼无码| 一区二区三区成人| 精品蜜乳AV免费观看| 婷婷五月av| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 综精品久久久aaaa| 男人的天堂久久久| 97人人干| 天躁夜夜躁2021| 99久久久er直播网址| 人人妻人人色| 色y情视频免费看| 久久精品免费| 欧美少妇色图| 亚洲天堂性爱| 乱伦熟妇一区二区| 天天综合香 ld视频| 人妻夜夜爽天天爽三区麻豆AV网站| 伊人久久大香大香线蕉中文| 91精品在线播放| 国内毛片国产专区二| 欧美日韩亚洲电影| 黄色高清无码无码破解免费暗网| 亚洲美女黄色| 亚洲免费成人精品电影| 加勒比综合a∨| 天堂中文日本在线观看| 在线五区| 国产AV超爽| 国产精品另类一区大香蕉| 人妻在线视频| 日日夜夜骑| 综合熟女| 粉嫩av在线| 欲色影视综合吧| 综合伊人激情| 97精品国产手机| 国产中文大片资源中文字幕| 亚洲图片 激情小说| 日韩欧美中文日韩欧美色| 嗯嗯啊啊啊啊轻点视频| 强免费黄色网址| 亚洲黄色电影| 淫色网综合| 内射老妇BBWX0C0CK| 天天干天天日天天射黄色片| 狼狼色丁香久久婷婷综合五月| 青草园大香蕉| 久操婷婷| 国产资源中文字幕在线| 日韩啪啪啪视频| 国产 热久久久久国产精品| 97在线资源| 婷婷伊人网| 嗯嗯啊啊好爽| 色色色色色色色色综合| 99热超碰在线| 精品人妻一区二区三区四区石在线| www.AV有限公司一区| 亚洲熟女中文字幕在线| 1240青青草一区二区三区视频天爱| 有码免费观看| 欧亚性爱啪啪| 97啪啪| 亚州日韩97| 五月天激情视频| 亚洲啪啪视频免费| 亚洲中文字幕av | 亚洲性爱高潮影院| 久久伊人亚洲AV无码网站| 夜夜免费视频| 国产传媒美日韩av| 欧美中出1| 26uuu久久| 制服丝袜第二页| 91亚洲人电影| 国产懂色精品国产av| 中国一级αV| 中文一区二区| 天堂资源欧美| 婷婷大香蕉| 日本熟女免费視颖| 超碰91在线| 亚洲影视第一页| 欧美久久婷| 国产无马av| 又大又长又粗又爽又黄| 性夜影院爽黄A爽免费动漫| 丝袜色综合| 久久仑合| 97亚洲综合电影| 丁香啪啪| 国产真实野战在线视频| 日韩色| 亚洲 暴爽 AV人人爽日日碰| 精品人妻高清麻豆av| 97爱b| 亭亭丁香激情| 天天爽爽爽爽| 丁香五月偷拍| 久久五月综合| 国产热RE99久久6国产精品首| 天天懆天天日| 成人自拍三级在线观看| 人人做天天爱| 天天上日日上日韩精品| 五十路熟女人妻一区二区三区四区五| 97视频一区| 亚洲91射| 97国产综合欧美| 日日日大屁股骚女人精品| 曰本精品久久久| 日本一区二区三区精品| 在线观看AV不卡| 欧美亚性天堂| 亚洲天堂男人在线| 日韩精品区二区三区不卡| 久久大香蕉| 五月婷婷AV| 亚洲欧美日韩综合在线尤物 | 极品欧美一区二区三区| 成人午夜高潮av猛片| 12一15性XXXX粉嫩国产| 日语五十路和六十路亚洲国产精品 | 9超碰免费| 亚洲日本男人天堂网| 综合色图,成人综合网| 免费观看有码高清视频| 激激五月| 超碰天天久久79| 99九九久久| 人妻少妇精品久久久| 亚洲老司机123专区| 天天操天天日天天干| 在线五区| 快灬快灬 一下爽蜜桃在线观看| 水滴偷拍| 久久久久久网址| 先锋影音av先锋一区| 精品无码久久久久久国产浪潮| 亚洲性爱免费电影| 尤物一级在线免费观看| 大香蕉宗合网在线| 亚洲精品 超碰| 四虎在线免费视频| 91亚洲网站| 亚洲色婷婷久久91| 一区二区三区探花在线观看| 久久精品亚洲成a人天堂| 色五月激情网| 九九英色视频| 少妇激情AV| 啊啊啊免费视频| 日韩免费福利在线观看| 国产 日韩 另类 视频一区爱| 天天干一干| 天天综合网久久ww| 97精品人妻一二三四| 国产操逼网站亚洲一级黄色| 两性色网| 亚州精品一区二区三区香中文字幕在线| 欧美日日夜夜| 9.1小视频| 搡老女人老熟女91| 色噜噜人妻丝袜a∨先锋影 | www.91色综合| 久久久av爱| 色噜噜人妻丝袜a∨先锋影 | 立川理惠加勒比无码| 亚洲中文字幕网| 亚洲中文字幕在线视频一区二区| 夜夜嗨一区二区三区三州加勒比| 91撸色网 玖玖网 欧美| 久久久精品日本一道| 在线观看av区| 台湾成人无码AV| 中国AAAAAA黄色片| 啊啊啊好多水| 一区二区影视| 春色91| 青青草在线视频播放器| 亚洲怡春院| 亚洲日韩熟女人妻高清在线| 性色av一区二区| 精品人妻夜夜草| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 男人天堂网手机版婷婷| 久久久久网站-538在线视频-欧美永久乱码 | 99久久精品无码一区二区毛片免费 | 中日无幕一二三四区| 五月天激情小说| 中文字幕jul-617人妻熟女| 日韩精品黄片免费观看| 亚洲精品无码久久AV| 国产最新小视频在线播放下载 | 夜夜嗨一区二区| 色色丁香| 人人操av| 欧美精品四区| 18精品一区| 久久久精久久久| 少妇与黑人高潮在线| 欧美最婬乱婬爆婬性视频 | 玖玖蜜臀资源网| 精品久久久久黄少妇| 亚洲射综合网| 婷婷另类小说| 日韩人妻精品| 国际精品久久久| 欧美色另类| 国产老太乱伦一区| 乱伦一二三区| 欧美成人性爱视频免费观看| 大香蕉丝袜一级片| 蜜桃久久综合视频| 天天综合网91入口| 亚洲的天堂网| 91天堂丝袜美腿| 欧美色性情| 小说区 图片区色 综合区| 无码操逼视频一下| 国产精品一区二区 尿失禁| 激情五月天色色网| 久久久久密| 亚洲综合九| 新怡红院| 欧洲黄色网| 亚洲中文国际强奸字幕| 九色 蝌蚪 熟女自| 综合色欧美| 欧美高清无码免费视频高清版| 久久久久久人妻一区精品色欧美| 国产强奸超碰AV| 国产玖玖| 国产在线精品电影观看| 丝袜美腿丝袜| 一级AV性爱| 国产精品自产拍在线观看社区| 免费观看欧美日韩操逼视频| 精品国产99| 亚洲日韩狠狠撸视频| 男人天堂网站| 一本一道vs波多野结衣| 日本久久久久久久久| 久草热制服丝袜在线观看| 国产人妻久久精品一区二区三区| 五月天我淫我色av| 欧美性生活综合| 97香蕉人人乳| 蜜屁av| 天天色黄色影院天天操| 开心五月天激情网| 另类视频在线| 欧美色999| 成人性爱全视频观看| 久久9久9久99久9久9| 日韩二区三四区五区六区在线看| 国产农村妇女精品| 国产粉嫩出水在线播放| 久久亚洲不卡一区二区三区 | 亚洲欧美另类激情小说| 在线观看精品国产免费| 久久少妇视频| 蜜臀久久99精品久久久久久-DVD | 中文字幕亚韩| 国产精品久久久777| 亚洲人妻爽爽爽| 91c色| 国产精品熟女AV中文字幕在线播放| 夜夜嗨老熟女AV一区二区三区| 97无码视频在线播放| 中文字幕黄色片| 精品999日本| 男人的天堂2018| 日韩精品一区二区三区色欲| 久久久久9| 日本人妻伦在线中文字幕| 五月丁香影院| 少妇熟女视频一区二区三区 | 国产熟女免费观看久久| 国产偷仑| 欧美成人一级麻豆| 韩国久久97| 天天射天天色成人| 岛国黄色大片网站| 婷婷香网站| 久艾草在线精品视频在线观看| 噜噜在线| 狠狠入| 国产 丝袜 欧美中文 另类| 国产白丝在线| 日韩乱伦AⅤ| 国产精品 午夜福利| 国产精品电影大全| 鲁鲁色综合网| 九九热九九| 色五月综合| 国产农村妇女毛片精品久久| 日韩中文字幕二区| 午夜福利一区二区三区四区五区色婷婷| 成全在线观看免费观看| 美腿丝袜高跟网免费视频免费视频| 国产精品96| 日韩AV电影网站| 麻豆精品.欧美精品.日韩精品.| 成人AV在线电影| 中文字幕av片| 欧美性爱另类综合| 曰本道人妻久久久在线不卡色视频| 日韩无码黄色片| 99久在线精品99re8a| 亚洲精品尤物yw在线影院| 日韩钢筋无码高清啾啾啾| 免费看黄片现成| 精品然女一区二区| 午夜视频好爽啊| 中文一区在线日| 日韩乱伦影音先锋| 欧美日本视频一区| 久久久久久人妻| 搡老女人老91二区| 九九九综合精品| 9国产超碰| 久久超碰98| 91精品啪在线观看国产城中村| 在线 欧美 亚洲| 久综合网| 日韩BBN| 天天操夜夜操| 婷婷伊人五月| 久热久操| 国产原创剧情在线丝袜| 97亚洲在线| 午夜欧美J进J出白浆流出久久久 | 两性色网| 91精品人妻一品二品三品| 婷婷色一区| 精品然女一区二区| 亚洲无码免费看| 国产丁香精品露脸视频| 亚洲图片欧美日韩| 国产精品点击进入在线影院| 国产AV线| 久都青青视频 | 日本色婷婷| 亚洲男人综合| 亚洲天堂资源| 五月天婷婷欧美三区| 老熟女乱伦一区| 欧美性Fer办公室秘书| 五月天激情小说网| 中文字幕精品一区欧美| 夜夜嗨一区| 日日夜夜骚| japan日本高清乱xxxx| 美女好片色日本| 青青操在线亚洲视频观看欧美在线 | 无码色| 亚欧性爱无码| 99久久99九九99九九九| 久久九七| 久热九九| 日本性爱欧美性爱| 久久高潮妇女视频| 97精品国产精品免费观看| 激情四射五月天| 国产精品成人久久一区二区三区| 欧美日韩不卡传媒| 国产精品欧美激在线| 久久婷五月| 日本性爱欧美性爱| 国产99热| 另类专区加勒比| 啊啊啊好湿国产一二| 熟女被操视频网址| 国产无码高清操逼视频| 清纯唯美综合| 97超碰超欧美。| 韩日男人的天堂| 久久激情综合| 2019天天干天天操| 亚洲网站一区二区在线| 99精品无码| 欧美日韩国产电影| 无码99| 大香蕉乱伦视频网| 日韩无码三级影院| 日韩在线国产字幕| 亚洲青青草| 亚洲国成人情色好看电影| 六月丁香五月婷婷| 欧亚性爱视频免费看| 翔田千里Av在线| 欧美激情综合网| 国产白丝网站| 女上位精品在线| 亚洲www91| 91 丝袜在线| 理论久久婷婷网 8| 女人高潮大叫一级毛片| 欧美少妇性爱网站| 欧洲欧美视频一区二区| 成·人免费午夜在线观看| 欧美一级二级三级| 亚洲少妇综合| 中文字幕av片| 亚洲国产精品久久久久婷婷老年| 天天摸夜夜操视频| SS久久| 丝袜综合| 殴美日韩m| 人妻碰碰碰碰碰碰| 日本91白丝| 男人的天堂2010| 99热这里只有精品99| 日韩av乱伦| 91一起操| www.zbzhongsen.com| 亚洲夜夜欢无码一区二区| 国产中文字幕曰本毛片| 激情综合二| 久久久久久久亚洲Av无码| 国产一区二区三区久久久精品| 岛国片在线视频网站| 精品高清av中文字幕| 黄色免费网| .精品人妻一区二区三| 激情黄色片在线观看| 四虎国产精品永久在线囯在线| 亚洲美女AV无码| 亚洲成人激情小说视频| 欧美高清18A片| 国产亚洲精品A在线观看下载| 強姦亂倫a| 无码丰满熟妇一区二区浪潮AV| 天天操夜夜操狠很操| 亚洲精品国产熟女| xxx0国产在线播放| 欧美劲爆视频一区二区| 欧亚在线视频| 五月色综合| 嗯嗯,啊啊,国产精品| 欧美一区二区日韩传媒搭讪精品| 天天日日本| 青青草啪啪网| 久久国产999| 18精品一二区| 超碰97亚洲| 100啪啪视频大全| 思思热国产在线视频| 人妻中文字幕日韩电影| 操人91| 欧美亚洲性爱一区二区| 99re95| 九七毛片九九毛片| 欧美综合色图片| 欧美激情久操网| 亚洲免费成人在线高清无码视频| 精品久久久久久中文| 探花精品视频| 97色插| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲少妇色| 91色噜噜狠狠| 男人天堂网手机版婷婷| 大奶的诱惑| 国产成年女人免费视频播放a| 青草青草久热| 天天添天天干电影| 欧美性生活内射| 中韩中文字幕在线观看| 精品一区二区国产日韩| 亚洲天堂7777| 日韩性色b| 亚洲日韩乱码中文无码蜜桃臀网站| #NAME?| 国产毛片毛片4p懂色| 亚洲中文日韩欧美大香蕉视频| 色婷婷综合网| 久久中出在线| 久九九九九九九九热| 中国AV美女| 欧美很很操视频| 刺激性视频黄页| 亚洲色情在线影视| 91黑人狂躁丰满熟妇| 亚洲导航深夜福利| www.狠狠干.coom | 国产激情久久久| 中文字幕88av在线| 97欧美日韩综合| 激情抓乳插进去啪啪啪日韩| 三级三久久线久久99久目本WW| 亚洲网自拍| 男人的天堂视频精品乱在线| 人妻丰满熟妇一区二区三| 丁香五月天激情综合| 蘋果手機免費看成人Av| 操东北女人| 搡老熟女老女人老熟妇免费视频| 国产农村妇女精品一| 岛国天天午夜影院传媒网| 国产精品人人爽人人做可爱福利| 污啪啪啪视频| 少妇久久久免费| 无码操逼视频一下| 天天舔天天 | 国产日韩欧美三级片| 欧美亚洲一区二区久久久婷精品大包诱| 91精品91久久久久77777| 人妻干天天| 中文字幕日韩综合| 97国产中文| 口爆吞精在线观看| 精品然女一区二区| 九九无码| 五月天婷婷成人网| 亚欧操逼片在线观看 | 日本高清_区二区三区| 91视频成人福利网站在线一区| 大香蕉狠狠爱| 久久美女福利是上海美女| 品亲网欧美品亲网| 精品国模无码| 青青11操操操操操操操操| 99999国产| 亚洲欧美日韩夜夜| 日韩人妻丝袜美腿中文| 日韩在线一区高清在线| 日日夜夜骚| 中文字幕欧美日韩三级| julia高潮后不停追击中出| 91痴汉| 91精品无码人妻系列| 国产第二页| 国产成人欧美一区二区三区的国产| 欧美成不卡网| 国产精品精品系列在线观看| 日本三级久| 欧美色涩| 欧美黑人性猛交91| 99999精品| 电影69乱码96| 91香蕉国产尤物视频| 九九九九九九九精品视频| 午夜传煤十二区精品| 99热在线观看| 熟妇人妻丰满久久久久久久无码| 日本熟女中文| 91狠狠综合久久| 婷婷午夜| 91精品人妻| 91人妻超碰| 亚洲日韩av专区无码| 欧美日韩222| 国产一区二区成人av在线播放| 宅男91视频在线播放| 午夜国产综合视频在线观看| 久久婷婷在线观看视频| 久久久久久亚洲Av无码| 男人网站婷婷| 8050无码八戒| 久操电影网| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 人人乐大香蕉| 精品欧美不卡在线播放| 久久久久久久久久久久黄色 | 亚洲a色| 国产亚洲 中文欧美久久| 91操操操操| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 久久久9 9 9精品| 久操电影网| 久久久蜜桃一区二区三区| 国产免费一区2区3区| 97天天综合网| 激情小说成人日本无码一| 亚洲欧美天| 蜜桃色色网站视频三区| 少妇厨房愉情理伦片bd在线观看| 九区国产| 国产成人网站在线观看| 亚洲图片欧美色| 伊人一区二区三区| 国产一区二区在线电影| 91美女小视频| A啊啊在线观看| 国产CHASE男男GAYGA 毛多色婷婷| 精品夜夜澡人妻无码AV| 91暧暧| 免费在线黄片视频| 亚洲狠| 狠狠图片青青草| 无码抄逼网| 女人精品内射国产99| 国产亚洲日本| 日产狠狠干| 日韩欧美午夜一区二区| 日韩BBN| 天天综合网91入口| 日韩乱插| 亚洲精品一二牛牛| 人人九九精| 顶级少妇BT天堂| 久久久久久久久成人av解说| 亚洲情色视频| 欧美综合 站| 欧美日不卡| 51一区二区三区| 亚洲开心网| 超碰97首页| 99国产精品人妻人伦| 大香网站| 国产高清亚洲日韩一区| 久久是精品| 亚洲狼狼干综合1| 婷婷久久五月| 91精品久久久久五月天精品| 4虎在线观看| 亚洲天天影视色综合| 男人的天堂2018东京热啪啪啪| 久久精品国产亚洲AV嘿嘿| 国产精品操| 亚洲AV不卡在线观看| 欧美狠狠操| 亚州国产精品乱| 温婉少妇玩3p| 高清国产无码av| 男人天堂2030| 亚洲精品久久一区二区三区蜜桃臀| 日韩无码嘿咻黑热久| 新版天堂中文资源8在线| 大香蕉乱级| 美女网站91| 久久久久幕乱码| 60秒免费小视频| 久久国产精品91| 久久久婷婷婷| 日本五十路熟女一区二区| 91一区二区三区蜜桃| 99av| 96一区二区三区| 最新9久久久9免费视频| 一区 欧美 日韩 麻豆| 日本有码久久| 五月丁香婷婷色| 欧洲一级性爱视频在线观看| 八戒午夜福利理论片| 啊啊啊啊啊啊在线观看| 另类小说欧美激情校园春色| 伊人久久亚洲色欲综合网站| 1二区9| 开心六月色| 97精品一二区| 丰满人妻一区二区三区免费,| 亚洲中文字母在线播放| 亚一综合久久久久久久久久| 日婷婷| 麻豆国产精品午夜视频| 校园春色亚洲| 香蕉视频精品亚洲一区二区三区在线播| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 亚州久久9| 亚州色站 日韩电影| 四虎永久在线精品免费网址| 日韩三级一区 | 97摸视频| 东亚亚洲无码高清| 另类 日韩 熟女| 日韩 欧美 另类 人妻| av绯色| 亚洲国产奇米影视久久| 日本成人A片免费看| 在线观看无码三级少妇| 都市久久精品激情亚洲| 国产兽交视频在线播放| AV麻豆免费一区| 91大神精品长腿在线观看网站| 欧美一级在线观看成人| 国产精品视频内谢女人| 在线αⅴ| 欧美不卡在线一区二区| 一级人妻性爱视频| 久久精品国产亚洲妲己影视| 精品国产乱码| 国产乱伦亚洲| 欧美性爱1080p| 天天干夜夜一操| 激情久久av一区av二区av| 日韩av乱伦| 五月开心网| 欧美在线官网| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 亚洲男人综合| 中文字幕一区二区免费在线| 26uuu性| 亚洲一本大道中文字幕无码在线| WWW黄片COM| 欧美成人都市人妻| 18一区二区三区| 97国产亚洲中文在线| 美女黄码视频午夜| 精品超碰色| 97精品免费视频网站| 69XX一中文字幕人妻91| 噜噜噜在线视频| 国产高清成人传媒影视| 日本在线一二| 99re69综合| 青青操视频在线| 超碰久超碰久| 被窝影院午夜看片无码| 免费在线黄片视频| 九九在线精品| 殴美日韩m| 午夜精品久久久久久久99| 亚洲男人天堂网站| 亚洲成人黄色在线观看| 操B在线观看| 伊人久久88国产女| 91网18| 新91视频.cmp| 亚洲麻豆av一区二区| 999亚洲国产视频| 任你草| 中文字幕版| 亚洲91射| J?P?NESEHD熟女熟妇伦| 青青草玖玖爱| 久久精品区| 日本欧美一区二区三区视频麻豆| 色青青久久影视| 精品国产污一区二区三区| 伊人精品国产| 久久久中文| 九月丁香综合网| 九色 人妻 大香蕉| 是还免费视频1727我| 久久久久久久9| 岛国毛片手机在线观看| 男人夜色天堂ss| 亚洲性少妇| 中文字幕后石码四区五区| 亚洲欧洲精品视频发布| 麻豆亚洲Av成人无码一区精品| 91 综合 色| 在线观看中文字幕| 午夜福利视频在线一区| 色综合中文字幕不卡| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 爱爱动态试试看6 0秒| 一区二区三区蜜桃成人撸久久东京热| 99热aaa| 国产路线专区| 人妻人人做人人澡人人爽欧美一区| 懂色综合久久久| 精品二区三四区五电影 | 国产久久av| 内射中出日韩在线观看视频| 自拍啪啪视频| 天天操夜夜操狠很操| 日韩人妻操B| 99热在线只有精品| 2018天天干在线视频| 18一区二区三区| 久久久偷拍| wwwcaobibi| 亚州高清色综合| 另类图片欧美激情综合| 亚洲第一综合| 91欧洲入口| 思思热在线cao| 亚洲日韩青青草色月| 欧美亚洲91| 丁香六月啪啪| 久久久久久中文| 岛国AB视频| 欧美后入视频| 被窝影院午夜看片无码| 日本91白丝| 99久草| 黄色av一区二区在线| 日日骚精品视频| 中文字幕精品免费一区二区| 中文字幕啊啊啊在线观看视频| 久久有码视频| 亚洲AV无码国产成人| 性欧美精| 天天综合网日韩7799| 四季AV一区二区凹凸精品小说| 亚洲一区二区三区在线激情| 国产精品一区人妻精品阁在线| 国产成人精品网站| 亚洲午夜AV| 亚洲欧美国产精品久久久久久久| 亚洲精品亚洲人成在线麻豆| 日韩精品9区|