UNIX 常見指令教學

man

如果忘記指令怎麼下,或是想看指令有甚麼神奇的功能,可以用 man <指令> 來查看說明(manpage)。
開啟 manpage 之後,按方向鍵可以捲動,按 q 可以離開

檔案操作

pwd

pwd 可以印出當前工作目錄(Current working driectory)的路徑:

$ pwd
/tmp

ls

ls 可以列出指定目錄下的檔案,在沒有指定目錄時則列出當前工作目錄下的檔案:

$ ls
abc/    xyz

# 列出隱藏檔案
$ ls -a
./      ../     abc/    xyz

# 列出詳細資料
$ ls -l
drwxrwxr-x  4 user user   4096 Dec 25 10:31 abc/
-rwxr-xr-x  1 user user   2048 Oct 31 12:25 xyz

cd

cd 可以將當前工作目錄切換至指定目錄,可以用 ~ 來表示家目錄:

$ pwd
/tmp
$ cd ~
$ pwd
/home/user

cp

可以使用 cp 來複製檔案或目錄,複製目錄時記得使用 -r 參數來進行遞迴複製:

$ cp source-file /tmp/destination-file
$ ls /tmp
destination-file

# 複製目錄
$ ls source-dir
fileA   fileB   fileC
$ cp -r source-dir /tmp/destination-dir
$ ls /tmp/destination-dir
fileA   fileB   fileC

mkdir

我們可以用 mkdir 來建立資料夾,用 -p 可以一併建立路徑中不存在的目錄:

$ mkdir a
$ ls
a/

# 遞迴建立目錄
$ mkdir -p a/b/c
$ ls a/b
c

rm/rmdir

當要移除檔案或資料夾時,可以使用 rmrmdir 來進行,要注意的是,刪除目錄時該目錄必須得是空的:

$ ls
tmp/    zfile
$ rmdir tmp
rmdir: failed to remove 'tmp': Directory not empty
$ rm tmp/only_one
$ rmdir tmp
$ ls
zfile

我們也可以使用 -r 來遞迴刪除指定路徑下的所有的檔案:

$ ls
tmp/    zfile
$ rm -r tmp
$ ls 
zfile

ln

如果我們有檔案需要建立捷徑,那麼我們可以使用軟連結(Soft link)來辦到,在 UNIX-like 環境中,還另外提供了硬連結(Hard link)的功能,差別在於當軟連結的目標被移除後,連結就會處於無法參照的狀態,硬連結則會參照至目標檔案在硬碟中的物理位置而不會有這個問題:

$ ls
fileA   fileB
# 使用軟連結 -s
$ ln -s fileA fileC
$ ls
fileA   fileB   fileC
# 預設使用硬連結
$ ln fileA fileD
$ ls
fileA   fileB   fileC   fileD
$ rm fileA
$ ls
fileB   fileC   fileD
$ cat fileC
cat: fileC: No such file or directory
$ cat fileD
Here is the original content of fileA.

quota

在檔案系統中,我們可以針對不同的使用者設定不同的配額用量,若要查看配額則可以使用 quota

$ quota 
Disk quotas for user user (uid 1001):
Filesystem        usage    quota   limit   grace  files   quota  limit   grace
/net/gcs         343128  2097152 2097152          15150  4294967295 4294967295
/net/mail          5076  20971520 20971520              1  4294967295 4294967295

chmod/chown

若要更改檔案的權限及擁有者則可以使用 chmodchown 來辦到:

$ ls -l demo
-rw-r--r--  1 user  group  27 Mar 12 16:44 demo

$ chmod g+w demo
$ ls -l demo
-rw-rw-r--  1 user  group  27 Mar 12 16:44 demo

$ chown user2:group2 demo
$ ls -l demo
-rw-rw-r--  1 user2  group2  27 Mar 12 16:44 demo

連線工具

ssh

我們可以透過 SSH 協定來進行至主機的安全連線:

$ ssh username@another.example.org
username@another.example.org's password:
[another.example.org] $

# 或是不指定使用者時使用當前使用者名稱進行連線
$ ssh another.example.org
user@another.example.org's password:
[another.example.org] $

# 或是指定非預設的 SSH 通訊埠進行連線:
$ ssh third.example.org -p 2222
user@third.example.org's password:
[third.example.org] $

另外,家目錄下的 .ssh/config 為個人設定檔,可以針對各個連線主機進行額外的 SSH 參數設定,詳細說明可以參照 man ssh_config

$ cat ~/.ssh/config
Host *
     KexAlgorithms +diffie-hellman-group1-sha1
     Ciphers 3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,arcfour,arcfour128,arcfour256,blowfish-cbc, cast128-cbc,chacha20-poly1305@openssh.com
     ServerAliveInterval 10
     ServerAliveCountMax 2
     TCPKeepAlive yes

我們更可以搭配 SSH key 以及 SSH agent forward 來達到安全又快速的登入體驗:

$ ssh-keygen -b 2048 # 建立 2048-bit 金鑰
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): # 留空表示預設路徑
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GM9Vl0OS5VBQJPbdCd0gfAnDyCvL+h3dPtsbS3kJSPw user@cscc.cs.nycu.edu.tw
The key's randomart image is:
+---[RSA 2048]----+
|         . +@@X+.|
|          +o+X*o+|
|      .   .+ .ooo|
|       =..o o    |
|      ..So . E   |
|        o  . .. o|
|       .  . . .=.|
|      .  . . .o.+|
|       .. .   o=o|
+----[SHA256]-----+
$

建立金鑰之後可以將 public key 的內容複製到目標伺服器的 ~/.ssh/authorized_keys(記得將權限設為 600 ,僅自己可讀寫) 中,如此一來就可以使用剛剛建立的金鑰登入伺服器。

而 SSH agent forwarding 則可以讓本地的金鑰轉送到遠端 Server 上進行驗證,也就是當我們需要在遠端 Server 上使用 SSH Key 時,就不需要將你的 private key 手動複製到 Server 上,是個暨方便又安全的作法。

舉例來說,首先 SSH 登入進 Server1,接著在 Server1 上登入 Server2 時,就會自動使用你本地的 SSH Key:

Local ---(SSH)---> Server1 ---(SSH)---> Server2

而我們有兩個方式可以啓用這個 agent forwarding 的功能:

  1. 每次要 Local 連上 Server 時,加上 -A 參數:
$ ssh -A user@bsd1.cs.nycu.edu.tw
[user@bsd1] $ ssh linux2.cs.nycu.edu.tw
[user$linux2] $ # 使用本地端的 SSH key 而不需要另外輸入密碼
  1. 修改 ~/.ssh/config 設定,加上 ForwardAgent yes,這樣就不需要每次連都加上 -A 參數:

~/.ssh/config:

Host bsd1.cs.nycu.edu.tw
  HostName 140.113.235.131
  ForwardAgent yes
$ ssh user@bsd1.cs.nycu.edu.tw
[user@bsd1] $ ssh linux2.cs.nycu.edu.tw
[user$linux2] $ # 使用本地端的 SSH key 而不需要另外輸入密碼

如果要確認你的 SSH key 有沒有被 agent 所使用,可以用下面的方式確認:

$ ssh-add -L
ssh-rsa ... /home/user/.ssh/id_rsa
$ # 將列出所有使用的 SSH key 以及路徑

ssh-add 出現 Could not open a connection to your authentication agent. 錯誤,表示我們沒有將 SSH agent 啓用,可以使用下面的方式啓動 SSH agent:

編輯 ~/.login(使用 csh/tcsh 作為預設 Shell 時):

if ( ! $?SSH_AUTH_SOCK ) then
  eval `ssh-agent -c`
  ssh-add
endif

編輯 ~/.bash_profile(使用 bash 作為預設 Shell 時):

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

重新登入後使用 echo $SSH_AGENT_SOCK 看運行中的 SSH agent 是否有被正確設定。

scp

類似 cp,但 scp 提供透過 SSH 協定進行遠端主機檔案的複製操作:

$ scp -r /tmp user@another.example.org:/tmp
$ scp user@another.example.org:~/secret_file ~/my_secret_file

telnet

我們除了加密的 SSH 連線以外,亦有非加密的遠端連線可以使用:

$ telnet ptt.cc
                                                 / ║    /         ψ boneofbeauty
     └                           |             ∕  ∥   Λ             |
     |          |              |            ↗   /  ∕              |
     ﹑ ︿〞     |       ︵                 ╱   M  ㄚ              |
    ‵ ▼ | ﹀    |    ╱   人   〝〞         /  ∕ [  ∥              ‵ ′
     ▋ ▅     ‵ ╲     ╱     !                Λ  ∕  ︳ ︳      |         ︳
     ▊  ▅     ∕  ╲ ╱                 ∥     ∕  八  ∥ ∥                   ︳
          ▄  ∕   ╱ \                ∥   ㄚ’ /    ║ ║       ‵ ′         ︳
       ▂   ▄   ╱      ﹀             ∥   ∥  Λ ﹏  ( 八 ╴             〝"〞
        ◣    ◣     ︿′ ﹨            ︿ ▁ \《 ▁    ︽ `-﹑!︿             |
          ◣    ▄                      ”  ▅ ︼▆  ~   ̄▆ ▅ ’              ︵↓ ︵
         ╱  ◣     ▄    ˍ  ╲      ︳  ‵ ︸︷  — _ ﹎  ﹊ㄧ ′    ︳    ▃ ︻︻▂
       ╰ ︿`   ▆ ▄ ▂ ▆ ▃ ㄚ      ︳                          ︵.! ▅ ▄ .-~─ ~-,▇
     ︳     ╲ <╴ ~ ︿ ▇  -╯                                〞▄ ▄ ▁ ︷ㄧ︸═ ︽,`
     ︳                        〝"〞           |           ▂ ▅ ︾            “
     ︳               ︿一︿                   |          ▕ ◢ ▃
   〝"〞              ‵ ︸′          <~ㄨ    ‵ ′           ◥ =◤

         歡迎來到 批踢踢實業坊 現在有【86803】位使用者與您一同享受雨天

請輸入代號,或以 guest 參觀,或以 new 註冊:
 ※ 本站目前暫停開放新帳號註冊。

ftp

若想對遠端主機進行 FTP 連線則可以使用 ftp 指令:

$ ftp files.example.org
ftp > 

詳細使用方式請參照 man ftp

檔案處理

cat

若要將現有檔案印出,則可以使用 cat

$ cat demo
hello line 1
hello line 2

# 印出行號
$ cat -n demo
1  hello line 1
2  hello line 2
3

less

在印出行數較多的檔案的時候,可以使用 less 來當作翻頁器(pager),使用方向鍵等按鍵來進行翻頁:

$ less large_file

head/tail

head/tail 可以印出檔案的首或末幾行:

$ cat file
1
2
3
4
5
# 未提供 -n 時預設為 10 行
$ head -n 3 file
1
2
3
# 未提供 -n 時預設為 10 行
$ tail -n 3 file
3
4
5

另外,-f 可以隨時關注目標檔案之變化,若尾端有新寫入之資料則會在 tail 中印出,若要離開則需使用 Ctrl-C

$ tail -n 3 -f file
3
4
5
new line 1
new line 2

sort

sort 可將檔案內容進行排序後輸出:

$ cat unsorted
1
3
2
4
6
5
$ sort unsorted
1
2
3
4
5
6

grep

當需要對檔案內容進行搜尋的時候,可以使用 grep 來逐行進行正規表達式配對,匹配時會印出該行,有關正規表達式的規則請參照維基百科上的說明:


$ cat demo
hello line 1
hello line 2

$ grep "1" demo
hello line 1

wc

wc 則可以用來計算檔案字元數或行數:

$ cat demo
hello line 1
hello line 2

#字元數
$ wc -c demo
27 demo
#單字數
$ wc -w demo
6 demo
#行數
$ wc -l demo
3 demo

vim

vim 是好用的文字編輯器:

$ vim <file>

使用方式可以參考鳥哥的 Linux 私房菜給程式設計師的Vim入門圖解說明 | vgod's blog

視窗管理

tmux

tmux 會在系統上建立虛擬終端機,可以在多個 Session 之間共用終端:

# 建立新 tmux session
$ tmux
[tmux]$ # Ctrl-B d 可以離開 tmux,並把終端機放至背景執行
# 將現有 tmux session 取回
$ tmux attach

使用方式可以參考 man tmux

screen

如同 tmuxscreen 亦可以在系統上建立虛擬終端機,可以在多個 Session 之間共用終端:

# 建立新 screen session
$ screen
[screen]$ # Ctrl-A d 可以離開 screen,並把終端機放至背景執行
# 將現有 screen session 取回
$ screen -d

使用方式可以參考 man screen

程序管理

ps

ps 列出當前用戶執行的程序列表:

$ ps
   PID TTY          TIME CMD
 40564 pts/3    00:00:06 fish
101257 pts/3    00:00:00 ps

top

top 則可開啓互動式的執行程序管理界面,在大部分的系統上皆有內建。

htop

htop 則為改良版本的 top,惟功能無法在此一一詳述,請參閱 man htop

renice

在類 Unix 系統中,每個程序都會有一個 niceness 值,用來讓 OS 決定各個程序的優先度,其值分布在 -20 ~ +19,新程序預設為 0,越低代表優先度越高。使用者可以使用 nice 指令使程序執行時使用指定的 niceness 值,但只有系統管理員能夠將 niceness 值設為低於 0 的值:

$ nice -n 10 bash
[bash] $