久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

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

Shell腳本實戰(zhàn):從踩坑到高效自動化運維 從事Linux運維和開發(fā)這些年shell腳本是我每天都會碰的東西。做日志切割、批量改文件、寫定時任務、數(shù)據同步、環(huán)境初始化一件件看起來雞毛蒜皮的小事最后都是靠腳本把人力省下來的。這是我自己筆記的第十六篇前面寫過系統(tǒng)啟動、權限、磁盤、網絡這些基礎內容這篇專門聊聊shell腳本把我這些年踩過的坑和覺得有價值的寫法一次性梳理出來希望能幫正在學腳本的讀者少走幾步彎路。這篇內容不打算從什么是變量這種教科書概念開始而是直接以實戰(zhàn)視角切入什么時候該寫腳本、腳本骨架怎么搭、核心語法怎么用才不出錯、完整案例怎么落地、出了問題怎么排查。適合已經會敲基本命令、想把零散命令變成可復用工具的讀者如果你是完全零基礎可以先拿著基本命令練幾遍再來看這篇效果會更好。1. 什么時候真正需要動手寫腳本1.1 腳本最擅長解決的幾類問題先說實話不是所有事情都值得寫成腳本。我自己判斷的標準很簡單這件事是不是要重復做兩次以上是不是需要多個命令配合才能完成如果答案都是肯定的那基本就該寫了。最常見的場景我列一下批量操作類幾十臺機器上收集信息、幾百個文件統(tǒng)一改名、批量壓縮解壓。手工敲一條條命令又累又容易漏腳本跑一遍還能留下輸出日志。定時任務類日志清理、數(shù)據備份、臨時文件歸檔、健康檢查告警。cron加腳本是絕配腳本負責邏輯cron負責定時觸發(fā)。部署與初始化類新機器裝環(huán)境、初始化配置、重啟服務。這類操作步驟多且有固定順序寫成腳本后可以反復執(zhí)行也方便在出問題時快速重來。格式轉換與數(shù)據處理把CSV轉成另一種格式、從日志里面提取關鍵字段、批量替換文件內容。配合awk、sed、grep這些工具一個瘦腳本就能解決很多所謂大數(shù)據需求的土辦法方案。我遇到最多的是日志相關。比如業(yè)務系統(tǒng)每天產生的日志文件按照日期命名超過30天的需要刪除磁盤空間到80%需要告警。這種需求用手工做根本不現(xiàn)實定時跑一個腳本才是正解。后面我會把這個完整腳本展開講。即使是臨時性任務只要我開始覺得這串命令要重復手敲兩遍也會順手寫成腳本。寫的時候可能只花三分鐘但后面再遇到類似需求把腳本翻出來改兩行就能用。腳本庫就是這么一點一點攢出來的。1.2 別把腳本當萬能鑰匙shell腳本也不是沒有短板。遇到下面這幾類情況我建議換個工具而不是硬撐。一是性能敏感的大數(shù)據處理。比如幾GB的日志要算統(tǒng)計指標shell里一層層循環(huán)會慢到讓人懷疑人生這時候用Python、Go甚至直接上SQL都更合適。shell適合做膠水層面的組織和協(xié)調不適合做重計算。二是邏輯特別復雜的流程。判斷分支多了、狀態(tài)多了、需要復雜數(shù)據結構的場景shell寫起來會很痛苦調試也費勁。腳本里出現(xiàn)幾十行嵌套if基本就是該重構或者換更合適語言重寫的信號。三是跨平臺要求高的場景。雖然bash在各種Linux發(fā)行版上都通用但有些命令在不同發(fā)行版上行為略有差別macOS自帶的是舊版bashWindows上更是另一套。如果腳本要在完全不同的環(huán)境里跑要么用Python這類跨平臺解釋器要么在腳本里做足兼容判斷。我的經驗是能用標準命令組合解決的就用腳本感覺腳本寫起來已經很別扭了果斷換語言。工具選對了后面維護的成本才會低。1.3 動手前先想清楚三個問題寫一個腳本之前先花兩分鐘想三件事輸入是什么、輸出是什么、中間有哪些約束。輸入可能是配置文件、命令行參數(shù)或環(huán)境變量輸出可能是處理后的文件、日志記錄或一個退出碼約束包括運行權限、運行時間窗口、磁盤空間上限等。想清楚這三件事腳本的結構基本就出來了。然后遵循一個原則一個腳本只干一件事。把功能拆成函數(shù)每個函數(shù)只做它負責的那部分。這樣做的好處是定位問題快、復用方便也方便以后把腳本拆成更細的模塊。我早期寫腳本總是一個腳本解決所有問題結果腳本越來越長改一個邏輯就動到全局線上出了故障排查得像考古。吃過虧以后才養(yǎng)成先拆功能、再動手寫的習慣。2. 腳本骨架搭建與變量引用的關鍵細節(jié)2.1 shebang、執(zhí)行權限和首行配置一個普通文本文件要讓系統(tǒng)當成腳本執(zhí)行需要兩個條件第一行以#!開頭指定解釋器并且文件要有執(zhí)行權限。第一行寫#!/bin/bash還是#!/usr/bin/env bash兩者都能用但意義不同。直接寫#!/bin/bash是明確指定解釋器路徑性能稍好兼容性也更容易預料。寫#!/usr/bin/env bash是先找到bash所在路徑再執(zhí)行在bash不在標準位置的系統(tǒng)上更靈活但env本身如果找不到也會帶來問題。我自己在服務器上習慣直接寫#!/bin/bash因為標準發(fā)行版上bash基本都在這個位置少一層解析也更穩(wěn)。執(zhí)行權限用chmod x script.sh加上。這一步很多人忽略導致明明腳本沒問題卻提示Permission denied。另外如果在當前目錄運行腳本要寫成./script.sh而不是script.sh因為當前目錄通常不在PATH環(huán)境變量里。這個踩坑率極高尤其是剛從Windows轉到Linux環(huá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當成一個變量名而echo ${name}_file才是取name變量的值再加下劃線和file。凡是變量名邊界不清晰的場景一律用${}包裹這是一個讓腳本更清晰、更安全的好習慣。引號的使用是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把里面的空格當成分隔符。還有一種情況是變量的值來源不可控比如讀取外部文件內容、命令輸出的結果這時候雙引號尤其重要。不加雙引號的話文件里如果有分號、感嘆號、星號之類的內容shell會做各種展開輕則結果不對重則執(zhí)行了本不該執(zhí)行的命令。我在這上面栽過跟頭一個讀取文件內容后再拼成命令發(fā)送的腳本文件里恰巧有分號結果一行原本正常的命令被拆成了兩條。從那以后凡是非我手寫的字符串默認一律加雙引號處理。命令替換是另一個常用特性$(command)會執(zhí)行命令并把輸出作為值。比如拿今天日期today$(date %F)。這里我建議優(yōu)先用$()而不是反引號因為反引號在處理嵌套時容易出錯$()可以嵌套可讀性也更好。注意命令替換的結果如果有換行符賦值給變量后會保留echo出來可能看到多行這在處理命令輸出時要心里有數(shù)。2.3 位置參數(shù)與入參檢查腳本接收外部輸入最常見的是位置參數(shù)$1、$2這種。比如./backup.sh /data/mysql /backup腳本里$1就是/data/mysql$2就是/backup。$#表示參數(shù)個數(shù)$表示所有參數(shù)并且每個參數(shù)獨立$也表示所有參數(shù)但視為一個整體。遍歷參數(shù)時應該用for arg in $而不是$這樣才能正確處理帶空格的參數(shù)值。腳本里的關鍵參數(shù)我習慣加一道檢查避免用戶忘了傳參導致腳本在后面某個莫名其妙的位置報錯。典型寫法if [ $# -lt 2 ]; then echo 用法: $0 源目錄 備份目錄 exit 1 fi這樣做的好處是錯誤信息明確而不是腳本跑了一大半才因為找不到文件而失敗。exit 1返回非零退出碼調用方可以據此判斷腳本執(zhí)行失敗。有時候參數(shù)是可選的需要默認值。shell的參數(shù)展開語法能直接處理${var:-默認值}表示var沒設置或為空時使用默認值。比如日志保留天數(shù)支持通過參數(shù)指定不指定就默認30天keep_days${1:-30}。這樣腳本既靈活又穩(wěn)妥。類似地${var:默認值}不但取默認值還給變量賦值${var:?提示信息}在變量為空時直接退出并輸出提示適合強制要求參數(shù)的場景。3. 條件判斷與循環(huán)的實戰(zhàn)細節(jié)3.1 條件測試寫法單中括號和雙中括號怎么選shell里做判斷本質上是運行一個test命令并根據它的退出碼決定分支。if [ ... ]中的方括號其實是test命令的另一種寫法所以方括號兩邊必須有空格[ $a $b ]寫成[ $a$b ]就會出錯因為shell把整個字符串當成了一個參數(shù)?,F(xiàn)代bash里更推薦用雙中括號[[ ... ]]。它是bash內置的關鍵詞支持更豐富的表達式比如和都可以用支持正則匹配也支持和||這種邏輯運算符。最關鍵的是在[[ ]]內部變量即使不加雙引號也不會被錯誤分詞對新手友好得多。我的建議是既然用的是bash直接統(tǒng)一用[[ ]]不要再拿單中括號去踩那些邊邊角角的坑。文件判斷操作符要記牢-f判斷是不是普通文件-d判斷是不是目錄-e判斷路徑是否存在-r、-w、-x判斷讀、寫、執(zhí)行權限-z和-n判斷字符串為空或非空。-nt和-ot可以比較文件的修改時間新舊在增量備份場景里很好用。數(shù)值比較用-eq、-ne、-gt、-lt而不是和因為在shell里是重定向符號寫錯會引發(fā)文件重定向非常隱蔽。邏輯判斷的寫法在[[ ]]里直接用和||if [[ -f $file -r $file ]]; then。在單中括號里要用-a和-o再加上各種轉義可讀性和安全性都差。所以堅持用[[ ]]能讓代碼干凈很多。3.2 for、while、until在什么場景下各司其職for循環(huán)適合遍歷已知列表遍歷一組文件、一組主機名、一組參數(shù)。最典型的是遍歷當前目錄下的所有txt文件for f in *.txt; do echo 處理文件: $f done注意*.txt在這里會先被shell展開成文件列表如果目錄里沒有匹配的文件展開結果會是字面的*.txt循環(huán)還是會執(zhí)行一次所以最好先判斷文件是否存在再進循環(huán)。遍歷時如果文件名有空格for f in *.txt這種寫法會出問題因為空格會被當成列表分隔。處理方法是用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)適合條件驅動的場景讀文件直到文件結束、等待某個條件成立、消費某個隊列。最常見的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)會把文件按空格、按換行全部分裂一遍文件內容稍微有點特殊字符就亂套了。until循環(huán)和while結構一樣只是條件為假時執(zhí)行。實際用得少但偶爾用來等待某個服務就緒還挺順手until nc -z 127.0.0.1 3306; do sleep 1; done一直等到數(shù)據庫端口能連通。循環(huán)里break可以提前跳出continue進入下一輪是兩個常用的控制指令不要忘記。3.3 管道、子shell與循環(huán)變量丟失問題這個問題我必須單獨提因為它坑過的絕對不止我一個人在管道后面接while循環(huán)循環(huán)內對變量的修改在循環(huán)結束后會丟失??催@個經典例子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的設計使然。解決思路有三種。第一種把輸入重定向而不是用管道while read line; do count$((count 1)) done (echo -e a\nb\nc)進程替換(command)產生的輸入通過重定向進入循環(huán)循環(huán)本身還在當前shell里運行變量修改就能保留。第二種是把結果寫到文件再讀出來。第三種是把處理邏輯封裝成函數(shù)后用輸出捕獲結果但本質上還是在子shell里靠的是函數(shù)輸出而非變量傳遞。這類子shell邊界問題在管道、find -exec、括號子shell里都會出現(xiàn)。遇到變量值詭異消失的現(xiàn)象第一反應就是檢查是不是跨越了子shell邊界。排查方法也很簡單在關鍵位置加echo輸出中間值看看循環(huán)內和循環(huán)外的值是否一致不一致基本就是邊界問題。4. 函數(shù)設計、退出碼與腳本健壯性4.1 用函數(shù)拆骨架local變量防污染腳本一長組織方式就成了大問題。我現(xiàn)在的習慣是腳本主體只保留流程調度真正的邏輯全部放進函數(shù)。函數(shù)定義用function name() {}或者直接name() {}都可以我傾向不帶function關鍵字和POSIX兼容性更好。函數(shù)里要特別注意變量的作用域。默認情況下函數(shù)里賦值的變量是全局的會污染腳本其他部分。所以凡是函數(shù)內部的臨時變量一律用local聲明local tmp_file/tmp/xxx。這能避免函數(shù)間因為同一個變量名互相影響排查問題時也清楚每個變量的歸屬。這個習慣和寫代碼時不讓函數(shù)偷偷改全局狀態(tài)是同一個道理。函數(shù)內用return返回一個整數(shù)狀態(tài)碼0表示成功非0表示失敗。return和exit容易混return只是退出當前函數(shù)腳本還能繼續(xù)exit是直接終止整個腳本。在某個函數(shù)里判斷要不要讓整個腳本停下來就要分清楚用return還是exit。我一般是函數(shù)內部出錯且后續(xù)步驟依賴該函數(shù)的結果就在函數(shù)里exit 1讓腳本立刻失敗只是單一環(huán)節(jié)出錯、不影響整體就return非零值讓調用方自行處理。函數(shù)設計上還有一個經驗一個函數(shù)只做一件事函數(shù)名誠實描述行為。read_config作為一個函數(shù)就只負責讀取配置并校驗不把別的邏輯塞進來。這樣腳本讀起來像是一篇有目錄的文章而不是一團糾纏的線。4.2 退出碼與set -euo pipefail的核心策略每個命令執(zhí)行完都會留下一個退出碼0是成功1到255是各種失敗原因。在條件判斷和循環(huán)里shell就是靠退出碼來決定走向。$?保存著上一個命令的退出碼但它有個致命特點任何命令執(zhí)行都會覆蓋$?。你想檢查某個命令的結果必須立刻取值中間不能穿插任何其他命令。下面這個寫法就是典型的錯grep error app.log echo grep退出碼記錄到變量: $? if [ $? -eq 0 ]; then第一次$?還是grep的退出碼第二次$?已經是echo命令的了想判斷grep結果時早就不對了。正確做法是第一時間把退出碼存下來grep error app.log ret$? if [ $ret -eq 0 ]; thenset選項能大幅改變腳本的容錯行為。set -e表示任何一條命令返回非零就立刻退出腳本避免錯誤被掩蓋、腳本帶著錯誤狀態(tài)繼續(xù)跑出更多問題。初學者經常覺得set -e太敏感但正是這種敏感讓問題盡早暴露。set -u表示使用未定義變量時直接報錯退出能順手抓出很多變量名拼寫錯誤。set -o pipefail讓管道中任何一個環(huán)節(jié)失敗都被識別為管道失敗否則bash只關心管道最后一個命令的狀態(tài)前面環(huán)節(jié)悄悄掛了你都不知道。三個選項拼在一起set -euo pipefail就是我現(xiàn)在所有腳本開頭的標配。它們改變了腳本遇到錯誤時的默認反應從默默繼續(xù)變成大聲失敗。這個轉變對線上任務的意義非常大我自己是踩過腳本其實早就出錯但還在跑的虧之后才真正體會到這行配置的價值。也要說明set -e在某些場景下需要臨時關閉。比如你明確知道某條命令可能失敗且失敗是可以接受的可以用if cmd; then的寫法把它放在條件里這樣set -e不會干涉?;蛘哂胏md || true主動吞掉失敗狀態(tài)。但|| true相當于告訴讀者這行失敗無所謂所以要謹慎使用別讓該報的錯都被蒙混過關。4.3 trap清理與臨時文件安全管理腳本跑著跑著被中斷了留下的臨時文件、鎖文件怎么辦trap命令就是為這種場景準備的。trap code EXIT可以讓腳本在任何方式退出時都會執(zhí)行那段清理代碼無論是正常結束、被中斷還是報錯退出。我寫腳本時凡是創(chuàng)建了臨時目錄必配一句tmp_dir$(mktemp -d) trap rm -rf $tmp_dir EXITmktemp -d會在/tmp下生成一個隨機命名的目錄避免用固定路徑導致多個實例互相覆蓋也防止了路徑被其他用戶提前猜到帶來隱患。trap清理保證腳本就算中途掛了垃圾也能被帶走。單獨看rm -rf $tmp_dir這個命令還有一個細節(jié)變量要用雙引號包住否則目錄名里有空格時會拆成多個參數(shù)甚至可能誤刪不該刪的東西。關于rm -rf的風險后面安全部分還會展開。trap還可以監(jiān)聽信號trap echo 收到中斷信號開始收尾; exit 1 INT TERM讓腳本在被CtrlC時先做清理再退出。這種無論如何退出都先清理的思維是腳本健壯性的一個核心習慣建議把它內置到自己的腳本模板里。5. 實戰(zhàn)拆解一個日志自動清理腳本5.1 需求描述與功能拆分前面講了這么多理論現(xiàn)在用一個我真實場景里非常常見的例子把整個流程串起來。假設有一個業(yè)務日志目錄/data/app/logs里面每天生成一個以日期命名的.log文件還可能有子目錄。需求有三點刪除30天前的日志文件釋放磁盤空間刪除前記錄一份清理清單方便以后查賬如果目錄所在磁盤使用率超過80%輸出告警信息并留下一條醒目的記錄。這種需求如果直接寫三坨命令也能完成大部分功能但可讀性、安全性都差。按前面說的思路我先拆功能校驗目錄、執(zhí)行清理、記錄日志、檢查磁盤水位。每個功能一個函數(shù)主流程簡單清晰。5.2 完整腳本逐段解析先看完整代碼再逐段解釋關鍵處。這個腳本偏向通用教學你可以直接拿來改成本地路徑使用。#!/bin/bash # 功能日志目錄過期清理與磁盤水位檢查 # 用法./clean_logs.sh [保留天數(shù)] [目標目錄] 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 清理任務完成保留天數(shù)${KEEP_DAYS} } main逐段來說。set -euo pipefail就是前面說的標配。其中-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先驗證目錄存在。在腳本一開頭就校驗前置條件是避免任務做到一半才發(fā)現(xiàn)環(huán)境不滿足的經典做法。disk_usage用df拿使用率再用awk取第二行的百分比字段用tr去掉百分號最后和LIMIT比較。這里一個細節(jié)是df的輸出第一行是標題NR2才是目標文件系統(tǒng)的數(shù)據行。do_clean是整個腳本的核心。find $LOG_DIR -type f -name *.log -mtime $KEEP_DAYS查找指定目錄下距離修改時間超過保留天數(shù)的.log文件。-mtime 30的意思是文件修改時間在30天之前。選項-print0讓find以null字符分隔輸出的文件名這是為了應對文件名里有空格或換行的極端情況。然后通過進程替換(...)把find的結果作為while循環(huán)的輸入這樣while循環(huán)跑在當前shell里不會遇到前面說的子shell變量丟失問題。循環(huán)體里先判斷[ -f $file ]再刪除主要是防止find結果因路徑變化已經失效避免把不存在路徑當普通參數(shù)處理。main函數(shù)把整個流程串起來腳本真正執(zhí)行的地方就一行main。這樣設計的好處是腳本的邏輯一目了然想單獨調試某個環(huán)節(jié)可以臨時注釋掉main里的某一項或者直接拿出某個函數(shù)單獨測試。5.3 接入crontab與運行驗證腳本寫好后用crontab -e編輯定時任務添加一行30 2 * * * /usr/local/bin/clean_logs.sh 30 /data/app/logs /dev/null 21這表示每天凌晨2點半執(zhí)行一次第一個30是保留天數(shù)。定時任務里有一個經典坑cron執(zhí)行環(huán)境非常精簡PATH可能不包含腳本依賴的命令路徑所以腳本里的命令最好寫全路徑或者調用時顯式帶上環(huán)境。我一般習慣在腳本里固定export PATH/usr/local/bin:/usr/bin:/bin避免cron環(huán)境下找不到命令。先手動執(zhí)行一遍確認退出碼為0再檢查CLEAN_LOG里有沒有正常記錄。然后用find手動驗證一下過期文件確實被清理了。最后再掛cron不要寫完就直接掛上萬一有bug定時任務會在凌晨悄悄幫你放大問題。6. 調試技巧與高頻避坑速查6.1 調試三板斧bash -x、set -x、關鍵節(jié)點輸出shell腳本出了問題怎么排查我用得最多的方法是bash -x script.sh直接以調試模式運行。這個模式下每條命令執(zhí)行前都會把展開后的實際命令打印到標準錯誤前面帶一個加號??吹郊犹柡竺娴膶嶋H命令就能立刻發(fā)現(xiàn)變量展開是不是符合預期、某條命令是不是被拆成了兩條。比如變量沒加引號導致參數(shù)分裂在-x模式下會非常直觀地看到命令參數(shù)被拆開。腳本內部也可以用set -x開、set x關把調試范圍限制在某個區(qū)間echo 開始調試 set -x rm -f $file set x echo 調試結束這樣做可以避免整個腳本的輸出被調試信息淹沒。還有一種低技術含量但極有效的方法在關鍵節(jié)點加echo輸出。變量賦值后、分支進入前、循環(huán)每次迭代時各打一行帶標記的輸出比如echo DEBUG: file$file, count$count。配合bash -x基本能定位九成的邏輯問題。再有就是trap echo line:$LINENO, ret$? ERR每行出錯時自動打印行號和退出碼。這個對定位到底哪條命令掛了特別有幫助。需要留意ERR觸發(fā)和set -e、命令返回非零等條件有依賴關系實際使用中配合bash -x效果更好。6.2 高頻錯誤對照速查我整理了平時答疑時遇到最多的問題做成一個速查表能省不少排查時間。現(xiàn)象常見原因解決辦法執(zhí)行腳本提示Permission denied沒有執(zhí)行權限chmod x script.sh能執(zhí)行但報command not found文件名含特殊字符或CRLF換行用file查看格式dos2unix轉換變量值不對多出奇怪內容未加雙引號被shell分詞或擴展變量引用一律加雙引號if判斷總是走false方括號左右缺空格[ $a $b ]每個地方留空格循環(huán)后變量值沒變子shell邊界問題改用重定向或進程替換整數(shù)比較報語法錯誤用了 而不是-gt -lt數(shù)值比較用-eq -ne -gt -ltrm在某些文件上報參數(shù)過多find結果過多導致參數(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)境里編輯腳本、或者給編輯器設置好換行符的習慣能從根上避開這個問題。6.3 隱蔽風險rm -rf、通配符展開、eval與臨時文件shell腳本因為可以直接執(zhí)行任意系統(tǒng)命令安全上的坑比其他語言更需要警惕。首當其沖的是rm -rf這類危險命令。如果變量沒設置好rm -rf $dir/里的dir是空字符串就會變成rm -rf /后果不堪設想。我的習慣是凡是涉及rm -rf先用[ -n $dir ]校驗變量非空再用set -u兜底并且在執(zhí)行前echo出完整命令供人工檢查。雖然這次寫的清理腳本用的是rm -f不帶-r但任何刪除操作都值得同樣的謹慎。另一個隱蔽風險是變量里的通配符展開。如果文件名里帶有*號不加引號的使用會把星號按通配符展開可能展開成一堆文件路徑。這個問題在讀取外部數(shù)據來源時尤其值得注意外部數(shù)據不可信你的引號就是防線。凡是對變量內容不確定默認加雙引號這一條能擋住一大片問題。eval命令要盡量少用。eval會先把字符串拼接成命令再執(zhí)行等于允許外部輸入直接變成命令注入風險極高。在我處理的場景中絕大多數(shù)eval需求都可以通過關聯(lián)數(shù)組、case分支或函數(shù)映射解決沒有必要用eval。如果你確實繞不開至少確保eval的參數(shù)完全由腳本內部受控內容構成絕不讓外部輸入直接進eval。臨時文件的安全也要注意。腳本里別用固定的/tmp/my_temp_file這種路徑多個實例同時跑會互相覆蓋別人也可能猜到路徑做手腳。統(tǒng)一用mktemp或mktemp -d生成隨機路徑用完配合trap清理。關于腳本安全我的總原則是輸入嚴格校驗、輸出路徑明確、權限最小化、危險操作前置檢查。這些習慣不復雜但能在關鍵時候把損失控制住。7. 腳本長期維護的幾點習慣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ù)的輸入輸出說明、以及關鍵代碼行中為什么不這樣寫的說明值得認真寫。我最重視的是為什么的注釋一行代碼解釋不了為什么需要這段邏輯而這里不直接用rm是因為...這種注釋能幫半年后的自己快速回憶當初的決策。版本管理方面哪怕只是個人腳本也建議納入git。腳本會不斷演進能回溯每一次改動、看到什么時候改了什么排查線上問題時價值巨大。如果嫌每次提交麻煩可以只在腳本改動達到一定規(guī)模時提交但至少要保留一份修訂記錄比如在文件頭加一行修改歷史2024-01-01 增加磁盤水位檢查。我在自己的環(huán)境里是喜歡都用git管理的腳本庫一個倉庫分支按環(huán)境區(qū)分發(fā)布用標簽。長期下來腳本庫從一坨快看不懂的文件變成了有歷史有說明的工具集維護成本明顯下降。7.2 冪等設計與鎖文件好的腳本應該可以重復運行而不產生壞結果這叫做冪等性。舉例說初始化目錄的腳本mkdir -p /data/app/logs無論執(zhí)行多少次都不報錯但如果是清空目錄的腳本不加判斷跑兩遍可能就刪掉了不該刪的東西。設計腳本時問自己一個問題同一個腳本跑兩遍、跑十遍結果應該一樣嗎如果答案應該是一樣那就要確保關鍵步驟是冪等的。常見做法包括創(chuàng)建目錄用mkdir -p而不是先判斷再加mkdir寫文件前先檢查是否已存在或先備份刪除操作前先確認目標存在且符合預期涉及狀態(tài)變更的步驟用鎖文件避免重復執(zhí)行。鎖文件可以簡單用flock實現(xiàn)exec 9${script_dir}/.lock flock -n 9 || { echo 腳本已在運行; exit 1; }這樣能防止同一個腳本并發(fā)執(zhí)行互相干擾。定時任務和手動任務指向同一個腳本時這種做法尤其重要。7.3 寫給下一個自己最后聊點個人的體會。腳本這行功夫不是把語法背熟就完了真正值錢的是踩坑之后的判斷力知道什么場景該寫腳本、什么場景不該上知道哪幾行代碼在運行時最容易出問題知道出問題后第一步應該看哪里。這些能力沒有捷徑就是多寫多踩多總結。我現(xiàn)在的習慣是每次踩到一個不常見的坑就在自己的筆記里記一筆包括現(xiàn)象、原因、解決過程。久而久之這本筆記就變成了自己的排障字典。這也正是我寫這第十六篇筆記的初衷很多經驗不記下來三個月后我可能還是得靠重新踩坑才能想起來。如果你剛開始學shell腳本我的建議很樸素從改造自己昨天手工敲過的命令開始今天把它寫成腳本明天給腳本加參數(shù)和錯誤處理后天再試著用函數(shù)重構一遍。不用特意去找復雜案例你日常的重復勞動就是最好的練習題。一次把一個小的需求做扎實腳本能力就是這么積累起來的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美强奸乱| 99无码狠狠久久| 8x福利精品第一福利视频导航| 亚洲日本韩国极品一区二区| 亚洲国产精品9999在线观看| 黑人在线91| 欧美色棕合| 中国一级特黄大片护士| 亚洲激情网一二三四区| 久草综合网| 国产按摩一区二区三区| 国产一级137片内射麻豆| 东北女人操比视频| 人人澡人人爽人人精品| 国产一级αv免费看片| 超碰97中文| 久久精品99久久久久久| 美女大乳久久久久久久女人18| 国产欧美岛国精品一区| 国产JDAV无码视频在线观看| …亚洲黄色厕厕女女在线播…| 国产极品久久久| 啊啊啊操一区| 欧美一区二区三区成人性生活| 91在线精品| 人人摸人人舔一区二区| 97干在线| 人妻一区二区三区视频| julia国产在线 | 久操在97| 91久久久老司机| 欧亚乱色熟一区二区三四区| 熟妇艹鸡八| 99热97| 天天爽夜夜操| 日本精品88888888| 免费网色网站| 亚洲欧美日韩电影网站一区 | 亚洲综合在线高清| 天天上日日上日韩精品| 青青草在线视频欧美| 五月天开心网| 97综合日韩| 清清一区二区三区四区不卡视频| 久久久久中出| 97精品久久久久中文字幕| 熟女AV一区| 色欧洲97| 17c嫩草51久久91嫩草| 国产福利av精彩对白| 日本高清免费一本视频在线观看| 中国乱伦一区二区| 国产精品成久久久久午夜午夜| 丁香婷婷激情五月天无毒不卡| 亚洲国产一区二区入口| 久久无码一区二区二三区性色| 久久久久久九九九九| 四虎国产精品永久入口| 精品午夜福利国产一区二区在线观看 | 成人无遮挡毛片免费看| 日本顶级天天操狠狠操夜夜操中文字幕| 99re3这里只有精品| 欧美大干日韩| 婷婷久月| 欧美精品久久96人妻无码| 涩涩久久精品| 欧美黄色片在线播放| www.婷婷| 精品国产a∨一区天美传媒| 欧美一二三级精品在线| 1024亚洲中文字幕久在线看片你懂的| 91路www| 蜜臀一区二区三区在线 | 青娱乐日韩无码| 操我啊啊啊啊啊| 天天影视综合色| 999精品国产高清一区二区| 青青草久久| 超清福利精品视频在线| AND人妻系列| 欧洲自拍色图gif在线| 天综合中文| 香蕉久久精品| 看日韩美女二区三区免费操逼视频 | 久久久久久亚洲Av无码| 秋霞色色影院| 91大神精品长腿在线观看网站| 国产剧情AV不卡在线观看| 欧美一级欧美三级在线观看| 色婷婷国产精品一区在线观看| 欧美1727免费观看视频| 欲综合网| 亚州综合电影| 欧美性爱视频免费一区一A| 蜜臀在线看片| 97香焦色区| 欧美片第一页| 亚洲美腿丝袜香蕉影视欧美成人| 五月激情影院| 亚洲日韩乱码中文无码蜜桃臀网站| 精精品人妻一区二区三区| 九久9精品| 岛国片在线播放| 国产精品天干天干综合网麻豆 | 亚洲五区熟女| 成人日韩欧美| 国产AV激情无码久久无码| 亚洲性感丝袜诱惑在线观看| www四虎| 乱伦图av| 国产探花日韩援交| 蜜屁av| 91美女在线视频| 青青草吊丝| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 久久男人的天堂| 欧美熟女妇同| 欧美18禁91| 日本三级日本三级99| 97色在线视频| 成人三级片一区二区三区视频| 99精品网站| 狠狠中文字幕| 久久国色天香香蕉| 亚州成人A√| 日韩三级一区| 欧美国产日韩清纯唯美| 激情文学网伊人| 香蕉久久AⅤ...| 色激情综合网站| 亚洲猛交| 亚洲中文字幕精品一区| 日韩无码极品| 少妇内射视频| 丁香激情网| 久久久久亚洲Av无码专区老牛影视| 91蜜臀在线久久久久| 粉嫩在线一区二区懂色| 日本精品高清一二区一本到| 日韩激情啪啪| 婷婷五月成人| 青青草字幕AV| 精品乱码在线观看| 大干人妻| 极品肉射| 日本欧美韩国国产在线| 偷拍自拍在线视频观看| 色婷视频| 久久久久久久久久久999| 精品一区二区三区四区外站| 国产精品丝袜在线| 人妻一区二区三区视频| 男男H黄动漫啪啪无遮挡网站| 久操视频资源站公开| 丁香五月影院| 精品无码一二三四区| 九草九九九| 97色亚洲| 九九九九日本| 激情文学小说一区二区 | 日本免费一区二| 极品色电影院| 亚洲欧美洲综合| 91三级理论片播放器| 国模艳艳啪啪一区| 天天弄欧美| 91亚洲最新在线| 青青免费在线视频一区| 熟妇在线视频一区二区| 91视频伊人| 亚洲人妻AV| 性色一线| 96麻豆精品一区二区三区| 欧美精品23| 成人看片网站| 久久久久99999| 岛国黄色大片网站| 人人噜夜夜操| 中文字幕乱码人妻二区三区| 美女尤物福利视频| 超碰97国产欧美| 国产福利小视频高清在线观看| 久久9精品视频| 狠狠色狠狠色狠狠五月| 午夜福利在线合集| A 在线网址| 天天干天天日天天射黄色片| 国产一级不卡在线观看| AV色图| 欧美人人曰人人操人人射射 | 国产夫妻一区二区| 国产一级137片内射麻豆| 欧美女同在线| 中文字幕丝袜人妻| 成人开心网在线视频 | av在线一区二区三区| 国产青青美女玩逼视频| 操逼操操操91| 视频不卡中文字幕| 蜜臀久久久| 亚洲无吗在线视频| 婷婷综合伊人一区| 欧美天堂亚洲电影院一区在线播放| 精品少妇人妻av久久免费| 国产成人主播| 日日夜夜干| 国产福利电影| 96精品久久| 亚洲免费成人精品电影| 超碰色97| 五月丁香婷婷综合| 成人看片网站| 国产91亚洲精品一区二区三区| 色诱中文字幕| 婷婷五月色| 久久久精品91八戒| 久久免费少妇| 99黄页网站| 日本欧美国内在线| ,成人免费啪啪视频| 欧州一区二区三区四区| 久久五十路熟女人妻| 日韩乱伦影音先锋| 在线中文AV| 天堂精品在线| 可以看的av| 殴美在线AⅤ| 超碰免费人妻人人| 秋霞免费无码视频日韩A片| 欧洲亚洲人妻无码高清久久三区四区| 久久超碰、| 26uuu性| 超清中文乱码字幕| 黑人猛交| 亚洲成a人v欧美综合天堂下载| 玖色av| 91在线一起| 我想要啊 啊 啊| 色九九综合AV| 97国产精品在线观看| 中文字幕一品色图| 性一级黄色录像片网站导航| 96超碰网| 秋霞一集毛片观看| 秋霞久久亚洲精品成人| 操逼逼福利视频| 婷婷丁香五月天亚洲天堂网| 国产精品一区二区 尿失禁| 亚洲最新中文字幕免费| 九月婷婷| 欧美九九爱| 97高清啪啪| 黄色高清久久无码依人| 青青欧洲黑| 久久久久极品| 伊人一区二区在线播放| 国产综合永久精品日韩鬼片| 水野优香在线观看| 97在线资源| 女人天堂av在线播放| 亚洲欧美综合图片| av网站在线观看了| 开心五月婷婷| 欧美日韩人妻少妇 一区二区三区| 亚洲AV色图一区| 亚洲本色精品一区二区久久| 国产精品点击进入在线影院| 夜夜操2028| 中文字幕AV片| 国产不良强奸视频免费看| 大地资源在线观看中文第二页| 91一区二区| 啊啊啊久久久视频| 国产黄片精品在线| 久久久久久久久久久999| 熟妇人妻精品一区二区| 亚洲精品精品一区二区| 嗯嗯嗯啊啊啊干死我吧| 亚洲图片日本AⅤ欧美在线| 丁香五月av| 老妇女91| 九九综合九九综合| 日欧操屄视频| 操老熟女AV| 精品区9| 18+91网站| 亚洲春色欧美激情自拍| 精品九九| 亚洲人妻av| 美女爽到高潮91| 日韩亚洲Av人人夜夜澡人人爽| 九九九久久久久| 13小男生GAY自慰脱裤子| 五月天婷婷欧美三区| 亚洲在钱| 五月色综合| 精品日日人妻| 大香蕉天天看妹子| 亚州一区二区成人片免费| 人妻在线大香蕉| 亚欧日韩成人| 这里只有精品97| 91视频国品一二三区| 久久免费少妇| 精品99999久久久久久| 欧美v日韩v亚洲v最新在线| 人妻天堂综合网| 极品国产内射| 9久9久| 啊啊啊啊网站| 1769一区| 四虎影视永久在线观看精品免费网站| 欧美色性爱| 国产精品网站www| 熟妇人妻精品一区二区| 亚洲最大的综合性av| 91欧美美女日韩国产婷婷| 亚洲国产一级黄色视频| 欧美日韩亚洲五月天婷婷| 一级片在线观看高清无码| 在线天堂999| 亚洲精品一二牛牛| 久偷拍欧美日韩三区| 亚洲欧洲网站免费观看| 诱惑网综合| 青青草在线视频人人想人人上| 国产无码精品无码| 日本熟妇自慰性高潮一区二区三区| 91free福利| 国产精品视频在线观看| 国产成人主播| 人人操AV| 国产日逼视频| 男人的天堂2018| 欧美综合第一| 久久久久久精品免费看A级| 男人的天堂com| 久久有码| 青青国产精品在线| 久久激情综合| 大香蕉专区| 天天噜| 亚洲 欧美 综合 91| 欧洲一区二区| 色五月69夫妻| 日本高清有码网址视频| 欧美操人视频| 熟妇一区二区| 国产在线激情| 狠狠97| 97精品国产手机| 性爱久久| 欧美夜夜狠| 亚洲午夜福利在线影院| 中文字幕一区二区日韩网| 蜜臀久久久99久久久久 | 美欧老女人97| 欧美性色综合网| 五月婷婷综合在线| 欧美日韩性爱视屏免费看了| 久操com| 中文字幕蜜乳av| 久久精品操| 久久狠狠色噜噜狠狠狠狠97| 国产原创精品| 日本东京热加勒比久久| 草草电影院| 亚洲情色 自拍| 操逼无毒无码免费视频| 欧美熟女丝袜| 伊人991| 乱理日韩中文| 91在线美女| 天天流夜夜操| 蜜桃色色网站视频三区| 久久久精品,3| 中国黑人三级片网站上区| 亚洲黑丝在线| 丰满欧美少妇| 顶级少妇BT天堂| 青青青操| 1区2区3区中文字幕日韩| 久久精品亚洲婷婷| 午夜啊啊啊| 不卡九肏| 97玖玖超碰| 天天综合有色网| 91偷拍欧美亚洲| 天天插天天舔舔天天干| 爆乳免费黄网站| 蜜桃中文字日产乱幕4区| 97舔舔| 精品久久久九九九孕妇| 大香蕉伊人亚洲| 嫩草 人人网精品| 久草男人天堂| 激情文学小说一区二区| 蜜臀99精品国产高清在线观看| 亚洲无码一区成人免费午夜| 天天综合网网欲色| 久久久国产av美女私房| 欧美性爱中文字幕无线码| 色伊人91| 五月激情影院| 亚洲情色一区三区| 尤物AV免费网站| 国产女人视频三四五区| 日韩免费看在线黄色片| 久久99精品视频| 黄页18禁| 天天爱综合网| 久久人妻| 多乙久久久久久| 色妺妺在线视频| 日本 免费 一区二区三区 久久香蕉 | 亚洲色偷偷色噜噜狠狠99网| 亚洲色9| 果冻传媒A片一二三区 | 婷婷五月天小说| 美女露胸露奶头| 欧美玖玖爱免费玖玖| 国产精品日日摸天天碰| 无码动漫av中文字幕| 嗯啊抽插大香蕉网页| 亚洲激情网| 九九英色视频| 羞涩视频| 中文自拍欧美影视| 久热精品色情| 久热一区二区| 国产女生在线| 欧美少妇高潮久久91| 亚洲欧美黄| 亚洲av影音先锋| oumeisetu综合| 操淫穴亚洲五月丁香| 欧美色宗合| 色情乱伦AV| 女一区二区| 91熟女丨老女人| 岛国视频一二三区| 一区黄二区黄| juliaann丝袜| 在线国产探花| 精吧天堂| 在线观看亚洲专区| 久久曰曰| www亚洲免费| 中日无幕一二三四区| 欧美在线|亚洲| jk白丝没脱就开始啪啪| 乱码熟妇人妻久久久| 精品久久久久久久| 成人夜夜爽| 久久久久久人| 国内毛片无码一级毛片| 欧美熟女逼久久久久久| 免费公开人人操| 成人日本精品九区| 欧美精品久久久久久久丰满| 亚洲欧美另类少妇精品| 日本操逼无码| 欧美 亚洲 制服 精品| 久久大香蕉97| 五月婷色| 97超碰欧美精品| 99热在线观看| 97干在线| 久久久久ab| 波多野结衣AV无码一区| 国产熟女一区二区丰满| 精品欧美А∨无码黑人大荫蒂| 色老汉色| 国产99久久99热这里只有精品15 | 你懂的在线观看区国产| 女人妻一区| 久久精品国产亚洲5555| 天堂资源欧美| 国产精品999zyz| 激情黄色五月天| 欧美人妻一区| 久艹免费| 天天操女人| 在线观看亚洲成人精品| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 色就色综合| 亚洲蜜臀懂色| 欧美一级黄片视频在线| 99热日| 两性综合网| 欧美日韩不卡传媒| 狼人综合婷婷激情四射 | 亚洲日韩成人性爱视频| 少妇蹲下露出大唇5| 欧美后进式| 无码不卡八戒| 久久是精品| 爱爱60秒免费视频| 草莓精品视频在线免费观看| 国产九九九九九九| 色哟哟的毛片| 欧美的性爱网站免费| 九九九精品一区二区无码| 久久久久久AV无码免费网站| 国产精品熟女一区二区三区| 亚洲91网。| 国产精品69人妻无码久久久| 三级色影综合网| 人妻一区二区三区| 久久久com| 热思思免费视频| 91亚洲欧美综合高清在线| 97电影院超碰| 国产色呦呦| 色综合av综合久久| 青青草一本道福利视频| 亚洲视频一二区| 尹人大香蕉视频在线| 国产操伦| 好色综合| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 在线黄色污污网站| 亚洲夜色在线| 熟女突然公开看18禁影片| 国产黄色剧情影片麻豆免费播放| 日本熟妇自慰性高潮一区二区三区| 999久久久九| 国产亚洲精品自在线亚洲情侣| 无码一区免费在线不卡| 天天久久| 亚洲素人综合| 约操熟妇| 999综合网| 91超碰碰在线| 69综合网| 淫淫总合网| 探花激情视频| 一区二区三区免费岛国片| 国产精品点击进入在线影院高清| 欧美成人精品一区二区男人蜜臀 | 亚洲第一男人天堂| 亚州综合图片| 欧美日韩亚洲五月天婷婷| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 婷婷15月天青娱乐| 精品国产72| 久久久久9久久久久| 超碰在线99| www.久久久久| 9色在线| 久久久夜夜嗨免费视频| 丰满人妻av一区二区三区| 精品国产人成在线| 国产中文字幕曰本毛片| 人人插人人摸人人| 久草免费在线一区二区| 天天躁日日躁XXXXYY| 久久九九视频九九视频| 国产精品成人无码av无码免费| 日韩Va亚洲va欧美Ⅴa久久| 日韩欧美午夜一区二区| 又粗又长又爽在线观看| 日本操色导航| 日韩成人性爱电影在线播放| 牛黄色久午久| 五月天开心网| 亚洲不卡不卡中文字幕不卡 | 男人把坤坤插入女人的下体| 60秒免费视频| 色97欧美| 天天日天天干天天操| 中英熟女操女| 国产一进一出视频网站| 黄片无码在线制服| 婷婷尹人大香蕉免费| 美女诱惑1区2区| 国产AV天美| 国产情色第一第二页在线观看| 天天草AV| 天天天肏屄肏屄肏屄欧美欧美| 欧美黄业| 在线看的av| 99啪啪视频| 玖玖人人爱| 99色婷婷中文字幕乱色| 亚洲综合色在线| 五月天亚洲色图| 中文字幕AV乱伦| 精品性爱一区二区| 日韩欧美麻豆大片| 精品国产久久乱码| 亚洲色宗合| 狼狼色丁香久久婷婷综合五月 | 九九九久久久W精品| 欧美中出| 婷婷五月天激情网| 麻豆黄色五月天| 欧美激情精品久久久| 97精品免费视频网站| 欧美亚洲一级在线观看| 色五月亚洲| 97一区二区三区视频| 老熟女综合网| av绯色| 蜜臀久久久久久999| 亚洲综合一| 曰韩中文人妻视频| JULIA一区二区三区在线播放| 九九无码久久精品视频| 久久久久久无码人妻中文字幕| 大香蕉欧美| 欧美丰满熟妇XXXX性ppX人交| 色婷婷在线视频精品导航| 十八禁电影伊人网| 无码人妻一区二区三区色欲aⅴ | 夜草欧美| 亚洲乱码精品一区二区| www.99在线| 91天射| 网站A V在线| av东京热男人的天堂| 欧美美女自慰一区二区三区| 夜夜操av亚洲一区二区| 国语精品对白| 亚洲最大AV网| 91少妇香蕉久久精品| 久久做97| 999国产精品999久久久久久| 精品人妻av在线播放| 色女网日韩| 亚洲女人91| 国产精品自产拍在线观看社区| 亚洲男人的天堂AV| 2025年A片视频精品| 嗯啊不要在线| 人妻精品一区二区| www.婷婷五月天| 91天美免费| 中文久久爆乳| 热热色AV| 欧美很很操视频| 激情内射| 91色久| 亚洲国产青青| 欧美操逼熟女| 中文字幕精品丝袜| 上特色A在线| 国产精品成人无码av无码免费| 欧美美女啪啪视频| 亚洲影院无码在线| 少妇500双飞99| 午夜视频黄| 精品国产99| 嫩呦国产一区二区三区AV| 久操操| 国产高清无码一区三区二区| 日韩精品人妻中文字有码在线| 天天操夜夜操狠很操| 国产白丝在线| 日韩欧美俄罗斯A片| 精品熟妇视频一区二区| 97人人射| 欧美狠狠干| 日少妇亚洲版| 狠狠中文字幕| 疯操AV| 亚洲不卡AV在线| 亚洲动态色图| 亚洲免费97免费| 亚洲制服aⅴ中文字幕| 欧美人妻熟女在线| 亚州宗合另类| 国产美女裸体秘 永久无遮挡| 亚洲天天影视综合网| 亚洲第一无码播放立川理惠| 欧美色97| 一区二区精品更新提醒| 精品亚洲国产成人精品| 久草看看看| 超碰97资源中文字幕| 亚州操逼图| 校园春色AV天堂| 亚洲射综合网| 亚洲欧洲网站免费观看| 日韩无码极品| 伦理日韩国产久久| 懂色AV一区二区三区| 曰韩操B| 三级色影综合网| 久草资源欧美在线视频| 999国产精品999| 亚洲美女AV无码| 伊人亚洲综合| 91青视频| 99自拍视频在线| 久久免费99精品久久久久久| AV女资源| 欧美综合网1| 91人妻爽爽人人做人人澡| 国产亚洲精品久久久久小| 97神马久久| 天天干人妻| 俺去久久| 四色永久成人网站| www.久久最新地址| 熟妇乱伦一区二区| 日本2020一区二区| 亚洲日产专区婷婷| 欧美激情亚洲色图| 激情五月天丁香| 在线观看亚洲专区| 无码区蜜乳| 日韩精品-原创伙伴| 2026国产精品视频| 91精品国产综合久久久蜜臀| 97精品在线视频| 蜜臀久久久国产| 欧美另类色| 五月婷婷激情网| 男人a天堂手机在线版| 91精品国产91久久福利| 欧美亚洲特P| 少妇久久久免费| 国产肏屁眼视频| 97视频网站在线观看| 97人人射| 99热自拍| 97综合在线| 欧美大战久久久伊人| 九久久九精品视频| 久久久999日本大片| AV中文在线| 亚洲色久| 久久99综合| 超碰人人在线| 天天躁日日躁AAAXX| 日韩欧美字幕亚洲一区二区| jizzjizz欧美| 亚洲成人福利电影免费| 久草免费福利在线播放| 亚洲最大成人a毛毛片| 日韩中文字幕精品一区在线| 亚洲图片色图欧美另类| 国产精品4p在线观看| 日韩激情无码影院| 欧美性爱18观看| 啪啪啪东京| 男人高清无码一区二区| 殴美大黄片| 热九九精品| 91人妻爽爽人人做人人澡| 口爆综合网| 亚洲最大黄网| 欧美中字二区| 国产精品乱码久久久、久久| 91久热| 俞拍久久国应视频| 在线日韩日本亚洲国产| 国产综合在线视频网站| 欧美色性爱| 亚洲色诱惑| 97超碰国产亚洲精品资源| 日韩美女久久一区二区三区| 超碰99热中文字幕| 欧美青青草视频| 欧美情色亚洲| 国产精品久久久啊| 久操网视频| 91超级碰| 一区二区三区蜜桃成人撸久久东京热| 老司机免费视频在线91| 日韩有码回春沙龙第一页| 久久久不卡| 久久久久久人妻一区精品色欧美| 大香蕉强奸乱伦| 99这里有精品| 日本欧美色| 久久久极品| 精品国产无码中文| 午夜一区| 嗯嗯啊啊好疼| 欧美性爱超碰97| 日本三级A片网站com| 狼人久草| 97精品综合久久网| 丰满人妻一区二区三区免费 | 欧美日韩欧美| 人人做天天爱| 丁香五月天激情综合| 东北女人的毛片| AV中文字幕三四五| 操逼天美3区| 久久老子无码午夜伦不卡| 九九九九九九九九九五码| 欧美偷偷网| 黄片免费日韩| 精品一二三区久久AAA片| 九九热精品免费视频| 屁股久久久久久久久| 亚洲综合另类| 人人色人人操在线| 啊操爽品善一区二区三区| 97久久久久| 91成人久久| 亚洲综合网图| 精品人妻一区二区三区四区| 欧美天天干| 青青爽| 蜜汁欧美| 另类 日韩 熟女| 精品国产99| 亚洲欧美色图片| 激情看片网站| 青青草久久在线| 被窝影院午夜看片无码| 国产精品一二三区福利| 另类图片五月天| 一区二区三区黄色片a| 97资源超碰| 亚洲男人天堂AV| 综合激情五月丁香| 久热精品在线| 日韩中文字幕视频在线观看| 蜜桃丰满熟妇av无码区不卡| 8x福利精品第一福利视频导航 | 夜夜青青无码影院| 国产精品麻豆免费视频| 高树玛利亚无码流出| 在线综合网| 国产精品女同| 少妇久久久久久久久| 五月天开心网| 亚洲久9| 夜夜操二区| 久久无码精品| 精品久久久久久亚洲| 欧美日韩精品久久久久久久久东北老熟妇| 伊人久久艹| 日本在线999| 99只有精品| 啊啊啊啊好多水| 欧美性猛交美女自慰91| 五月亭亭六月丁香| 日本一区二区三区欧美日韩中文字幕| 久久男人的天堂| 亚洲一区二区三区麻豆传媒| 搡老熟女免费视频| 秋霞午夜视频一区二区| 无码国产Av| 国产熟女自拍| 色色婷| 精品视频一区二区| 久久鲁夜| 青娱乐久久艹| 成人性交午夜免费片| 亚洲av夫妻操穴网| AV麻豆免费一区| 青青欧美| 后入日本1234| 久久99热这里只频精品6学生| 91人妻少妇| 97资源欧美| 乱伦3P视频| 78超碰| 精品亚洲俞拍视频一区| 强奸乱伦大香蕉网| 熟女人妻一区二区三区免费看| 亚洲aw毛茸茸在线 | 啊啊啊97视频| 抽插无码高清一区| 97在线观看| 成人十八禁日韩欧美一二三| 青青草原成人| 国产一级内射无挡观看| 日本不卡免费二区| 日韩精品区二区三区不卡| 欧美18 在线观看| 青青操视频在线| 男人的天堂2010| 东京热视频网| 中国和日本人色哪个不下载能放| 日本亚洲vr欧美不卡高清专区| 久久东京伊人一本到鬼色| 一本色道久久综合精品婷婷| 日日A∨| 国产女人91精品嗷嗷嗷嗷| 91天天综合| 欧美女同在线| 五月天久久婷婷亚洲 | 五月天啪啪| 天天躁日日躁成人字幕aⅴ| 啊啊啊水好多| 国产25页| 欧美日韩99精品麻豆传媒| 国产91乱伦| 超碰午夜| 校园春色亚洲色图| 91网站18+| 东北女人| 色噜噜人妻av 中文字幕| 乱伦系列一区二区| 蜜乳AV.COM| 天天干天天操天天操夜夜操天天操| 日韩中文字幕宗合在线| 老熟女91av| 九九热在线视频| 中文字幕123| 天天操人人操狠狠插| 亚洲精品九九九| 91综合天天看| 丝袜色综合| 97超碰人人操人人操| 男人的天堂VA| 青青草国产一区二区三区| 日韩中文字幕av在线播放| 国产剧情一区在线观看| 久久99久久99精品免视看婷婷| 丰满人妻无码一区二区三区| 国产呦精品系列在线观看| 91精品导航| 久久久一二三四区| 色香综合天天影视综合| 精品国产国产AV| 91网站18在线| 欧美高潮在线| 色老汉色| 91伊人影视综合| 久久伊人网视频一区二区三区| 天堂蜜桃无码视频一区二区| 99在线精品视频| 9999久久久久| 婷色五月天| 人妻中文在线| 激情综合色| 色噜噜狠狠色综无码久久合欧美| 99综合网| 男人天堂2019亚洲| 久久婷婷色综合一区二区三区| 天天做天天爽| 欧美日韩夜夜| 大香蕉综合| 超碰天天久久79| 精品999日本| 色眯眯av| 嗯嗯嗯啊啊在线观看| 久久久999国产精品| 97久久超碰日韩精品| 久草这里只有精品| 国产精品国产精品国产| 成人毛片免费| 免费啪啪av| 一区二区三区探花在线观看| 亚洲九月丁香| 狠狠干,狠狠操| 麻豆天美电影一区二区| 大香蕉 222| 欧美情色贴图| 伊人嫩草| 91欧美亚洲| 国产又色又粗又黄又爽| www.91理论| 在线不卡视频| 久久久久久久久久久人妻| 欧美日韩亚洲高清不卡一区二区三区| 福利天堂| 九九九久久久W精品| 精品九九| AV网站高清无码在线观看| 日本三级日本三级99| 欧美午夜精品久久久久久3D| 婷婷色香| 中文字幕色AV| 久久久久九九九九| 奇米狠999| 美女刺激久久国产欧美| 神马午夜久久久| 9美女超碰在线免费观看| 99无码| 色嗨嗨在线| 激情自拍 校园春色| 91高跟美女在线播放| 天堂亚洲欧美| 乱伦a片视频| 免费观看欧美日韩操逼视频| 国产精品久久久久亚洲av| WWW啪啪的com| 久久精品亚洲成a人天堂| 欧美久久九九| 色哟哟av网址| 张柏芝国产一区在线观看| www..com操老师| 男人夜色天堂ss| 久久综合久色欧美综合狠狠 | 91色欧美| 天天操天天射天天日| 91色情黑丝搞鸡在线观看一区二区三区三州 | 丝袜色综合| 亚洲一区日韩精品中文字幕| av天堂5| 欧美精品 - 91爱爱| 日韩91网站| 国产小黄片在线免费观看| 久久久不能久久久久| 日韩欧美麻豆| 日本操大逼| 97se综合网| 青青色在线观看| 极品尤物在线观看| 99re在线精品78| 日日操免费视频| 亚洲国产精品乱码在线观看| 就去色综合| 91成人久久 | 91社区拍啪人妻| 久久久穴999| 亚洲色图欧美一区二区不卡| 婷婷操逼| 久久久性少妇| α√在线| 蜜桃视频啊啊啊啊| 人人操人人操人人操人人操人人操人人人11.CM| 日韩偷拍色图| 精品视频久久| 亚洲激情综合| 亚洲综合色图欧美| 婷婷AV一区二区三区| 99re在线视频国产| 一线黄色免费性爱片| 国产白领连续中出在线播放| 91精品人妻偷情| 99热这里只有精| 搡老女人老91妇女老熟女| 五月激情小说| 97干在线视频| 国产后入精品| 亚洲色图欧美一区二区不卡| 蜜臀av一区二区三区免费观看| 东北女人高潮视频| 国产精品色色| 9118禁| 啊啊啊啊啊在线观看网址| 亚洲欧美小说| 日韩中文字幕熟妇人妻| 人妻二区| 小骚逼被操的爽不爽| 亚洲第一狼人丝袜美女另类| 午夜精品久久999热蜜桃介男人用| 干干干天天| 国产成人啪一区二区| 久久激情网| 精品对白久久不卡| 蜜桃中文字日产乱幕4区| 大二网站亚洲| 好屌色综合| A 天堂在线观看视频| 人人操超碰在线| 99re9在线| 欧美gv在线观看| 亚洲资源网| 国模精品娜娜一二三区| 亚洲熟妇A V黑人| 怡红院怡春院| 人人看欧美性爱| 超碰97.com| 欧美中文字幕男人天堂久久精品| 伊人一级免费黄片| 91女优在线观看| 日本一级一级一级一级| 91免费看一区二区三区| 综合色拍| 五月婷婷激情综合| 日本中文字幕不卡视频| 成人欧美日超碰| 婷婷99| 在线观看亚洲成人精品| 久久久精品视频欧州站| 久久久人体| 无码最新| 校园春色五月天| 国产精品密臀网在线观看| 91麻豆va国产精品| 熟女激情综合网| 密臀国产在线| 超碰人妻久久人妻中文97| wwwcaobibi| 岛国免费视频在线| 999色欧美中文字幕| 熟妇熟女一区二三区| 国产一级黄色片在线观看| 亚洲av成人精品一区| 超碰在线成人电影| 日本午夜福利视频| 久久伊人大香蕉| 尤物黄色在线观看网站| 欧美色图综合网| 日本中文字幕一区| 黄页大片在线观看| 黄色片大香蕉| 亚洲性爱电影| 少妇久久久久久| 大色网久久| 熟妇高潮精品一区二区三区下载| 天天日天天舔天天喷天天射| 丰满人妻无码一区二区三区| 最近二区三区视频大全| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 91精品丝袜久久久久久| 99精品人人爽| 91 丝袜在线| 五月婷婷色| 很很热性爱视频| 国产一级不卡在线观看| 少妇熟女1区2区3区| 欧美性暴力猛交| 男人的天堂无码| 欧美人妻色| 亚洲男人的天堂V| 曰韩精品九九无码| 我爱大香蕉| 蜜臀操逼黄色视频操的好爽| 尤物黄色在线观看网站| 男女啪啪啪18禁网站| 国产精品久久久久久久久久久久久久吹 | 激情接吻视频久久久久久| 亚洲欧洲综合成人av一区| 国产成年女黄特黄| 亚洲国产97| 亚洲高清欧美总合| 一本大道青青| 国产精品另类一区大香蕉| 天美传媒av在线| 国产妇女精品视频青青草| 天天摸天天碰天天添青青| 国产黄a三级三级三级av在线看| 狠狠色丁香| 色优久久| 日本欧美成人片AAAA| 日韩无码成人电影| 另类视频在线| 婷婷五月成人| 中文字幕一区av| 天天摸,夜夜摸| 9九九九九视频在线观看| 丁香久久| 人妻激情偷乱视频一区二区三区 | 青青草一区二区三区四| 在线小视频| 在线五区| 97人人夜| 大香蕉伊人75| 精品在线蜜臀| 老司机福利青青草| 超碰免费人妻人人| 日本十八禁免费看污网站| 熟妇的味道HD中文字幕| 欧美极品性爱天天射| 精品性爱一二三区| 99九九久久| 欧美日韩情色一区二区| 高树玛利亚无码流出|