資安筆記 - Linux 指令與使用 I

白龍 Lv3

文章目標

  • 了解終端機與操作
  • 了解目錄架構與意義
  • 了解指令的語法架構
  • 指令介紹與語法查詢
  • 各式基本檔案目錄操作指令

Linux 控制台

終端機是一個讓使用者與電腦溝通的文字視窗,因叫做Console

Unix提供的視同時多使用者的console,而Linux則是提供多個虛擬的console

Terminal 終端機

與控制台不同,終端機會連上網路,就像是ssh指令

 

!不同的是

指令筆記

1. 虛擬終端機切換與登出指令

切換虛擬機畫面

  • 桌面板使用方式:

    • 透過 Alt + F3 ~ F6 切換終端機,F1 為登出,F2 為關閉終端機
    • Server 版可以使用更多的功能鍵來切換
  • 指令切換終端機:chvt <使用者>

  • 查看當前終端機:tty

登出指令

  • exit, logout, Ctrl+D

關機指令

  • poweroff
  • halt --poweroff
  • shutdown -h <time>
    • 指定時間關機 shutdown -h <數值>
    • 取消關機指令 shutdown -c

重新開機指令

  • reboot
  • halt --reboot
  • shutdown -r <time>(指定時間重啟)

注意:
所有 shutdown 指令可以加入後方參數設定執行等待時間。

2. 指令結構

  • 完整指令格式:<command> <option> <Arguments>

範例表格

COMMAND [OPTIONS] [ARGUMENTS]
ls Long options Path: /etc/inittable/
cd --now Parameter: 105
pwd --add Data: "ASWWDCD"
date Short options
who -n
cat -a
echo

3. 系統與日期時間指令

日曆指令 cal

  • 用法:cal <month> <year>
  • 有時需要先安裝:apt install ncal

顯示文字指令 echo

  • 用法:echo "Hello!"

時間指令 date

  • 基本用法:date
    • 顯示範例:September 24 09:13:49 CTS 2019
  • 指定格式:date +%x
    • 顯示範例:9/30/2024
  • 複雜格式:date "+%A, %B %u, %Y"
    • 顯示範例:Monday, September 30, 2024

4. 幫助指令

  • help
  • man <指令> / info <指令>
    • 開啟指令的詳細說明,範例:
      • man sudo
      • man cal
      • man tty
  • --help
    • 在任何指令後方加入 --help 來顯示該指令的幫助訊息
    • 可以搭配 | less 分頁瀏覽

5. 終端畫面管理

清除指令

  • clear / reset / tset
    • 清理當前終端畫面

6. 目錄與檔案管理指令

查看當前目錄 pwd

  • 顯示當前資料夾的絕對路徑

顯示當前位置的資料夾 ls

  • 基本用法:ls
  • 加入以下 option 可以有不同效果:
    • -a 顯示隱藏檔案
    • -d 列出目錄(僅顯示最上層)
    • -l 列出詳細細節
    • -F <檔案類型> 可以篩選檔案類型
    • -u 以存取時間排序
    • -t 以異動時間排序
    • -S 以檔案大小排序
    • -r 反向排序

切換目錄 cd <路徑>

  • cd ../:到上一層目錄
  • cd -:切換到上一個目錄

Linux 根目錄架構

目錄名稱 簡介
bin 儲存公用指令,可以在終端機中執行的基本指令。
boot 包含所有開機相關檔案,例如內核、引導載入程式,適合加入自定義開機指令。
dev 系統設備檔案,包含硬碟、記憶體、外接裝置等。
etc 儲存所有服務與系統的組態設定檔案。
home 每個使用者的家目錄,存放使用者個人資料與設定。
lib / lib64 作業系統與軟體使用的核心模組與程式庫。
lost+found 儲存修復後找回的遺失檔案,通常是未知或損壞的檔案。
media 掛載外接設備的目錄,例如 USB 隨身碟。
mnt 用來臨時掛載檔案系統的目錄。
opt 非官方軟體的安裝目錄,通常用於手動安裝的套件。
proc 儲存系統執行中的程序資訊,如 Windows 的工作管理員。
root 管理使用者 (root) 的家目錄,擁有最高權限的管理員專用目錄。
run 存放系統運行時的暫存檔案與程序資訊。
sbin 系統管理指令的存放區,僅限管理員使用的指令與工具。
snap 沙盒測試環境,用於測試軟體的執行與行為。
srv 服務資料存放區,適合放置網站主機的資料。
sys 虛擬檔案系統,儲存系統啟動時的硬體與裝置資訊。
tmp 暫存檔案存放區,可能會被系統定期清理。
usr 使用者指令、工具與函式庫存放區,系統常用的執行檔通常在此目錄中。
var 儲存系統執行時常變動的檔案,如日誌、郵件信箱、資料庫等。
  • BIN

公用指令,就是你可以在終端機輸入的指令

  • boot

裡面釋放所有關於開機的檔案,可以加入自定義的開機指令
在grup中

  • initrd 是次要功能,不一定需要的

  • vmliunz是必要開機的檔案

  • system.map是除錯檔案,可以查看記憶體資訊

  • 其他的就不需要的

  • dev

系統的檔案,或是設備(硬碟、應表機、記憶體…)的檔案

  • ect

所有的服務相關組態檔案

  • home

電腦中的所有使用者

  • LIB / LIB64

放置作業系統和軟體的程式庫,也可以說是驅動程式,但是實際上我們稱它為核心模組

  • lost and found

就是它字面上的意思,有可能使用的情境是一個未知(不知道位置和名稱)的檔案被系統掃描到,系統就會把他就到這裡

  • media

這是當一個外接設備插入時,你需要把這個設備掛載到這個目錄,這樣你就可以使用這個隨身碟了

  • mnt

這個目錄也是media的目錄,只不過這是早期的,現在與mnt不同的是通常mnt是暫時掛載處,不會拿來長期使用

  • OPT

非官方的軟體下載地方都會放在這

  • PROC

就是所有正在系統中運作的程序,相同於window的工作管理員中的詳細資料

  • root

就是管理使用者的自己的資料夾

  • run

就是程序執行如果需要空間就會把資料放在這裡

  • sbin

系統使用的指令都放在這裡

  • snap

沙盒子,通常是用來測試軟體的地方,如果有駭客連線季進來會以為自己在root中

  • srv

服務的資料存放區,例如網頁主機就要把網頁放在這裡

  • sys

虛擬檔案系統,是在linux核心開機時產生的檔案,核心開機時會記錄當前設備環境,就會把環境的資訊記錄在這裡
這裡同時也是產生dev資料夾,由udev服務

  • tmp

資料站存檔案區,但是有可能會被清理掉

  • usr

使用者指令、工具、函式庫

以前的bin

以前因為在usr中也有lib和bin資料夾,所以在系統要尋找一個指令時要跑遍外面的bin和lib和裡面的lib和bin,這樣太麻煩了,所以到後期的Ubuntu就把晤面的bin和lib指向usr的bin和lib了

  • var

存放常變動檔案區域,例如mail信箱,資料庫,遊戲存檔,系統Log檔案

以上這些命名式使用SP-系統目錄標準的架構,所以這些檔案命名也不是開發這自己亂命名的,標準在這裡

相對路近和相對路近

絕對路近是從/開始,就是從根目錄出發去看的路近

相對路近就是你當前資料夾的路近再去做判斷

相對路近用法

  • ./ 的意思就是以當前資料為出根去尋找一個路近
  • ../ 的意思就是以當前資料夾的上一層資料夾作為根去尋找一個路近
  • ../../xxxx 就是可以上一層上一層…直到妳開心

建立檔案 touch
但是其實他是跟遍檔案間戳記,只是他在沒有這個檔案時才會建立一個新檔案

建立資料夾 mkdir
你也同時時建立一個資料的路徑,例如 root/my/folder/with/mkdir 可以用指令

  • mkdir -p root/my/folder/with/mkdir

-p 的意思

就是就算沒有這個路徑也會建立,意思就是說如果你沒有-p,你就要先有root/my/folder/with這個路徑才能建立mkdir資料夾

複製檔案 cp
使用cp <目標檔案路徑> <複製到檔案路徑>

移動檔案 mv
使用使用mv <目標檔案路徑> <複製到檔案路徑>

刪除檔案 rm
使用使用rm <目標檔案路徑>,你也可以執行這個指令 -rm -rf /

刪除資料夾 rmdir
使用使用rmdir <目標檔案路徑>

尋找檔案 which
使用 which <尋找檔案路徑> 會顯示出找到的檔案

所有檔案

如果要找出所有檔案要加-a在尋找盪案路徑的前方,就可以列出所有的指令

尋找特定路徑 whereis
與which不同的是他可以尋找定路經中,所以不會搜尋整的系統中的檔案

尋找檔案 locate
與上兩個不同的是他可以模糊搜尋,意思就是你不需要知道檔案的完整名稱,也不需要分字母的大小
也可以使用-s統計有多尋找檔案的數量,常被用在大型資料庫上

尋找檔案 find
與上三者不同,他可以直接在當前目錄搜尋檔案,不需要輸入目錄
find可以用的option也很多,例如

閱讀檔案 cat <檔案>
可以快速的預覽一個文件檔案立面的內容

閱讀檔案 nl <檔案>
可以快速的預覽一個文件檔案立面的內容,但是是一行一行的慢慢閱讀

同樣的cat效果

如果再cat指令加入-n的option也可以有相同的瀏覽效果

螢幕瀏覽工具 more
這個是專門瀏覽大型檔案的,在瀏覽下方會有一個閱讀進度,如果瀏覽完就會自動離開

  • 其他操作
    [ SPACE ] : 向下翻頁
    [ ENTER ] : 向下翻頁
    /字串 : 向下搜尋

[ b] : 向上翻頁 ( 檔案有效,管線無效 )
[ q] : 離開

瀏覽工具 less
與more功能相同

內容讀取器 head -n <數字>
可以自訂要讀取的行數,如果是使用-c是讀取字元的長度

如果輸入負的數字

表示就最後<負數數字>行/字不讀取,其他的都讀取

內容讀取器 tail -n/c <數字>
與head相同,但是原本的負號數字變成正號數字(-10 -> +10)

排序 sort
可以排序一個檔案內的內容,可用的option有

選項 說明
-b 忽略行首的空白字元
-f 忽略大小寫區別
-t 指定分隔符號進行排序,例如:-t " "(以空格為分隔符)
-k n 指定分隔區間排序欄位(通常搭配 -t 使用)
-r 反向排序
-n 以數字排序(非 ASCII 排序)
-u 列出所有資料並去除重複(類似 uniq -u

統計指令 wc
可以統計一個檔案的各項數據

選項 說明
-l 行數總計(顯示檔案中的行數)
-w 字數統計(顯示檔案中的單字數量)
-m 字元統計(顯示檔案中的字元數量)
-L 最長行的字數(顯示檔案中最長行的字數)
-c 位元組統計(顯示檔案的 byte 大小)

find 常用選項介紹

選項 說明 範例
-amin n 查找在 n 分鐘前被訪問過的檔案或目錄。 find /path -amin -10
-name PATTERN 根據檔案名稱查找,支援萬用字元(如 *?)。 find /path -name "*.txt"
-cmin n 查找在 n 分鐘前被修改過屬性的檔案或目錄。 find /path -cmin -5
-type [bdfl] 根據檔案類型查找:
b:區塊裝置
d:目錄
f:檔案
l:連結
find /path -type f
-empty 查找空的檔案或目錄。 find /path -empty
-size n[cwbkMG] 根據檔案大小查找:
c:字節
k:KB
M:MB
G:GB
find /path -size +50M

壓所檔案 tar

  • 壓縮檔案 tar <壓縮選項> <檔案名稱> <壓縮目標路徑>
  • 監視壓縮檔案 tar -t -f <目標檔案路徑>
  • 解壓所檔案 tar -xv -f <目標檔案路徑> -C

其他可用的選項

選項 說明
-c 建立壓縮檔案
-v 顯示打包或解壓縮的詳細過程
-f 指定打包檔名
-j 使用 bzip2 壓縮格式(副檔名 .bz2
-z 使用 gzip 壓縮格式(副檔名 .gz
-t 檢視壓縮檔案中的內容
-x 解壓縮
-C 指定解壓縮位置

分割檔案 split
可以把一個檔案分割成多個不同的檔案,例如把一個有100行的文字檔案分割成每10個分一分就會有10份檔案

  • 使用方式是split <選項> <數值> <目標文件> <分割後名稱>

可以切割的選項有

選項 說明
-a n 檔名後綴使用 n 個字元。
-d 使用數字後綴(預設為英文字母後綴)。
-b n 按大小進行分割:
- 使用 K, M, G, T(1024 的次方)
- 使用 KB, MB, GB(1000 的次方)
-l n 按行數分割,n 代表每個檔案的最大行數。
  • 如何合併檔案
    使用cat <檔案一> > <檔案二> >... > <檔案n> > <最終檔案名稱>

也可以使用cat <檔案名稱.檔案類型*> > <最終檔案名稱>

順序性

在合併檔案實需要依照順序合併檔案,如果沒有照順序檔案就會出錯

查詢檔案 grep <塞選文字>
可以以行的方式過濾出你想要塞選的字,例如有一個檔案內容是

1
2
3
4
123456
235432
31415926
2201323

如果我們用grep去塞選23就會輸出[1, 2, 4]行,因為他們都包含23

當然它也有自己的option,可用的選項有

選項 功能描述
-i 忽略大小寫
-w 完整符合(以字為單位)
-c 符合關鍵字的數量
-n 輸出行數加上行號(等同 nlcat -n 效果)
-v 相反輸出(輸出不符合關鍵字資料)

他配管道指令

grep常常它配管道語法使用,因為它能快速塞選出特殊的文字在任何的輸出中


命令補齊

這個就是有再寫code的人可能知道用tab可以快速地完成指令,簡單來說就是電腦會去猜你接下來要打甚麼然後你按下後就會自動幫你打出來,不過初學還是實打實的打指令比較好,因為這樣才能熟記指令名稱

萬用字元

就是*?的用法,寫過權限程式的應該都知道

  • * 就是指全部的意思,例如usr/*意思就是usr/下所有的資料
  • ? 就是指有限定的檔案長度的,例如usr/??意思就是列出usr/下資料夾名稱長度為兩個長度的,例如usr/ls, usr/ip,不會有usr/x, usr/zbc
    也可以這樣使用usr/?a??,意思就是找到資料夾名稱在第二的字元有a,並且長度為四的資料夾,例如:usr/main, usr/tail, usr/mail

每一個指令都會有一個輸入和兩個輸出,分別是

  • 指令輸入 (Input)

  • 正確的輸出 (Output)[1]

  • 錯誤的輸出 (Error Output)[2]


輸出轉向

他是一個大於符號>,功能是把輸出到螢幕上的東西變成一個真實的檔案,例如你想要把現在的時間創建到一個文件中,你可以用上面的date指令,但是輸出到一個真實的文字可以使用這樣

  • date > yourfilename.txt

不過還有另外一個附加轉向,他的涂號是>>,與輸出轉向不同的是他可以偵測如果這個檔案已經存在,那就在這個檔案中加入文字,例如使用輸出轉向執行5次date會變成

1
time...

但是使用附加轉向會變成

1
2
3
4
5
time...
time...
time...
time...
time...

實用指令

使用cat > filename.txt就可以簡單的創建編輯一個文字檔案


輸入轉向

就是剛剛是以終端機中輸出的東西轉為檔案,轉一個方向(<)就是以已經存在的檔案輸出到視窗中,例如

  • head -n 3 text.txt
    這個大家都知道會輸出text.txt的前三行,但是如果變成
  • head -n 3 < text.txt
    行為就會變成先讀取text.txt,再去顯示前三行

同樣這也有一個輸入附加轉向,符號是<<,與輸入轉向不同是他會輸出在最後一行,最後一個輸出,例如

  • cat > text.txt << EndLine
    在使用這個指令時不管你中間輸入甚麼,最終都會附加一個”EndLine”

錯誤輸出轉向

錯誤的輸出轉向就是輸出終端機中的錯誤訊息,例如當我們在root中找一個檔名為Hello-world資料夾時,除非你沒有創建過那不然Linux一定會輸出錯誤,那要把錯誤訊息變成文字也很簡單

  • cd hello-world 2> error.txt
    這樣就可以把錯誤訊息輸出到終端機了

但是與輸出轉向相同他也會有一個錯誤附加轉向,意思與上方依樣,就是會新增文字到檔案中,而不是覆蓋

  • cd hello-world 2>> error.txt

全部轉向

全部轉向其實就是兩者的結合啦,同時會輸出錯誤和正確的轉向,他的符號是&>(全部輸出轉向)和&>>(全部輸出附加轉向),我就不舉例了

管線

這個功能是把一個成趣的輸出,接到另外一個指令的輸入
意思就是說,假設我今天想要閱讀一個文件並且選出幾個關鍵字,那我們共分為兩個步驟

  1. 用cat指令輸出檔案內容
  2. 用grep過濾出我想要的問字內容

這樣的話我們就要把cat的輸出接到grep,所以指令就是

  • cat myfile.txt | grep myfilter

連續指令

有寫過程是語言的應該都有看過;,他就是用來區分每一行的符號,在終端機也是你可以把一串文字分割成多行輸出到終端機,例如

  1. touch hiworld.txt
  2. echo hello >> hiworld.txt
  3. echo im >> hiworld.txt
  4. echo Linux >> hiworld.txt
  5. cat hiworld.txt

這樣就是創建一個檔案,但是以要輸入很多行,但是如果你想要簡寫的話可以寫成這樣

  • touch hiworld.txt ; echo hi >> hiworld.txt ; echo Im >> hiworld.txt ; echo Linux >> hiworld.txt ; cat hiworld.txt

這樣雖然比較好看,但是實際上打出的指令數目也是一樣的,但是如果你有一個指令打錯後面的還是會繼續執行,不會停止

條件是指令

條件指令其中一個功能就是用來補全連續指令,因為條件指令執行下一個指令的條件就是上一個指令有執行成功,他的符號是&&
# 對條件指令可以說是連續指令的一種

所以我們上一個指令就變成

  • touch hiworld.txt && echo hi >> hiworld.txt && echo Im >> hiworld.txt && echo Linux >> hiworld.txt && cat hiworld.txt

另外一個條件式指令是<span class="hidden-text-container"><span class="hidden-text">,他個功能是如果前面的指令執行成功,那就執行</span><span class="hidden-box"></span></span>後面的下一個指令果還是失敗就會一直執行下去直到沒有下一個,舉個例子

  • cd /etc && cd NoThisFile <span class="hidden-text-container"><span class="hidden-text"> cd apt </span><span class="hidden-box"></span></span> cd other && echo createfile > !hi.txt || echo createfile > success.txt

我們先拆開這個指令

  1. cd /etc
  2. cd NoThisFile <span class="hidden-text-container"><span class="hidden-text"> cd apt </span><span class="hidden-box"></span></span> cd other
  3. echo createfile > !hi.txt || echo createfile > success.txt

地一個指令會執行成功因為有這個指令
第二個的第一個指令會失敗因為沒有這個檔案,所以會去執行cd apt,執行成功因為有這個檔案存在,所以會直接執行到下一個指令
第三個指令因為創建文字檔案的語法錯誤(檔案名稱不能有!),所以會執行echo createfile > success.txt