99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

Shell腳本實戰(zhàn):從踩坑到高效自動化運維

Shell腳本實戰(zhàn):從踩坑到高效自動化運維 從事Linux運維和開發(fā)這些年shell腳本是我每天都會碰的東西。做日志切割、批量改文件、寫定時任務(wù)、數(shù)據(jù)同步、環(huán)境初始化一件件看起來雞毛蒜皮的小事最后都是靠腳本把人力省下來的。這是我自己筆記的第十六篇前面寫過系統(tǒng)啟動、權(quán)限、磁盤、網(wǎng)絡(luò)這些基礎(chǔ)內(nèi)容這篇專門聊聊shell腳本把我這些年踩過的坑和覺得有價值的寫法一次性梳理出來希望能幫正在學(xué)腳本的讀者少走幾步彎路。這篇內(nèi)容不打算從什么是變量這種教科書概念開始而是直接以實戰(zhàn)視角切入什么時候該寫腳本、腳本骨架怎么搭、核心語法怎么用才不出錯、完整案例怎么落地、出了問題怎么排查。適合已經(jīng)會敲基本命令、想把零散命令變成可復(fù)用工具的讀者如果你是完全零基礎(chǔ)可以先拿著基本命令練幾遍再來看這篇效果會更好。1. 什么時候真正需要動手寫腳本1.1 腳本最擅長解決的幾類問題先說實話不是所有事情都值得寫成腳本。我自己判斷的標(biāo)準很簡單這件事是不是要重復(fù)做兩次以上是不是需要多個命令配合才能完成如果答案都是肯定的那基本就該寫了。最常見的場景我列一下批量操作類幾十臺機器上收集信息、幾百個文件統(tǒng)一改名、批量壓縮解壓。手工敲一條條命令又累又容易漏腳本跑一遍還能留下輸出日志。定時任務(wù)類日志清理、數(shù)據(jù)備份、臨時文件歸檔、健康檢查告警。cron加腳本是絕配腳本負責(zé)邏輯cron負責(zé)定時觸發(fā)。部署與初始化類新機器裝環(huán)境、初始化配置、重啟服務(wù)。這類操作步驟多且有固定順序?qū)懗赡_本后可以反復(fù)執(zhí)行也方便在出問題時快速重來。格式轉(zhuǎn)換與數(shù)據(jù)處理把CSV轉(zhuǎn)成另一種格式、從日志里面提取關(guān)鍵字段、批量替換文件內(nèi)容。配合awk、sed、grep這些工具一個瘦腳本就能解決很多所謂大數(shù)據(jù)需求的土辦法方案。我遇到最多的是日志相關(guān)。比如業(yè)務(wù)系統(tǒng)每天產(chǎn)生的日志文件按照日期命名超過30天的需要刪除磁盤空間到80%需要告警。這種需求用手工做根本不現(xiàn)實定時跑一個腳本才是正解。后面我會把這個完整腳本展開講。即使是臨時性任務(wù)只要我開始覺得這串命令要重復(fù)手敲兩遍也會順手寫成腳本。寫的時候可能只花三分鐘但后面再遇到類似需求把腳本翻出來改兩行就能用。腳本庫就是這么一點一點攢出來的。1.2 別把腳本當(dāng)萬能鑰匙shell腳本也不是沒有短板。遇到下面這幾類情況我建議換個工具而不是硬撐。一是性能敏感的大數(shù)據(jù)處理。比如幾GB的日志要算統(tǒng)計指標(biāo)shell里一層層循環(huán)會慢到讓人懷疑人生這時候用Python、Go甚至直接上SQL都更合適。shell適合做膠水層面的組織和協(xié)調(diào)不適合做重計算。二是邏輯特別復(fù)雜的流程。判斷分支多了、狀態(tài)多了、需要復(fù)雜數(shù)據(jù)結(jié)構(gòu)的場景shell寫起來會很痛苦調(diào)試也費勁。腳本里出現(xiàn)幾十行嵌套if基本就是該重構(gòu)或者換更合適語言重寫的信號。三是跨平臺要求高的場景。雖然bash在各種Linux發(fā)行版上都通用但有些命令在不同發(fā)行版上行為略有差別macOS自帶的是舊版bashWindows上更是另一套。如果腳本要在完全不同的環(huán)境里跑要么用Python這類跨平臺解釋器要么在腳本里做足兼容判斷。我的經(jīng)驗是能用標(biāo)準命令組合解決的就用腳本感覺腳本寫起來已經(jīng)很別扭了果斷換語言。工具選對了后面維護的成本才會低。1.3 動手前先想清楚三個問題寫一個腳本之前先花兩分鐘想三件事輸入是什么、輸出是什么、中間有哪些約束。輸入可能是配置文件、命令行參數(shù)或環(huán)境變量輸出可能是處理后的文件、日志記錄或一個退出碼約束包括運行權(quán)限、運行時間窗口、磁盤空間上限等。想清楚這三件事腳本的結(jié)構(gòu)基本就出來了。然后遵循一個原則一個腳本只干一件事。把功能拆成函數(shù)每個函數(shù)只做它負責(zé)的那部分。這樣做的好處是定位問題快、復(fù)用方便也方便以后把腳本拆成更細的模塊。我早期寫腳本總是一個腳本解決所有問題結(jié)果腳本越來越長改一個邏輯就動到全局線上出了故障排查得像考古。吃過虧以后才養(yǎng)成先拆功能、再動手寫的習(xí)慣。2. 腳本骨架搭建與變量引用的關(guān)鍵細節(jié)2.1 shebang、執(zhí)行權(quán)限和首行配置一個普通文本文件要讓系統(tǒng)當(dāng)成腳本執(zhí)行需要兩個條件第一行以#!開頭指定解釋器并且文件要有執(zhí)行權(quán)限。第一行寫#!/bin/bash還是#!/usr/bin/env bash兩者都能用但意義不同。直接寫#!/bin/bash是明確指定解釋器路徑性能稍好兼容性也更容易預(yù)料。寫#!/usr/bin/env bash是先找到bash所在路徑再執(zhí)行在bash不在標(biāo)準位置的系統(tǒng)上更靈活但env本身如果找不到也會帶來問題。我自己在服務(wù)器上習(xí)慣直接寫#!/bin/bash因為標(biāo)準發(fā)行版上bash基本都在這個位置少一層解析也更穩(wěn)。執(zhí)行權(quán)限用chmod x script.sh加上。這一步很多人忽略導(dǎo)致明明腳本沒問題卻提示Permission denied。另外如果在當(dāng)前目錄運行腳本要寫成./script.sh而不是script.sh因為當(dāng)前目錄通常不在PATH環(huán)境變量里。這個踩坑率極高尤其是剛從Windows轉(zhuǎn)到Linux環(huán)境的讀者。首行配置我還建議加兩樣?xùn)|西一是文件頭的注釋寫明腳本用途、創(chuàng)建時間和維護人二是set選項。雖然set選項后面詳細講但我現(xiàn)在寫任何腳本開頭幾乎固定是#!/bin/bash # 功能xxxx # 創(chuàng)建2024-xx-xx set -euo pipefailset -euo pipefail這一行帶來的變化我后面詳細說先記住它能讓腳本在出錯時立刻暴露問題而不是帶病往下跑。2.2 變量取值與引號使用的門道變量賦值在shell里看似簡單坑全藏在細節(jié)中。賦值語句等號兩邊不能有空格寫成name 張三會變成執(zhí)行命令name直接報command not found。這個錯誤我見新人踩過無數(shù)次。取變量值用$name但更嚴謹?shù)膶懛ㄊ?{name}。兩者差別在變量名后面緊跟其他字符時體現(xiàn)出來echo $name_file會把name_file當(dāng)成一個變量名而echo ${name}_file才是取name變量的值再加下劃線和file。凡是變量名邊界不清晰的場景一律用${}包裹這是一個讓腳本更清晰、更安全的好習(xí)慣。引號的使用是shell腳本最容易出問題的點。什么時候用雙引號什么時候不用規(guī)則其實很明確如果變量的值可能包含空格、通配符或其他特殊字符并且你希望它作為一個整體被處理就必須加雙引號。比如file_path/data/logs/app 2024.log if [ -f $file_path ]; then echo 文件存在 fi如果這里不加雙引號[ -f $file_path ]會被展開成[ -f /data/logs/app 2024.log ]test命令會因為參數(shù)個數(shù)不對直接報語法錯誤。雙引號的作用就是給整個值包一層不讓shell把里面的空格當(dāng)成分隔符。還有一種情況是變量的值來源不可控比如讀取外部文件內(nèi)容、命令輸出的結(jié)果這時候雙引號尤其重要。不加雙引號的話文件里如果有分號、感嘆號、星號之類的內(nèi)容shell會做各種展開輕則結(jié)果不對重則執(zhí)行了本不該執(zhí)行的命令。我在這上面栽過跟頭一個讀取文件內(nèi)容后再拼成命令發(fā)送的腳本文件里恰巧有分號結(jié)果一行原本正常的命令被拆成了兩條。從那以后凡是非我手寫的字符串默認一律加雙引號處理。命令替換是另一個常用特性$(command)會執(zhí)行命令并把輸出作為值。比如拿今天日期today$(date %F)。這里我建議優(yōu)先用$()而不是反引號因為反引號在處理嵌套時容易出錯$()可以嵌套可讀性也更好。注意命令替換的結(jié)果如果有換行符賦值給變量后會保留echo出來可能看到多行這在處理命令輸出時要心里有數(shù)。2.3 位置參數(shù)與入?yún)z查腳本接收外部輸入最常見的是位置參數(shù)$1、$2這種。比如./backup.sh /data/mysql /backup腳本里$1就是/data/mysql$2就是/backup。$#表示參數(shù)個數(shù)$表示所有參數(shù)并且每個參數(shù)獨立$也表示所有參數(shù)但視為一個整體。遍歷參數(shù)時應(yīng)該用for arg in $而不是$這樣才能正確處理帶空格的參數(shù)值。腳本里的關(guān)鍵參數(shù)我習(xí)慣加一道檢查避免用戶忘了傳參導(dǎo)致腳本在后面某個莫名其妙的位置報錯。典型寫法if [ $# -lt 2 ]; then echo 用法: $0 源目錄 備份目錄 exit 1 fi這樣做的好處是錯誤信息明確而不是腳本跑了一大半才因為找不到文件而失敗。exit 1返回非零退出碼調(diào)用方可以據(jù)此判斷腳本執(zhí)行失敗。有時候參數(shù)是可選的需要默認值。shell的參數(shù)展開語法能直接處理${var:-默認值}表示var沒設(shè)置或為空時使用默認值。比如日志保留天數(shù)支持通過參數(shù)指定不指定就默認30天keep_days${1:-30}。這樣腳本既靈活又穩(wěn)妥。類似地${var:默認值}不但取默認值還給變量賦值${var:?提示信息}在變量為空時直接退出并輸出提示適合強制要求參數(shù)的場景。3. 條件判斷與循環(huán)的實戰(zhàn)細節(jié)3.1 條件測試寫法單中括號和雙中括號怎么選shell里做判斷本質(zhì)上是運行一個test命令并根據(jù)它的退出碼決定分支。if [ ... ]中的方括號其實是test命令的另一種寫法所以方括號兩邊必須有空格[ $a $b ]寫成[ $a$b ]就會出錯因為shell把整個字符串當(dāng)成了一個參數(shù)。現(xiàn)代bash里更推薦用雙中括號[[ ... ]]。它是bash內(nèi)置的關(guān)鍵詞支持更豐富的表達式比如和都可以用支持正則匹配也支持和||這種邏輯運算符。最關(guān)鍵的是在[[ ]]內(nèi)部變量即使不加雙引號也不會被錯誤分詞對新手友好得多。我的建議是既然用的是bash直接統(tǒng)一用[[ ]]不要再拿單中括號去踩那些邊邊角角的坑。文件判斷操作符要記牢-f判斷是不是普通文件-d判斷是不是目錄-e判斷路徑是否存在-r、-w、-x判斷讀、寫、執(zhí)行權(quán)限-z和-n判斷字符串為空或非空。-nt和-ot可以比較文件的修改時間新舊在增量備份場景里很好用。數(shù)值比較用-eq、-ne、-gt、-lt而不是和因為在shell里是重定向符號寫錯會引發(fā)文件重定向非常隱蔽。邏輯判斷的寫法在[[ ]]里直接用和||if [[ -f $file -r $file ]]; then。在單中括號里要用-a和-o再加上各種轉(zhuǎn)義可讀性和安全性都差。所以堅持用[[ ]]能讓代碼干凈很多。3.2 for、while、until在什么場景下各司其職for循環(huán)適合遍歷已知列表遍歷一組文件、一組主機名、一組參數(shù)。最典型的是遍歷當(dāng)前目錄下的所有txt文件for f in *.txt; do echo 處理文件: $f done注意*.txt在這里會先被shell展開成文件列表如果目錄里沒有匹配的文件展開結(jié)果會是字面的*.txt循環(huán)還是會執(zhí)行一次所以最好先判斷文件是否存在再進循環(huán)。遍歷時如果文件名有空格for f in *.txt這種寫法會出問題因為空格會被當(dāng)成列表分隔。處理方法是用find配合while readfind . -name *.txt -print0 | while IFS read -r -d f; do echo 處理文件: $f done-print0把文件名以null分隔-d 讓read也按null分隔讀取。這個寫法看著繁瑣但它在處理帶空格、帶換行的文件名時百分之百可靠是處理任意文件名最穩(wěn)妥的方式。while循環(huán)適合條件驅(qū)動的場景讀文件直到文件結(jié)束、等待某個條件成立、消費某個隊列。最常見的while讀文件寫法while IFS read -r line; do echo $line done input.txtIFS防止行首行尾的空白被trim掉-r防止反斜杠被解釋 input.txt把文件作為循環(huán)的輸入。這種寫法比for i in $(cat input.txt)安全得多因為for配合$(cat)會把文件按空格、按換行全部分裂一遍文件內(nèi)容稍微有點特殊字符就亂套了。until循環(huán)和while結(jié)構(gòu)一樣只是條件為假時執(zhí)行。實際用得少但偶爾用來等待某個服務(wù)就緒還挺順手until nc -z 127.0.0.1 3306; do sleep 1; done一直等到數(shù)據(jù)庫端口能連通。循環(huán)里break可以提前跳出continue進入下一輪是兩個常用的控制指令不要忘記。3.3 管道、子shell與循環(huán)變量丟失問題這個問題我必須單獨提因為它坑過的絕對不止我一個人在管道后面接while循環(huán)循環(huán)內(nèi)對變量的修改在循環(huán)結(jié)束后會丟失??催@個經(jīng)典例子count0 echo -e a\nb\nc | while read line; do count$((count 1)) done echo $count輸出是0而不是3。原因在于管道會讓while循環(huán)跑在一個子shell進程里子shell里的變量修改不會傳回父shell。我第一次遇到時百思不得其解查來查去才發(fā)現(xiàn)是shell的設(shè)計使然。解決思路有三種。第一種把輸入重定向而不是用管道while read line; do count$((count 1)) done (echo -e a\nb\nc)進程替換(command)產(chǎn)生的輸入通過重定向進入循環(huán)循環(huán)本身還在當(dāng)前shell里運行變量修改就能保留。第二種是把結(jié)果寫到文件再讀出來。第三種是把處理邏輯封裝成函數(shù)后用輸出捕獲結(jié)果但本質(zhì)上還是在子shell里靠的是函數(shù)輸出而非變量傳遞。這類子shell邊界問題在管道、find -exec、括號子shell里都會出現(xiàn)。遇到變量值詭異消失的現(xiàn)象第一反應(yīng)就是檢查是不是跨越了子shell邊界。排查方法也很簡單在關(guān)鍵位置加echo輸出中間值看看循環(huán)內(nèi)和循環(huán)外的值是否一致不一致基本就是邊界問題。4. 函數(shù)設(shè)計、退出碼與腳本健壯性4.1 用函數(shù)拆骨架local變量防污染腳本一長組織方式就成了大問題。我現(xiàn)在的習(xí)慣是腳本主體只保留流程調(diào)度真正的邏輯全部放進函數(shù)。函數(shù)定義用function name() {}或者直接name() {}都可以我傾向不帶function關(guān)鍵字和POSIX兼容性更好。函數(shù)里要特別注意變量的作用域。默認情況下函數(shù)里賦值的變量是全局的會污染腳本其他部分。所以凡是函數(shù)內(nèi)部的臨時變量一律用local聲明local tmp_file/tmp/xxx。這能避免函數(shù)間因為同一個變量名互相影響排查問題時也清楚每個變量的歸屬。這個習(xí)慣和寫代碼時不讓函數(shù)偷偷改全局狀態(tài)是同一個道理。函數(shù)內(nèi)用return返回一個整數(shù)狀態(tài)碼0表示成功非0表示失敗。return和exit容易混return只是退出當(dāng)前函數(shù)腳本還能繼續(xù)exit是直接終止整個腳本。在某個函數(shù)里判斷要不要讓整個腳本停下來就要分清楚用return還是exit。我一般是函數(shù)內(nèi)部出錯且后續(xù)步驟依賴該函數(shù)的結(jié)果就在函數(shù)里exit 1讓腳本立刻失敗只是單一環(huán)節(jié)出錯、不影響整體就return非零值讓調(diào)用方自行處理。函數(shù)設(shè)計上還有一個經(jīng)驗一個函數(shù)只做一件事函數(shù)名誠實描述行為。read_config作為一個函數(shù)就只負責(zé)讀取配置并校驗不把別的邏輯塞進來。這樣腳本讀起來像是一篇有目錄的文章而不是一團糾纏的線。4.2 退出碼與set -euo pipefail的核心策略每個命令執(zhí)行完都會留下一個退出碼0是成功1到255是各種失敗原因。在條件判斷和循環(huán)里shell就是靠退出碼來決定走向。$?保存著上一個命令的退出碼但它有個致命特點任何命令執(zhí)行都會覆蓋$?。你想檢查某個命令的結(jié)果必須立刻取值中間不能穿插任何其他命令。下面這個寫法就是典型的錯grep error app.log echo grep退出碼記錄到變量: $? if [ $? -eq 0 ]; then第一次$?還是grep的退出碼第二次$?已經(jīng)是echo命令的了想判斷grep結(jié)果時早就不對了。正確做法是第一時間把退出碼存下來grep error app.log ret$? if [ $ret -eq 0 ]; thenset選項能大幅改變腳本的容錯行為。set -e表示任何一條命令返回非零就立刻退出腳本避免錯誤被掩蓋、腳本帶著錯誤狀態(tài)繼續(xù)跑出更多問題。初學(xué)者經(jīng)常覺得set -e太敏感但正是這種敏感讓問題盡早暴露。set -u表示使用未定義變量時直接報錯退出能順手抓出很多變量名拼寫錯誤。set -o pipefail讓管道中任何一個環(huán)節(jié)失敗都被識別為管道失敗否則bash只關(guān)心管道最后一個命令的狀態(tài)前面環(huán)節(jié)悄悄掛了你都不知道。三個選項拼在一起set -euo pipefail就是我現(xiàn)在所有腳本開頭的標(biāo)配。它們改變了腳本遇到錯誤時的默認反應(yīng)從默默繼續(xù)變成大聲失敗。這個轉(zhuǎn)變對線上任務(wù)的意義非常大我自己是踩過腳本其實早就出錯但還在跑的虧之后才真正體會到這行配置的價值。也要說明set -e在某些場景下需要臨時關(guān)閉。比如你明確知道某條命令可能失敗且失敗是可以接受的可以用if cmd; then的寫法把它放在條件里這樣set -e不會干涉。或者用cmd || true主動吞掉失敗狀態(tài)。但|| true相當(dāng)于告訴讀者這行失敗無所謂所以要謹慎使用別讓該報的錯都被蒙混過關(guān)。4.3 trap清理與臨時文件安全管理腳本跑著跑著被中斷了留下的臨時文件、鎖文件怎么辦trap命令就是為這種場景準備的。trap code EXIT可以讓腳本在任何方式退出時都會執(zhí)行那段清理代碼無論是正常結(jié)束、被中斷還是報錯退出。我寫腳本時凡是創(chuàng)建了臨時目錄必配一句tmp_dir$(mktemp -d) trap rm -rf $tmp_dir EXITmktemp -d會在/tmp下生成一個隨機命名的目錄避免用固定路徑導(dǎo)致多個實例互相覆蓋也防止了路徑被其他用戶提前猜到帶來隱患。trap清理保證腳本就算中途掛了垃圾也能被帶走。單獨看rm -rf $tmp_dir這個命令還有一個細節(jié)變量要用雙引號包住否則目錄名里有空格時會拆成多個參數(shù)甚至可能誤刪不該刪的東西。關(guān)于rm -rf的風(fēng)險后面安全部分還會展開。trap還可以監(jiān)聽信號trap echo 收到中斷信號開始收尾; exit 1 INT TERM讓腳本在被CtrlC時先做清理再退出。這種無論如何退出都先清理的思維是腳本健壯性的一個核心習(xí)慣建議把它內(nèi)置到自己的腳本模板里。5. 實戰(zhàn)拆解一個日志自動清理腳本5.1 需求描述與功能拆分前面講了這么多理論現(xiàn)在用一個我真實場景里非常常見的例子把整個流程串起來。假設(shè)有一個業(yè)務(wù)日志目錄/data/app/logs里面每天生成一個以日期命名的.log文件還可能有子目錄。需求有三點刪除30天前的日志文件釋放磁盤空間刪除前記錄一份清理清單方便以后查賬如果目錄所在磁盤使用率超過80%輸出告警信息并留下一條醒目的記錄。這種需求如果直接寫三坨命令也能完成大部分功能但可讀性、安全性都差。按前面說的思路我先拆功能校驗?zāi)夸洝?zhí)行清理、記錄日志、檢查磁盤水位。每個功能一個函數(shù)主流程簡單清晰。5.2 完整腳本逐段解析先看完整代碼再逐段解釋關(guān)鍵處。這個腳本偏向通用教學(xué)你可以直接拿來改成本地路徑使用。#!/bin/bash # 功能日志目錄過期清理與磁盤水位檢查 # 用法./clean_logs.sh [保留天數(shù)] [目標(biāo)目錄] set -euo pipefail LOG_DIR/data/app/logs KEEP_DAYS${1:-30} LIMIT80 CLEAN_LOG/var/log/clean_logs_history.log log_msg() { echo $(date %F %T) $* $CLEAN_LOG } check_dir() { if [ ! -d $LOG_DIR ]; then log_msg 目錄不存在: $LOG_DIR exit 1 fi } disk_usage() { local used used$(df $LOG_DIR | awk NR2 {print $5} | tr -d %) if [ $used -ge $LIMIT ]; then log_msg 磁盤使用率超限: ${used}% ${LIMIT}% echo 警告: 磁盤使用率已達 ${used}% fi } do_clean() { local file while IFS read -r file; do [ -f $file ] || continue log_msg 刪除過期日志: $file rm -f $file done (find $LOG_DIR -type f -name *.log -mtime $KEEP_DAYS -print0) } main() { check_dir do_clean disk_usage log_msg 清理任務(wù)完成保留天數(shù)${KEEP_DAYS} } main逐段來說。set -euo pipefail就是前面說的標(biāo)配。其中-u在這里尤其重要因為腳本引用了KEEP_DAYS、LOG_DIR這類變量如果變量名寫錯或者賦值沒成功-u會立刻讓腳本報錯而不是用空值一路帶偏后面的邏輯。LOG_DIR和KEEP_DAYS是配置區(qū)。我把可變的配置集中在腳本頂部以后要改路徑或天數(shù)只動這幾行就行。KEEP_DAYS${1:-30}表示支持命令行參數(shù)指定天數(shù)不指定就默認30天。這種配置集中加參數(shù)覆蓋的模式很實用。log_msg函數(shù)把所有運行痕跡追加到CLEAN_LOG。日志統(tǒng)一記錄是運維腳本的底線出事后能回溯也是留痕思維的體現(xiàn)。函數(shù)里的$*會把所有參數(shù)合并成一行配合前面的日期時間戳記錄的信息就很完整了。check_dir先驗證目錄存在。在腳本一開頭就校驗前置條件是避免任務(wù)做到一半才發(fā)現(xiàn)環(huán)境不滿足的經(jīng)典做法。disk_usage用df拿使用率再用awk取第二行的百分比字段用tr去掉百分號最后和LIMIT比較。這里一個細節(jié)是df的輸出第一行是標(biāo)題NR2才是目標(biāo)文件系統(tǒng)的數(shù)據(jù)行。do_clean是整個腳本的核心。find $LOG_DIR -type f -name *.log -mtime $KEEP_DAYS查找指定目錄下距離修改時間超過保留天數(shù)的.log文件。-mtime 30的意思是文件修改時間在30天之前。選項-print0讓find以null字符分隔輸出的文件名這是為了應(yīng)對文件名里有空格或換行的極端情況。然后通過進程替換(...)把find的結(jié)果作為while循環(huán)的輸入這樣while循環(huán)跑在當(dāng)前shell里不會遇到前面說的子shell變量丟失問題。循環(huán)體里先判斷[ -f $file ]再刪除主要是防止find結(jié)果因路徑變化已經(jīng)失效避免把不存在路徑當(dāng)普通參數(shù)處理。main函數(shù)把整個流程串起來腳本真正執(zhí)行的地方就一行main。這樣設(shè)計的好處是腳本的邏輯一目了然想單獨調(diào)試某個環(huán)節(jié)可以臨時注釋掉main里的某一項或者直接拿出某個函數(shù)單獨測試。5.3 接入crontab與運行驗證腳本寫好后用crontab -e編輯定時任務(wù)添加一行30 2 * * * /usr/local/bin/clean_logs.sh 30 /data/app/logs /dev/null 21這表示每天凌晨2點半執(zhí)行一次第一個30是保留天數(shù)。定時任務(wù)里有一個經(jīng)典坑cron執(zhí)行環(huán)境非常精簡PATH可能不包含腳本依賴的命令路徑所以腳本里的命令最好寫全路徑或者調(diào)用時顯式帶上環(huán)境。我一般習(xí)慣在腳本里固定export PATH/usr/local/bin:/usr/bin:/bin避免cron環(huán)境下找不到命令。先手動執(zhí)行一遍確認退出碼為0再檢查CLEAN_LOG里有沒有正常記錄。然后用find手動驗證一下過期文件確實被清理了。最后再掛cron不要寫完就直接掛上萬一有bug定時任務(wù)會在凌晨悄悄幫你放大問題。6. 調(diào)試技巧與高頻避坑速查6.1 調(diào)試三板斧bash -x、set -x、關(guān)鍵節(jié)點輸出shell腳本出了問題怎么排查我用得最多的方法是bash -x script.sh直接以調(diào)試模式運行。這個模式下每條命令執(zhí)行前都會把展開后的實際命令打印到標(biāo)準錯誤前面帶一個加號??吹郊犹柡竺娴膶嶋H命令就能立刻發(fā)現(xiàn)變量展開是不是符合預(yù)期、某條命令是不是被拆成了兩條。比如變量沒加引號導(dǎo)致參數(shù)分裂在-x模式下會非常直觀地看到命令參數(shù)被拆開。腳本內(nèi)部也可以用set -x開、set x關(guān)把調(diào)試范圍限制在某個區(qū)間echo 開始調(diào)試 set -x rm -f $file set x echo 調(diào)試結(jié)束這樣做可以避免整個腳本的輸出被調(diào)試信息淹沒。還有一種低技術(shù)含量但極有效的方法在關(guān)鍵節(jié)點加echo輸出。變量賦值后、分支進入前、循環(huán)每次迭代時各打一行帶標(biāo)記的輸出比如echo DEBUG: file$file, count$count。配合bash -x基本能定位九成的邏輯問題。再有就是trap echo line:$LINENO, ret$? ERR每行出錯時自動打印行號和退出碼。這個對定位到底哪條命令掛了特別有幫助。需要留意ERR觸發(fā)和set -e、命令返回非零等條件有依賴關(guān)系實際使用中配合bash -x效果更好。6.2 高頻錯誤對照速查我整理了平時答疑時遇到最多的問題做成一個速查表能省不少排查時間?,F(xiàn)象常見原因解決辦法執(zhí)行腳本提示Permission denied沒有執(zhí)行權(quán)限chmod x script.sh能執(zhí)行但報command not found文件名含特殊字符或CRLF換行用file查看格式dos2unix轉(zhuǎn)換變量值不對多出奇怪內(nèi)容未加雙引號被shell分詞或擴展變量引用一律加雙引號if判斷總是走false方括號左右缺空格[ $a $b ]每個地方留空格循環(huán)后變量值沒變子shell邊界問題改用重定向或進程替換整數(shù)比較報語法錯誤用了 而不是-gt -lt數(shù)值比較用-eq -ne -gt -ltrm在某些文件上報參數(shù)過多find結(jié)果過多導(dǎo)致參數(shù)上限超限改用find -delete或分批處理腳本某個環(huán)節(jié)靜默失敗沒開啟set -e和pipefail腳本開頭加set -euo pipefail這里面CRLF換行的問題值得單獨說一句。在Windows上編輯過的腳本上傳到Linux文件每行末尾會帶著\r第一行shebang會變成#!/bin/bash\r系統(tǒng)會報bad interpreter錯誤。用file script.sh看一下顯示with CRLF line terminators就知道是這個原因。解決用sed -i s/\r$// script.sh或者dos2unix命令。養(yǎng)成在Linux環(huán)境里編輯腳本、或者給編輯器設(shè)置好換行符的習(xí)慣能從根上避開這個問題。6.3 隱蔽風(fēng)險rm -rf、通配符展開、eval與臨時文件shell腳本因為可以直接執(zhí)行任意系統(tǒng)命令安全上的坑比其他語言更需要警惕。首當(dāng)其沖的是rm -rf這類危險命令。如果變量沒設(shè)置好rm -rf $dir/里的dir是空字符串就會變成rm -rf /后果不堪設(shè)想。我的習(xí)慣是凡是涉及rm -rf先用[ -n $dir ]校驗變量非空再用set -u兜底并且在執(zhí)行前echo出完整命令供人工檢查。雖然這次寫的清理腳本用的是rm -f不帶-r但任何刪除操作都值得同樣的謹慎。另一個隱蔽風(fēng)險是變量里的通配符展開。如果文件名里帶有*號不加引號的使用會把星號按通配符展開可能展開成一堆文件路徑。這個問題在讀取外部數(shù)據(jù)來源時尤其值得注意外部數(shù)據(jù)不可信你的引號就是防線。凡是對變量內(nèi)容不確定默認加雙引號這一條能擋住一大片問題。eval命令要盡量少用。eval會先把字符串拼接成命令再執(zhí)行等于允許外部輸入直接變成命令注入風(fēng)險極高。在我處理的場景中絕大多數(shù)eval需求都可以通過關(guān)聯(lián)數(shù)組、case分支或函數(shù)映射解決沒有必要用eval。如果你確實繞不開至少確保eval的參數(shù)完全由腳本內(nèi)部受控內(nèi)容構(gòu)成絕不讓外部輸入直接進eval。臨時文件的安全也要注意。腳本里別用固定的/tmp/my_temp_file這種路徑多個實例同時跑會互相覆蓋別人也可能猜到路徑做手腳。統(tǒng)一用mktemp或mktemp -d生成隨機路徑用完配合trap清理。關(guān)于腳本安全我的總原則是輸入嚴格校驗、輸出路徑明確、權(quán)限最小化、危險操作前置檢查。這些習(xí)慣不復(fù)雜但能在關(guān)鍵時候把損失控制住。7. 腳本長期維護的幾點習(xí)慣7.1 命名、注釋與版本管理腳本命名要一看就知道用途clean_logs.sh、backup_mysql.sh、check_disk.sh都比test1.sh、new2.sh強一百倍。命名里建議包含動詞表達做什么而不是是什么。腳本存放到統(tǒng)一目錄比如~/bin或/usr/local/bin按功能分目錄更清晰比如scripts/clean、scripts/backup、scripts/monitor。注釋不需要泛濫但文件頭的用途說明、每個函數(shù)的輸入輸出說明、以及關(guān)鍵代碼行中為什么不這樣寫的說明值得認真寫。我最重視的是為什么的注釋一行代碼解釋不了為什么需要這段邏輯而這里不直接用rm是因為...這種注釋能幫半年后的自己快速回憶當(dāng)初的決策。版本管理方面哪怕只是個人腳本也建議納入git。腳本會不斷演進能回溯每一次改動、看到什么時候改了什么排查線上問題時價值巨大。如果嫌每次提交麻煩可以只在腳本改動達到一定規(guī)模時提交但至少要保留一份修訂記錄比如在文件頭加一行修改歷史2024-01-01 增加磁盤水位檢查。我在自己的環(huán)境里是喜歡都用git管理的腳本庫一個倉庫分支按環(huán)境區(qū)分發(fā)布用標(biāo)簽。長期下來腳本庫從一坨快看不懂的文件變成了有歷史有說明的工具集維護成本明顯下降。7.2 冪等設(shè)計與鎖文件好的腳本應(yīng)該可以重復(fù)運行而不產(chǎn)生壞結(jié)果這叫做冪等性。舉例說初始化目錄的腳本mkdir -p /data/app/logs無論執(zhí)行多少次都不報錯但如果是清空目錄的腳本不加判斷跑兩遍可能就刪掉了不該刪的東西。設(shè)計腳本時問自己一個問題同一個腳本跑兩遍、跑十遍結(jié)果應(yīng)該一樣嗎如果答案應(yīng)該是一樣那就要確保關(guān)鍵步驟是冪等的。常見做法包括創(chuàng)建目錄用mkdir -p而不是先判斷再加mkdir寫文件前先檢查是否已存在或先備份刪除操作前先確認目標(biāo)存在且符合預(yù)期涉及狀態(tài)變更的步驟用鎖文件避免重復(fù)執(zhí)行。鎖文件可以簡單用flock實現(xiàn)exec 9${script_dir}/.lock flock -n 9 || { echo 腳本已在運行; exit 1; }這樣能防止同一個腳本并發(fā)執(zhí)行互相干擾。定時任務(wù)和手動任務(wù)指向同一個腳本時這種做法尤其重要。7.3 寫給下一個自己最后聊點個人的體會。腳本這行功夫不是把語法背熟就完了真正值錢的是踩坑之后的判斷力知道什么場景該寫腳本、什么場景不該上知道哪幾行代碼在運行時最容易出問題知道出問題后第一步應(yīng)該看哪里。這些能力沒有捷徑就是多寫多踩多總結(jié)。我現(xiàn)在的習(xí)慣是每次踩到一個不常見的坑就在自己的筆記里記一筆包括現(xiàn)象、原因、解決過程。久而久之這本筆記就變成了自己的排障字典。這也正是我寫這第十六篇筆記的初衷很多經(jīng)驗不記下來三個月后我可能還是得靠重新踩坑才能想起來。如果你剛開始學(xué)shell腳本我的建議很樸素從改造自己昨天手工敲過的命令開始今天把它寫成腳本明天給腳本加參數(shù)和錯誤處理后天再試著用函數(shù)重構(gòu)一遍。不用特意去找復(fù)雜案例你日常的重復(fù)勞動就是最好的練習(xí)題。一次把一個小的需求做扎實腳本能力就是這么積累起來的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99热这| 午夜少妇在线观看视频| 91人人爽狠狠狠| 超碰男人色| 99 热国产在| 极品人妻VIDEOSSS人妻| 激情久久肏屄视频| 99热99色| www.伊人天堂偷偷婷婷| 欧美婷婷| 精品亚洲国产成AV人片传媒| 五月天操逼激情| 激情五月天偷拍综合网| 开心五月婷婷激情网| JlZZJlZZ8JlZZ亚洲熟女| 五月丁香激情深爱婷婷| 成人婷婷五月| 丁香婷婷激情五月色| 免费观看2018www黄色操逼网站| 亚洲99综合| 五月丁香六月婷婷综合伊人| 五月丁香怕啪啪| 91在线观看九区| 性色婷婷| 99久久这里只有精品| 99精品视频在线免费观看| 婷婷丁香综合色AV| 天天爱天天天射AV| 色婷婷丁香女女| 大香蕉综合网| 噜噜视频| 亚洲精品视频在线播放| 狠狠操天天干| 亚洲天天| 丁香五月天激情综合| 九九九九综合| 狠狠色婷婷| 五月婷婷六月综合| 九九免费精品| 国产偷人妻精品一区| 日韩欧美四五区| 五月婷婷三级| 99热 这里只有精品 国产 日韩| 五月丁香综合影院| 丁香九月激情久久| 秋霞日本免费毛片A片| 色五月美女| 97高清国语自产拍| 色婷婷综合久久| 99热在线观看| 色色色色色日韩午夜激情 | 狠狠夜夜五月丁香| 开心五月婷婷六月丁香| 丁香婷婷六月天| 噜噜噜狠狠色综合| 老司机午夜福利视频金瓶梅| 91操色| 91综合在线| 玖玖爱综合网| 六月五月丁香五月欧美| 天天干天天色天天干| 五月丁香婷成人网| 丁香五月婷婷成人网| 五月天性色| 色婷婷在线视频久| 这里只有精品网| www夜夜操wwwcon| 婷婷99视频全集高清| 久久人妻熟女一区二区| 国产精女同一区二区三区久| 伊人综合婷婷| 天天日日夜夜爽| 丁香五月久久| 久热a| WWW.桔色成人.COM| 97丁香五月| 色欲午夜无码久久久久久张津瑜 | 婷婷九月丁香天堂丁香天堂| 激情伊人| 婷婷娱乐丁香综合网| 欧美性爱5月天天天看| 色综色五月天婷婷| 五月综合激情| 欧美在线| 91色在线 | 日韩| 丁香婷婷色色| 日韩精品色| 激情五月婷婷五月| 嫩草AV久久伊人妇女超级A| 色综合综合综合| 超碰成人在线免费观看| 免费99情趣网视频| 婷婷五月综合啪| 五月天婷婷色色| 久操热| www.91av.com| 丁香五月91| 操笔无码| www.久久久久久久| 东北熟女视频99| 五月色丁香| 亚洲 综合中文| 久久五月天激情视频| 五月婷婷激情久久| 中文字幕视频色婷婷| 色婷婷情片| 天天搽天天射| PORNY九色9l自拍视频成人| 久草热8精品视频在线观看| 91狼友视频网页更新| 狠狠久久婷婷| 五月丁香婷婷伊人| 成人视频网| 色九综合| 婷婷五月天成人综合网| 日日做A爰片久久毛片A片英语| 99草在线免费观看视频| 狠狠色情婷婷| 久久久中文| 涩婷婷视频快播人妻| 另类天堂| 99热超碰在线| 91青娱乐青青草| 最新午夜理论片| 久机视频这只有精品| 九九黄色网| 男同色五月开心五月激情五月| 我爱大香蕉| 婷婷五月天色| 色婷婷成人久久| 9999热精品在线免费播放| 99热碰碰| 伊人婷婷色| av在线色五月丁香婷区久| 97av在线视频| 色五月天堂| 色色AV色色色东莞| 久久无意婷婷| 天天操婷婷| 国产XXXX搡XXXXX搡麻豆| 色播丁香| 激情五月激情综合网| 久久9热| 五月婷色激情五月| 国产精品成人网址| 婷婷五月天欧美| 狠狠爱成人综合网| 天天日天天干天天天| 日日影院 | 天天做天天爱天天爽在| 婷婷色在线视频| 婷婷精品免费久久| 色护士综合| 激情精品久久| 五月婷婷色| 久久草中文日韩欧美| 69色色视频| 亚洲黄色影视| xxxx五月激情| 婷婷激情综合网| 91九色熟女| 91成人性爱视频| 丁香六月婷婷色XXXX| 五月婷在线| 婷婷六月天天| 五月丁香久人妻中文| 亭亭玉月丁香| 大香蕉五月天婷婷丁香91| 色婷婷裸体色性在线| 中文字幕无码人妻少妇免费视频| 激情五月婷婷在线区| 九九aV| 99在线热| 操人无码| 99热精品10| 亚洲这里只有精品| 天干干夜夜操| 果冻传媒A片一二三区| 色999五月色| 国产AV一区二区三区最新精品| 激情五月图| 丁香激情网| 五月丁香美女视频| 国产又粗又大又爽又黄| 亚洲成人电影aaaa| 丁香婷婷六月| 色综合大香蕉| 色五月涩涩婷婷蜜桃| 五月激情综合网| 丁香五月精品视频| 无码激情AAAAA片-区区| 天天天天做夜夜夜夜做| 色色婷婷色色| 亚洲综合色色| 青青草六月丁香| 中文字幕免费高清电视剧| 亚洲久久婷婷丁香五月天| 国产肥白大熟妇BBBB视频| 色色色在线免费视频| 夜精品无码A片一区二区蜜桃| 婷婷深爱五月亚洲综合| 欧美69色| 综合网五月| 激情com| 亚洲国产精品VA在线看黑人| 狠狠色综合精品视频在线| 成人AV网站在线| 五月色婷婷影院| 97人人草| 操逼电影免费看| 色五月婷婷小说亚洲中文字幕组| 91九色精品熟女内射| 中文AV网| 色五月在线观看| 久久加勒比| 五月激情影视| www.色五月.com| 婷婷丁香五月色偷偷| 99热人人| 国产精品久久久久久五月天加勒比| 99资源人人| 婷婷五月综合社区| 性99网站| 久久网站免费亚洲| 丁香六月激情综合网| 色五月婷婷色| 久久五月激情| 色波激情五月天| 中文字幕视频色婷婷| 天天色天天操天天射| 色综合综合色| 婷婷干六月综合旧址| 九九aV| 26uuu91| 成人网页在线观看| 国产亚洲精品久久久久久久久动漫| 婷婷五月天激情文学| 国产精品久久..4399| 最近免费中文字幕大全高清大全1 免费看欧美成人A片无码 | 六月丁香婷婷综合在线| 色婷婷欧美在线| 亚洲国产黄色电影| 日本人妻伦在线中文字幕| 日本五月天网站| 婷婷六月丁香在线| 久操福利| 亚洲在线视频321| 99久久婷婷国产综合精品草原| 2025年最新亚洲在线欧美| 五月色婷| 91丨九色丨白浆秘| 丁香五月久久社区| 欧美 色婷婷| 久久久18| 激情综合激情综合| 色婷婷狠狠干芒果TV| 久这里只有精品99| 开心五月综合激情网| 日韩青青| 亚洲妇女熟BBW| 色五月超碰| 五月综合缴情网| 做爱夜夜干天天操| www99热| 91大神在线免费看视频全集男男一起操| 色中色综合| 丁香婷婷影院| 婷婷开心五月| 亚洲综合色五月| 翔田千里aV中文字幕| 51XX午夜影福利| 91丨九色丨国产打屁股网站| 老师高潮流白浆喷水的A片| 99热亚洲精品| 五月丁香影院| 丁香五月在线自慰| 91丨九色丨丰满人妖| 五月婷婷激情综合视频| 色色亚卅| 久99久热只有精品国产99| 亚洲婷婷视频| 亚洲国产精品成人免费一区久久久在线观看AAAA | 国产精品涩涩涩视频网站| 激情六月丁香| 亚洲色婷婷| 九九热99免费视频| 秋霞A V毛片| 99re6久热只有精品6在线直播| 丁香婷婷综合激情五月色| 亚洲女婷婷五月基地综合久久久| 婷婷舔| 99热日本| 天天弄天天爽| 亚洲丁香五月天在线视频| 九热...av| 久久综合婷婷五月| 99精品人人| 激情綜合網址| 色9999日韩国产| 99色综合网| 99热99干| 秋霞学生妹一二级| 综合五月天天天天天五月| 国产日批视频| 天天草天天日| 婷婷久久丁香| 99操碰| 99久久99九九九99九他书对| 天天干天天操天天爽| 激情五月天电影| 婷婷五月av| 另类天堂| 99热在线观看| 九九99九九精品视频| 五月婷综合激情| 停停六月 综合| 91久久免费| 激情五月,激情综合网| 在线99色| 久久久人妻久久久| 五月丁香六月婷婷亚洲| 五月天com| 丁香色综合| 开心激情综合| 这里只有精品96| 久久天堂女人| 欧美一级色| 五月天合网| 五月婷婷这里都是精品| 伊人五月天在线| 99这里有精品视频| 超碰人人色| 国外亚洲成AV人片在线观看| www.com任你艹| 亚洲综合1024| 怡红院精品视频久久久久久久久| 欧美日韩成人在线网| 九月婷婷久久| 狠狠色噜噜狠| 9久久久久| 五月丁香色色综合| 色色日本| 婷婷五月天综合网| 亚洲激情Av| 91久久综合亚洲鲁鲁五月天| 丁香五月婷婷天激情| 色99在线观看| 欧美日韩中文国产一区发布| 色五月大| 五月激情久久综合| 思思99久久| 丁香六月婷婷久久综合| www.久久爱.c n| 激情 五月 婷婷 丁香| 伊人久久五月天| 大香蕉伊人99| 五月丁香久久激情综合| 丁香五月情色| 五月婷婷六月情| 五月丁香啪啪网| 91高潮喷水久久久久久久久 | 欧美日韩AAAA| 性做久久久久久久免费看| 丁香综合久久| 五月婷婷六月奇米网丁香| 婷婷欧美综合| 五月天堂六月丁香亚州中文字幕久久| 99热这里只有精品在线免费| 久久婷婷国产| 久久久五月天婷婷成人网| 无码se| 天天爽日日爽夜夜爽| 大香蕉九九| 色五月在线综合| 电影蜘蛛女| 婷婷综合97| 久久九久久| 日夜操B| 五月激情婷婷在线| 婷婷五月天 丁香五月天 裸体| 五月丁香福利| 色婷婷久久| 综合色色五月| 激情五月六月婷婷综合啪啪| 99热这里只有精品在线观看| 色九月婷婷综合| 五月成人天| 国产SUV精品一区二区6| 激情深愛五月視頻| 九九综合久久| 99热老网站| 亚洲中文乱字字幕在线永久| 久久久久久9热不雅视频| 可以免费看av网站| 开心激情网五月天| www.婷婷六月天| 久久久这里有精品| 超碰中文字幕在线| 色偷偷色婷婷| 久久区区一二三av| 婷婷五月天开心网| 激情淫乱男女| 欧美成人色婷婷| a性生活久久无| 草操AV在线| 亚洲综合在线视频| 久久久人妻久久久| 99在线观看| 亚洲sesesese| 91丨九色丨熟女高潮| 91丨九色丨43老版熟女| 99热手机在线精品| 天天色月| 99精品无码| 天天综合亚洲综合网天天αⅴ| 92久久| 成人亚洲精品| 丁香五月婷婷五月| 激情伊人六| 五月天精品| 思思热久久阴99| 丁香五月Av| 色色精品色| 婷婷五月天伊人| 五月丁香影院| 午夜性做爰电影| 色五月婷婷、老熟女| 少妇熟女视频一区二区三区| 六月丁香婷婷色69| 激情五月天.色网| 婷婷.com| 操人久久| 人人摸人人| 九月丁香婷婷综合激情| 精品成人无码A片观看香草视频| www.日日日.com| 色偷偷AV亚洲男人的天堂| 狠狠干总合| 99热10在线高清播放| 99热99热| 九九大香蕉黄色影院| 99激情网| 激情婷婷丁香色情五月天| 综合久久丁丁香婷| 五月天亚洲综合网| 99热啪啪| 不卡在线中文字幕无| 思思热99在线视频| 五月丁香六月综合基地| www.天天干| 99久久思思| 99精品综合在线| 久色大| 99爱爱| 99爱在线视频| 亚洲情a| 激情图片久久| 六月色婷婷| 开心五月丁香啪| 六月丁香成人| 色噜噜综合网| 亚洲精品永久久久久久| VA五月激情在线| 潘金莲AAAAAAAAAA| 91爱操| 色视五月天婷婷| 热久91| 99九九综合久久九九| 激情宗合哪里能看| aaaa.黄| 国产成人网址| 思思热AV| 丁香五月另类小说在线阅读| 射久久丁香五月| 狠狠色噜噜狠狠狠狠综合| 日日做夜夜爱| 女性自慰系列第五页| 97伦乱| 婷婷性爱影院| 九九免费精品| 五月丁香激情五月天| 超碰在线资源| 精品夜夜澡人妻无码AV| 婷婷五月丁香综合激情| 丁香 婷婷 亚洲 熟女| 超碰91人人操| 丁香花综合永久入口| 九九Av| 色婷婷九月| 91性高潮久久久久久久久| 色欲五月丁香| 五月天婷婷色色| 五月天激情久久| 五月情四婷婷| 婷婷丁香成人| 五月天婷婷激情在线色图| 久操大香蕉| 色婷婷丁香五月| 亚洲综合丁香婷婷六月天| 五月 激情视频| 日韩AV中文在线观看| 精品久热| www.婷婷,com| 五月婷婷之综合激情| 欧洲亚洲免费视频区| 97九色视频| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 中文字幕丰满孑伦无码专区| 天天日,天天干,天天操| 五月综合色| 婷婷五月天亚洲综合网| 激情综合五月色在线| 毛片新网地| 九色视频入口91| 熟女人妻视频| 另类少妇人与禽zOZZ0性伦| 婷婷久久五月丁香| 色婷婷AAA| WWW.桔色成人.COM| 天天操婷婷| 五月丁香六月婷综合成人综合| 天堂爱爱| 99热这是里只有精品| 亚洲九区| 五月天婷婷基地| 亚洲av日韩无码| 91久久国产综合久久| 97综合视频在线| 国产成人精品一区二三区熟女在线| 97人人干| 五月天激情久久| 97干在线| 五月丁香六月激情在线| 色婷婷五月天在线观看| 99久久网站| 在线观看中文字幕| 99色色网| 熟女人妻一区二区三区免费看| 在线播放中文字幕| 少妇真实被内射视频三四区| 强辱丰满人妻HD中文字幕| 精品一二三区久久AAA片| 亚洲操操操| 久久久精品人妻| 99亚洲精品| 婷婷中文字幕| 色狠狠色噜噜AV天堂五区| 丁香五月激情网| 夜夜爽77777妓女免费下载| www.色五月| 欧美槡BBBB槡BBB少妇| 九九伊人网| 偷偷与邻居做爰完整视频| 国产亚洲精品久久久久久豆腐| 国产精产国品一二三在观看 | 中文在线成人| 色婷婷狠狠| 色婷婷激情| 另类少妇人与禽zOZZ0性伦| 少妇2做爰HD韩国电影| 国产AV影片| 久操乱| 久久一品区| 久热黄色| 一區四區歐美日韓| 97丁香五月| 超碰99热精品| 能看的av网站| 操日本99| 亚洲黄色精品| 丁香六月 人妻| 日本成人噜噜| 99碰碰视频| 久久五月天婷婷| 丁香六月婷婷色XXXX| 伊人影院久久网| 激情床戏| 五月婷婷影视| 日韩淑女人妻luan伦激情精品一区二| 激情综合网五月天| avh片在线观看| 色综合中文色综合网| 亚洲婷婷五月天在线激情综合网| 亚洲精| 99免费| 婷婷天天色| 99精品丁香五月| 九九色色色| 99在线观看免费精品视频| 99热99热不卡| 婷婷色五月丁香六月欧美啪| 影音先锋 萱萱| 激情久久 婷婷| 精品国产va久久久久| 激情婷婷五月天在线观看| 夜夜撸日日操| 欧亚成人A片一区二区| 色婷婷av综合网| 另类视频在线| 五月六月丁香激情| 青青草国产亚洲精品久久| 色婷婷情片| 婷婷五月天.com| 人妻久久久| 成人无码髙潮喷水A片| 综合激情在线观看| 色五月婷婷视频| 九热免费视频| 丝雨一区二区| 亚洲综合网区| 色色五月婷婷久久| 婷婷色色欧美综合网| 丁香五月天激情| 激情五月天综合| 成人综合网站| 九九久久综合| 丁香六月激情综合| 丁香网五月天| 天天爱天天做天天日| 婷婷色五月在线视频| 91chinese在线| av在线播放网址| 激情婷婷综合五月少妇| 97人妻碰碰中文无码久热丝袜| 9 1在线视频| 天天草天天日| 亚洲九九夜夜| 成人亚洲精品久久久久| 99操视频| 天堂综合久| 三日本无码| 热99热| 人人爱国产| 99热网址| 国产在这里只有精品| 色色网站毛片| 亚洲第一色色色| 91欧美| 久久久久网站| 五月丁香六月婷婷激情网| a级毛片一区二区免费视频| 香蕉婷婷色五月| 亚洲AV成人在线| 婷婷五月18永久免费网站| 亚州性爱99| 激情内射人妻1区2区3区| 97亚洲色 torrent magnet| 97碰碰视频在线观看免费| 久久九九囯产| 狠狠草狠狠草| 久久久九九视频精品18| 五月激情六月宗合| 97久久超视频| 五月亭亭狠狠| 九月丁香八月婷婷久久综合久97| 26uuu亚洲| 亲子乱av一区二区三区的| www,五月天激情| 成人无码免费一区二区中文| 99热99精品在线观看| 欧美激情性做爰免费视频| 成人色站,在线视频,看片-SS1AV| 任你草| 99热在这里只有免费精品| 伊人久久婷婷| 五月激情婷婷六月丁香| 99色爱| 天天色天天爱天天爽| 九九综合影音先锋| 婷婷五月六月丁香综合| 中文字幕高清av| 综合久久五月天| 99热第一页| 干一干xxxx| 九九久久99精品免费观看www| 久久久ww| 久热精品视频在线观| 天天操夜夜操| www.minyis.com【JT】国内CDN落地页保证转化QQ2101460746 | 开心五月婷婷激情| 26uuu国产| 亚洲 在线 性爱 | 丁香五月综合在线| www.婷婷激情网.com| 色五月首页| 欧美超碰人人| 欧美色色色| 久热2025无码| 五月色亭丁香| 99热碰碰热| 99久久免费性爱视频`| 国产成人精品123区免费视频| 第一区久久网站| 色婷婷综合丁香五月天| AAA久久| 2020久久婷婷五月| 欧美日本99| 久久东京热婷婷五月| 轮奸综合网| 婷婷狠狠干| 天天日 天天草| 99热九九这里只有精品| 激情婷婷丁香| 婷婷操超碰| 色六月天天激情综合网| 九九久久腿| 日韩婷婷| 婷婷六月伊人| 久久精典| 久草丁香婷婷1024| AV在线观看网站| 五月丁香激情综合六月涩涩爱| 欧美激情 日韩无码 婷婷 五月天| 91在线日| 九九机热| 国在线激情网| 五六月婷婷久久| 五月天婷婷av| 婷婷情色激情| 亚洲激情综合色站| 激情性爱网站| 九九在线精品| 婷婷五月天情色| 色婷婷综合五月| 97se视频在线| 国产亚洲精品久久久久久久久动漫 | 97色在线观看视频| 91男同视频| 亚欧州精品视频| 思思99re这里只有| 精品久久99码| 婷婷五月六月| 9色91视频| 五月婷色色| 日日爽日日爽| 激情开心五月婷婷| 色婷天天| 久热爱大香蕉在线蜜臀悦色 | 天天干天天干天天干天天干天天干| 婷婷五月天视| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 天天狠狠夜夜狠狠2023| 五月天婷婷综合免费| 色婷婷成人影片| 超碰com| 天天日P天天射P| 久久人妻精品| 亚洲欧美综合7777色婷婷| 开心色五月天久久久久久久| 婷婷5月天av| 大香蕉网站,大香蕉综合| 成人在线免费网址| 激情性爱五月天网页| 色5月婷婷| 国产精品久久久久久白浆色欲| 深爱五月激情| 99热精品6| 欧美五月丁香在线观看| 色色精品色| 综合久久综合| 五月天操逼网| 五月天伊人久久久久| 激情影院69| 怡红院AV亚洲一区二区三区H | 青柠影视免费高清电视剧| 99久久久99久久91熟女| 日本色99| 天天日日夜夜| 99热在线观看免费精品| 五月婷婷丁香在线| 伊人五月成人| 久热播这里只有精品| 五月天激情Av| 久久久月丁香| 天天在线天天综合网色| 第四色色六月色综合| 婷婷色情网| 成人五月天丁香婷| 婷婷综合在线播放| 超碰不卡在线| www.五月天色色色| 97婷婷在线| 五月婷婷七月丁香| 婷婷伊人75| 99色五月| 色噜噜狠狠色综合网| 亚洲在线成人| 天天干,天天操,天天射| 激情图片99| 婷婷婷久久久| 超碰电影在线播放| 久久久999精品| www.婷婷| 婷婷激情五月天天天开心| 丁香六月婷婷综情欧美| 色欲人妻综合aaaaaaaa网| www。五月天激情| 人妻久久久久久久久妻久久久久久久久| 色噜噜狠狠色综合无码久久欧美| 婷婷丁香五月天婷婷| 九九成人精品免费视频| 日韩一区二区在线播放| 六月婷婷狠狠色在线观看| 日韩婷婷五月天| 能直接看的AV网站| 色综合色色色| 久久狼人天堂| 综合色99| 婷婷丁香激情五月天色色色| 99爱在线| 伊人五月综合网| 六月丁香啪啪啪| 伊人大香五月天| 九九色99| 色色com| 91色久| 777精品久无码人妻蜜桃| 五月天丁香色色| 91久久精品视频| 久久伊人婷婷| 丁香成人综合| 色婷婷丁香五月在线观看| 九九人人精品| 色色色色综合网| 9|人妻人人操| 大香线蕉伊人| 久久五月天激情婷婷| 五月丁香伊人网| 人人视频人人干人人做| 97人人干人人操| 少妇人妻人伦A片| 97sese婷婷| 亚洲操操| 丁香婷婷中文字幕| 丁香九月久久| 中文字幕成人网站| 射区导航| 99色色最新视频| 久热只有精品| 久久99热这里只频精品6学生| 超碰狠狠干99| 极品色丁香| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 99热这只有| 色五月综合在线| AA丁香综合激情| 亚洲综合碰| 熟女色专区| 99热99热在线| 激情综合亚洲| 操逼巨乳91| 人妻videos人妻高清| 婷婷五月天AV| 国产精产国品一二三在观看| 婷婷九月在线| 久久av电影| 另类A片| 日本三级99人妇网站| 亚州色婷婷| 激情小说五月欧美亚洲丁香| 亚洲激情五月| 99免费在线视频| 久久五月丁香激情综合| 久久98热re| 琪琪布丁香社区激情五月天| 91偷拍视频| 国产精品热搜丁香五月婷婷| 人人播| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 5月丁香六月婷婷| 久久久久人妻网址| 視频福利乱色| 亚洲综合在线丁香五月| 久久精品性爱| 91视频五月丁香| 99人人操人人摸| 99爱在线视频| 六月丁香色色| 天天天综合网| 成人午夜天| 丁香五月天导航| 精品久热69| a毛片二逼wwwwwwwwww| 亚洲色情免费网| 大香蕉九操| 在线看av| 色五月婷婷内射| 欧美日本日韩| 99热综合在线| 丝袜人妻| 久久最新色| 狠狠色综合精品视频在线| 精品久久久91久久影视网| 成人五月天在线观看| xx久久| 亚洲区1| 婷婷色网站| 91性交在线播放| 三区激情四射av| www.婷婷.com| 另类视频一区| 99久视频| 色碰碰视频| 日韩精品一区二区亚洲AV观看| 久久ri精品视频| 狠狠五月天婷婷激情网。| 亚洲精品又粗又大又爽A片| 夜夜人妻五月天| www.夜夜操.com| 91久久婷婷| 久久草大香蕉| 五月丁香婷婷啪啪| 九九九热精品| 婷婷激情性爱| 久操综合| 国产精品人妻欲求不满| 色婷婷操逼| 久久久久久激情| 九九五月天| 九九碰九九爱97超碰| 91热99| 日本一道久久| wwwss在线观看| 五月婷久久| 五月婷婷色五月| 六月欧美综合色情| 99精品偷自拍| 婷婷色情小说| 日本97在线观看| 婷婷色成人| 日本A片一区| 噜噜狠狠色综无码久久合欧美| 色婷婷五月综合色婷婷| 色五月激情五月| 亚洲碰碰碰| 婷婷性爱影院| 色激情综合狠狠婷婷| 欧美日本日韩| 天天综合网网欲色| 日日操夜夜操无码免费| 成人在线视频网| 激情综合青草| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 一区二区三区四区无码| 99综合成人视频在线观看| 噜噜狠狠色| 亚洲无线视频| 婷婷亚洲综合| 婷婷五月丁香六月天亚洲综合| 丁香五月婷婷亚洲激情四射| 日本啪啪网| 婷婷丁香视频在线观看免费| 国产91资源在线| 天天插天天插天天插天天插| 在线网黄| 欧美韩国日本| 五月天婷婷影院影院观看| 噜噜操操| 五月丁香| 五月天婷婷在线观看| 一区二区免费看| 思思热在线视频精品| 婷婷五月天干干| 五月天操逼网| 亚洲亚洲人成综合网络| 日本狠狠网| 26uuu欧美日韩| 亚洲无码影音| 情色婷婷五月天| 色五月久久成人婷婷| 婷婷丁香综合在线| 久99热| 色色婷婷综合网| 成人电影AV在线观看| 激情五月天综合网| 九九热99热| 免费黄色视频网址| 婷婷激情六月中文| 久久曰曰| 亚洲精色| 色很很96| 4399精品一区二区| 色五月在线观看| 热99精品视频| 色伊人啪| WWW.桔色成人.COM| 逼里香不卡| 亚洲综合激情五月天婷婷| 丁香五月成人自拍| 丁香色五月天| 久色婷婷200| 丁香五月综合激情久久潮喷| 国产黄色大片| 99热成人| 91色综合网| 91视屏在线观看com.wwwvv| WWW.久久久久久久| 大香蕉 婷婷| 色婷婷久久综合| 亚洲另类噜噜| 色综合爽| 国产一区18| 苗黎美女四级成人版一级二级毛片| 丁香婷婷婷五月| 亚洲视频在线网| 亚洲天天操| 国产精品久久久海的味道| 婷婷丁香六月激情综合| 欧美超级视频97| 五月做爱| BBWCUCKOLD精品熟妇| 成人五月天丁香婷| 丁香六月色婷婷| 深爱激情九九五月天| 99热99精品| 欧美日本97| 欧美成人在线观看| 九九色婷婷| 九九热在线视频| 欧美色婷婷| 久久hd| 丁香六月激情国产| 国产亚洲精品久久久久久郑州| 九九综合九九| 五月丁香婷婷深深爱| 99在线看片| 色五月婷婷激情综合网| 人伦30P| 欲色人妻| 狼人伊人天堂| 国产XXXX搡XXXXX搡麻豆| 久久久婷婷婷| 色五月天丁香婷婷| 亚洲国产99| 国色天香伊人狠狠色| 五月丁香六月婷婷中文版| 伊人婷婷青青cao| 婷婷色吧| 伊人玖玖网| 97超碰在线观看免费| 图片区 小说区 区 亚洲五月| 五月天另类小说| 久久久久婷婷| 婷婷色在线视频| 操骚货在线| 久久久久丁香婷婷五月天| 天天爽天天透天天爱| 日韩婷婷五月天| 婷婷五月天伦理| 综合五月草| 丁香九月综合| 激情综合4月| 99精品久久| 亚洲五月天色| 99热免费网站| 欧美激情综合| AV色五月婷婷| 五月婷婷色播视频| 久热无码| 久久婷婷成人视频| 99热精品在线播放观看| 亚洲日本激情| 97激情五月天| 夜夜夜叫天天天做| 五月丁香视频在线观看| 99热日韩这里只有精品| 99热久只有| 九九视频热| 99热99这里有免费的精品| 丁香五月天的网址。| 91午夜激情| 色五月女| 激情av在线| 丁香五月色情| 大香蕉五月天婷婷| 色狠狠色| 五月J香蕉婷婷| 91夫妻网站九色| 人妻中文av| 五月天久久综合| 婷婷五月天堂| 五月激情四射婷婷丁香| 26uuu激情五月天| 激情四射五月天偷偷看婷婷| 丁香五月图片| 狠狠干思思热| 色婷婷五月天| 超碰99在线观看| 五月天激情婷婷| 色婷婷综合久久| 一区二区你懂的| 久青操| 美女五月激情| 思思综合热| 99热色精品| 久操操| 99人妻碰碰久久久禁片| 五月丁香亚州综合网| 婷婷五月天av| 日韩AV大全| a久久| 丁香啪啪中文字幕| 一级性感黄色内射视频| 婷婷大香蕉| 婷婷中文字幕版| 99热这里只有精品在线观看| 91丨九色丨熟女| 国产精品色| 大香蕉伊然在亚洲90| 91精产品自偷自偷综合| 美女亚洲五月丁香| 婷婷干五月综合在线播放| 很操日本7| www热久久yy9| 激情久久久| 色网站9| 色九月婷婷综合| 色婷婷国色天香综合| 五月丁香综合在线| 99热这里只有精品22| 五月婷婷丁香日韩在线| 9精品在线| 婷婷亚洲五| 日日舔夜夜操| 玖玖资源在线视频| 亚洲无码猫咪| 国产99热| 99热这里只有精品免费观看| 无码色| 国产超碰av| 日韩操人| 五月丁香激情婷婷| 亚洲成人综合在线| 婷综合六月| 色亚洲中文| 日韩黄色电影| 九九XX视频| 黄网免费看| 五月开心深深爱激情综合| 色色网站| 九九九九九九九九九九九九九九九九九九九在线视频 | 亚洲人妻Av| 婷婷丁香五月六月激情| 婷婷的99视频网站| 丁香网五月天| 思思99热这里只有精品| 天天狠狠六月婷丁香影院| 丁香五月六月| 久久免费丁香| 婷婷激情五月综合丁香社| 丁香五月人妻| 色婷婷AⅤ| 五月婷婷丁香五月婷婷| 激情五月天婷婷| www.99精品视频| 亚州日本欧州韩美高青高潮一| 国产精品久久..4399| 五月婷婷国产| 美女婷婷六月色| 六月丁香五月天| 丁香五月婷婷五月| 色五月丁香伊人| 九九亚洲视频| 99ri精品| 欧美色九| 日本丰满久久| 天天日,夜夜爽| 国产亚洲在线| 久久九九99| 99精品在线| 激情性爱婷婷| 1010日日无码| 国产精品久久久爽爽爽麻豆色哟哟| 超碰免费成人| 久久视频婷婷| www.色色com| 99热这里只有精品最新网址| 欧美色频| 热99这里只是精品| AV在线免费网站| 久久丁香九| 五月丁香黄色视频| 青青草原亚洲久| 久热中文字幕在线线观看| 激情五月天网站| 99色色爰| 欧美va在线| 婷婷久久五月| 婷婷五月天成人网| 极品九九九九九九| 色99网站| 91窝窝| www.开心激情| 99九九99九九九视频精品| 激情综合色婷婷啪啪六月天| 五月婷婷久草| 五月丁香啪啪啪啪| 野战J办公桌椅H| 六月丁香婷婷开心综合基地| 极品人妻VIDEOSSS人妻| 丁香五月图片| 国产AV一区二区三区日韩| 美女婷婷六月色| 成人午夜天| 婷婷综合五月激情| 日日躁夜夜躁狠狠久久AV| www.狠狠色.com| 在线观看免费观看在线9久| 色综合久久五月| 激情又色又爽又黄的A片| 影音先锋激情网| 东京热五月婷婷| 日日噜狠狠色综合久久| 超碰人人插| 色婷婷综合视频| 在线视频99| 99riAV国产精品视频| 九九99免费理论| 欧美成人va| 日本特黄aaaaa| 亚洲色无码A片一区二区麻豆| 狠狠狠五月婷婷六月丁香| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 夜夜骑夜夜撸| 金品在线视频99| 成人在线精品| 久久99最新| 99热 日韩| 天天日,天天射,天天舔| 91 原创 在线 九色| 精品人人操| 操人妻90p| 婷婷色情 | 激情综合色播| 久久3p| 丁香久久| 丁香九月婷婷色| 婷婷激情五月天激情小说| 婷婷六月综合基地| 99久久99视频只有精品| 国产精品成人AV在线观看春天| 99色看| 丁香玖玖| www.婷婷| 成人超碰Av| av线电影| 99精品在线| 丁香婷婷视频一区二区| 中文字幕av在线播放| 婷婷综合激情| 人妻 性久久久久久| 干一干xxxx| 色婷婷丁香A片区毛片区女人区| 色色色.COM| 五月天丁香成人社| 亚洲日韩一页精品发布| 五月婷六月| 亚洲另类在线观看| 婷婷丁香九色| 五月婷婷视频在线观看| 欧美成人Va| 久久婷婷大香蕉| 五月天激情视频| 国产精品久久久久久五月天加勒比| 国产老熟妇亲子乱对白| 欧美顶级少妇做爰HD|