在處理大量文件或自動化任務時,萬用字元幫助我們簡化操作,特別是處理大規模文件時,使用簡單的符號來匹配文件名稱或路徑,替代手動輸入文件名稱,讓指令更為簡潔。以下是常見的萬用字元及其應用方式:
*
(星號)列出目錄下所有 .txt 結尾的文件
ls *.txt
當需要刪除該目錄底下所有以 .tmp 為結尾的文件時,可以這樣操作:
rm *.tmp
?
(問號)匹配所有名稱為 file 開頭,並有一個任意單一字元的 .txt 文件。例如,file1.txt 和 fileA.txt 會被匹配,但 file12.txt 則不會。
ls file?.txt
[]
(中括號)以下將會匹配 file1.txt、file2.txt 和 file3.txt,但不會匹配 file4.txt。
ls file[1-3].txt
{}
(大括號)將 file1.txt、file2.txt 和 file3.txt 一次性複製到 /backup/ 目錄,提升操作的效率。
cp file{1,2,3}.txt /backup/
[^]
(排除匹配)匹配 filed.txt 和 filee.txt 等文件,因為這些文件的名稱中不包含字母 a ~ c。
ls file[^a-c].txt
*
探索文件結構*
可作為 ls
的替代方案。列出當前目錄下的所有文件和子目錄
ls *
將所有子目錄中的文件一併列出
ls ./*/*
$_
$_
,該變數保存了上一個命令的最後一個參數。假設上一個指令執行了 ls *
,$_
將會保存最後一個文件名稱,我們可以對其進行後續操作。
echo $_
想從文件名 file.txt 中提取首字母 f,可以透過以下指令。從變數 $_
的值中提取出第一個字元(即 f)。同樣的,可以逐步提取文件名稱中的字元,進行進一步的操作。
${_:0:1}
知道萬用字元的好用之處後,進入到 Lab 進行今天練習吧 ~
Lab - SansAlpha
使用題目給的資訊 ssh 連線進入到環境後,發現是一個可以輸入指令但不多的地方。一些基本的指令都被 ban,系統不認這些指令
開始想辦法利用其他輸入來達到像是 cd
、cat
的效果。運用前面提到的萬用字元 *
試試,給出了新的東西 blargh
再試試 */*
看有什麼效果,blargh
是一個檔案夾,裡面有 flag.txt
,但我們沒辦法讀取他的內容
使用前面說的 $_
,來看看上一個指令執行 *
時,究竟最後一個參數是什麼。結果是一個名為 on-calastran.txt
的文件
這邊參考 Parameter Expansion
的操作,從on-calastran.txt
提取出我們想要的字元,拼湊出 cat
看可不可以就由他印出 flag
${_:0:1}
-> {參數:字元位置:字元個數}
所以${_:3:1}
將抓取出on-calastran.txt
的字元c
依此類推,找出 a
跟 t
,接著搭配剛剛我們使用 */
切換到下一層目錄,進而印出 flag
${_:3:1}${_:4:1}${_:8:1} */*
今天的練習就到這邊,以下是參考資料,請搭配服用:
wildcard character
launch bash without using any letters
Shell Parameter Expansion
取得 shell 上一次命令的參數
內文如有錯誤,還請不吝指教~