無論是在伺服器進行網站開發或是漏洞實戰都會運用指令介面,而實戰當中常用的滲透工具以及惡意攻擊者撰寫的病毒也都包含指令,因此我們需要學習 Command Line 的操作與技巧。
學習基本指令的目的
一般我們使用電腦都是透過 圖形化使用者介面(Graphical User Interface, GUI) 進行操作,例如: 桌面、圖示、按鈕等等。
除了透過 GUI 與電腦互動以外,也可以透過 Terminal 以文字的方式與電腦互動,又稱為 指令介面(Command-Line Interface, CLI) 。
了解基礎指令(以 Linux 為例)
常見的作業系統有 Linux 家族(如: Ubuntu, CentOS 等) 與 Windows 兩種類型的作業。兩種類型的作業系統使用的指令介面有些許的不同,其中 Linux 為 bash shell ,而 Windows 為 cmd, PowerShell。
在 Linux 當中還有許多不同類型的 shell 如: zsh。 功能相較之下有些許差異,也衍生出許多不同的工具,這裡不再贅述。
以下列舉常用的指令,實作內容將在 LAB 當中實際操作。
目的 | bash | cmd | PowerShell |
---|---|---|---|
指令查詢 | man | help | Get-Help |
關閉視窗 | exit | exit | exit |
進入目錄 | cd <路徑> | cd <路徑> | Set-location <路徑> |
建立目錄 | mkdir <名稱> | md <名稱> | New-Item <名稱> -ItemType “directory” |
顯示目前所在目錄 | pwd | cd | Get-Location |
顯示目前環境變數 | env | set | Get-Variable |
設定環境變數 | setenv | set | Set-Variable |
顯示時間 | date | date/time | Get-Date |
重新命名檔案 | mv | ren | Rename-Item |
刪除檔案 | rm | del | Remove-Item |
顯示檔案內容 | cat/more | type | Get-Contents |
顯示當前目錄檔案 | ls | dir | Get-ChildItem |
列印檔案 | lp | Out-Printer | |
複製檔案 | cp | copy | Copy-Item |
清理指令介面 | clear | cls | cls, clear |
新增空白檔案 | touch <檔案名稱> | call > <檔案名稱> | New-Item <檔案名稱> |
學習基礎指令的管道
前面提到了指令介面的重要性,並且許多的實作都將以 Linux 系統進行,因此這裡需要先建構好 Linux 環境。
Linux 環境可以透過虛擬機器建立,常見的虛擬機器有 VirtualBox, VMWare, 等等。而在 Windows 10 系統下也可以使用 Windows Subsystem for Linux(WSL) 操作 Linux。
- [安裝教學] 在 Windows 10 安裝虛擬機軟體 Virtualbox
- [安裝教學] 在 Virtualbox 安裝 Ubuntu
- [安裝教學] 安裝 Windows 子系統 Linux 版(WSL 安裝)
- [安裝教學] Windows Terminal
LAB: 練習基礎指令
接下來要練習基礎指令的使用,請先開啟 Ubuntu 20.04 的 Terminal 準備好就開始吧!
man <指令名稱>
man,也就是 manual。它可以查看某個指令的詳細說明以及使用方式。
輸入指令後會開啟說明介面,透過方向鍵上鍵以及下鍵可以滾動內文,按下 q
可以退出介面。
例如查看 ls
這個指令的相關說明
man ls
echo <輸出內容>
echo 是可以用來輸出文字的指令。
例如輸出Hello Fei
echo "Hello Fei"
whoami
whoami,也就是 who am i。它會列出目前已經登入的帳號
ls
ls,也就是 list directory contents。它會列出當前資料夾內的檔案列表。
若要查看其他特定資料夾的檔案列表可以再加上資料夾路徑,路徑可以選擇使用相對路徑或是絕對路徑。
ls <資料夾路徑>
加上 -al
參數,可以輸出詳細的列表以及隱藏文件,其中 a 表示 all, l 表示 long listing format。
ls -al
相對路徑 vs 絕對路徑
路徑的表達方式分成相對路徑以及絕對路徑兩種
相對路徑
所謂相對路徑,也就是在當前的位置以及目標位置之間的相對位置
我們在 Linux 系統當中會用 ..
表示上一層資料夾,用 .
表示當前位置
舉例來說,如果現在我們的資料夾架構是這樣
.
├── dir1
│ ├── dir3
│ │ └── test3
│ └── test1
└── dir2
└── test2
如果我當前在 dir2
當中,要表示與 test3
的相對位置,可以表示成 ../dir1/dir3/test3
絕對路徑
所謂絕對路徑是以根目錄作為參考基礎的路徑,在 Linux 當中,我們會以 /
表示根目錄,以 ~
表示 /home/<使用者名稱>/
,也就是家目錄
舉例來說,如果現在我們的資料夾架構是這樣
/
├── dir1
│ ├── dir3
│ │ └── test3
│ └── test1
└── dir2
└── test2
以絕對路徑表示 test3
的表示方式為 /dir1/dir3/test3
cd <資料夾路徑>
cd, 也就是 channge directory。它可以讓切換到指定的資料夾。
資料夾路徑可以選擇相對路徑或是絕對路徑。
例如切換到桌面,也就是 /home/fei/Desktop/
你會發現到在 fei@fei-VirtualBox: 後面顯示的路徑改變了。
pwd
pwd,也就是 print name of current/working directory。它可以輸出目前所在的資料夾路徑,以絕對路徑表示。
cat <檔案路徑>
cat 可以輸出指定檔案的內容。
例如在當前資料夾底下有個 hello.txt
,將它 cat 出來。
cat hello.txt
grep <關鍵字> <檔案路徑>
grep 可以搜尋與關鍵字相符合的檔案內容。
touch <檔案名稱>
touch 在指定的檔案名稱不存在時會新增一個空的檔案。
※ 實際上 touch 是更新檔案的時間戳記,只是在檔案不存在時會直接新增空檔案
mkdir <資料夾名稱>
mkdir,也就是 make directories。它可以建立一個指定名稱的資料夾。
find
find 可以搜尋指定的檔案,有兩種常見的使用方式。
- 搜尋指定路徑下的特定名稱檔案
find <路徑> -iname <名稱>
- 搜尋指定路徑下的特定附檔名檔案
find <路徑> -iname '*.<副檔名>'
這裡使用的 iname
參數會不在乎大小寫搜尋,如果要求大小寫也要相同則改用 name
參數。
路徑可以給相對路徑或是絕對路徑。
file <檔案路徑>
file 可以查看指定檔案的檔案類型。
你可能會很好奇,透過副檔名不就可以知道檔案類型了嗎?
像是 .txt
就是文字檔; .exe
就是執行檔。
實際上,副檔名單純只是告訴電腦應該要用什麼應用程式開啟,與檔案內容無關。
因此,副檔名也可以不存在,並不會影響檔案的執行。
rm
rm,也就是 remove。它可以刪除檔案或是資料夾。
刪除資料夾需要加上參數 -r
,r 表示 recursive,會利用遞迴的方式刪除資料夾內的所有資料。
rm hello.txt
mv
mv,也就是 move。它可以移動檔案或資料夾位置,也可以將檔案重新命名。
例如將 tmp 移動到 tmp_dir 底下
例如將 tmp 重新命名為 new_file
cp
cp,也就是 copy。它可以複製檔案或是資料夾。
與 rm 相同,對資料夾操作時需要加上參數 -r
sudo
sudo 可以讓使用者暫時使用超級使用者(superuser)的權限執行指令。大多數指令前面加上 sudo 就可以改用 superuser 權限執行。
第一次輸入時需要輸入密碼,密碼不會顯示在螢幕上。
例如: 更新軟體
sudo apt update
apt
apt 是 Linux 軟體包管理器,可以安裝、解除安裝、更新軟體。
安裝時需要使用 superuser 權限,因此前面通常會加上 sudo。
安裝、解除安裝、更新分別以 install
、purge
、update
表示
例如更新軟體
sudo apt update
ssh user@ip
ssh,也就是 Security Shell。可以使用 CLI 透過加密的網路傳輸協定遠端操作電腦。
user 是遠端電腦的帳號,ip 是遠端電腦的位置,如果要指定通訊埠(port),可以加上參數 -p
。通常 ssh 服務的 port 位在 22。
第一次登入時會詢問是否信任遠端的機器。
例如使用 user
登入遠端操作 192.168.7.245:22
ssh user@192.168.7.245 -p 22
nano <檔案名稱>
nano 是簡單的文字編輯器。輸入指令後會進入編輯介面,透過 ctrl
+x
可以退出,再輸入 Y
就可以儲存並退出。
常用指令統整
指令 | 說明 | 使用方式 |
---|---|---|
. | 當前資料夾 | |
.. | 上一層資料夾 | |
~ | 家目錄 | |
/ | 根目錄 | |
man | 查看指令詳細說明 | man <指令名稱> |
echo | 輸出文字 | echo <輸出內容> |
whoami | 列出目前已登入帳號 | whoami |
ls | 列出當前資料夾檔案列表 | ls |
cd | 切換資料夾 | cd <資料夾路徑> |
pwd | 輸出當前資料夾路徑 | pws |
cat | 輸出指定檔案的內容 | cat <檔案路徑> |
grep | 搜尋與關鍵字相符的檔案內容 | grep <關鍵字> <檔案路徑> |
touch | 新增一個空的檔案 | touch <檔案名稱> |
mkdir | 建立一個資料夾 | mkdir <資料夾名稱> |
find | 尋找指定的檔案 | find <路徑> -iname <關鍵字> |
file | 查看指定檔案的檔案類型 | file <檔案路徑> |
rm | 刪除檔案或資料夾 | rm <檔案或資料夾路徑> |
mv | 移動檔案或資料夾位置 | mv <檔案或資料夾路徑> <目標路徑> |
cp | 複製檔案或資料夾 | cp <複製源路徑> <目標路徑> |
sudo | 使用超級使用者權限執行命令 | sudo <命令> |
apt | 軟體包管理器 | apt <操作> |
ssh | 透過 ssh 遠端操作機器 | ssh <user>@<ip> -p <port> |
nano | 文字編輯器 | nano <檔案名稱> |
Linux 小知識
- 在命令列當中按上鍵可以看到上一個打過的指令
- 打指令如果忘記後面的參數要放什麼,按兩下
tab
會顯示出建議的選項 - 指令當中輸入檔案名稱時可以只輸入部分,再按一下
tab
自動補齊 - 大多數的命令加上
--help
參數可以獲得簡單的指令介紹
Linux 權限
在 Linux 當中也有權限之分,透過指令 ls 可以了解資料夾內的檔案或資料夾的權限列表,以及檔案所屬群組,與檔案擁有者。其中權限分成三種類型:
- 該檔案擁有者的權限(the file owner)
- 該檔案所屬群組內的使用者權限(the group owner of the file)
- 其他所有使用者的權限(all other user)
權限也分成三種類型
- r : 可讀
- w : 可寫
- x : 可執行
以下使用指令 ls -al
查看檔案與資料夾權限,在檔案屬性可以看到 d 表示資料夾; – 表示檔案
除了 rwx 的表示方式外,也可以使用數字表示權限,以下表格整理了各個數字的意義。
Dec | Binary | 代表意義 |
---|---|---|
0 | 000 | 該檔案無法讀取、無法寫入、無法執行 |
1 | 001 | 該檔案可以執行 |
2 | 010 | 該檔案可以寫入 |
3 | 011 | 該檔案可以寫入、執行 |
4 | 100 | 該檔案可以讀取 |
5 | 101 | 該檔案可以讀取、執行 |
6 | 110 | 該檔案可以寫入、讀取 |
7 | 111 | 該檔案可以讀取、寫入、執行 |
也就是說,二進位的每個位數分別表示讀取( r )、寫入( w )、執行( x ) 的權限,並且以 1 表示有該權限, 0 表示沒有該權限。
而每個 Hex 值又會分別對應到擁有者、所屬群組、其他使用者的權限。
chmod <權限> <檔案名稱>
chmod,也就是 change file mode bits。它可以將檔案的權限更新。
如果是要修改資料夾權限,則需要加上參數 -R
。
如同前面提到我們可以使用 rwx
或是 0~7
來表示權限,因此這裡也有兩種表示方式。
- 使用
rwx
我們可以選擇哪種類型的權限要變更,或是全部一起變更。
分別使用u
,g
,o
,a
表示擁有者、群組內使用者、其他使用者、全部使用者。可以看成user
,group
,others
以及all
。
例如只針對 擁有者(u
) 新增(+
) 讀取(r
) 的權限chmod u+r new_file
如果要移除的話則改用-
如果是針對全部使用者調整 讀取(r
) 或是 執行(x
) 的權限,可以省略a
。 - 使用
0~7
由於一個數字就可以表示三個權限,因此一次就可以設定三種類型的權限。
例如讓 擁有者、群組內使用者 新增(+
) 讀取(r
) 的權限chmod +770 new_file
如果要移除則改用-
如果要直接複寫當前的權限狀態則不需要+
或-
例如將所有使用者權限都設為 7chmod 777 new_file
其它常見指令
指令 | 說明 |
---|---|
ln <file> <linkname> |
建立硬連結(hard links) |
ln -s <file> <linkname> |
建立軟連結、符號連結(symbolic links) |
find / |
搜尋根目錄 |
find <dir> -user <user> |
搜尋時指定使用者 |
find <dir> -group <group> |
搜尋時指定群組 |
find -perm |
搜尋時指定權限 |
find -type [d/p/f/l/s] |
搜尋時指定類型: 目錄、pipe、檔案、連結檔案、socket |
grep <regular expression> <file> |
可以使用正則表達式進行搜尋 |
grep -n |
列出每行的數字 |
sudo <username> <command> |
以指定身分執行指令 |
sudo -l |
列出目前可以執行哪些指令 |
adduser |
增加使用者 |
addgroup |
增加群組 |
usermod -a -G <group> <user> |
將使用者加到群組 |
Linux 重要的操作符號
除了單純指令以外,也可以透過符號來串接指令,或是重導向輸出流。
符號 | 說明 |
---|---|
; |
指令終止符號,無論前面是否失敗都會繼續執行下一個 |
& |
讓符號前的指令在背景執行 |
&& |
指令連接符號,第一個指令失敗則不執行下一個 |
\| |
指令連接符號,將前項指令輸出當成下一個命令輸入 |
\|\| |
指令連接符號,第一個指令才執行下一個 |
`` | 讓符號內的指令先執行 |
> |
重導向符號,可以將輸出複寫至檔案 |
>> |
重導向符號,可以將輸出從檔案結尾繼續加入 |
[h5p id=”1″]