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
當要移除檔案或資料夾時,可以使用 rm
及 rmdir
來進行,要注意的是,刪除目錄時該目錄必須得是空的:
$ 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
若要更改檔案的權限及擁有者則可以使用 chmod
及 chown
來辦到:
$ 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 的功能:
- 每次要 Local 連上 Server 時,加上 -A 參數:
$ ssh -A user@linux1.cs.nycu.edu.tw
[user@linux1] $ ssh linux2.cs.nycu.edu.tw
[user$linux2] $ # 使用本地端的 SSH key 而不需要另外輸入密碼
- 修改
~/.ssh/config
設定,加上ForwardAgent yes
,這樣就不需要每次連都加上 -A 參數:
~/.ssh/config
:
Host linux1.cs.nycu.edu.tw
HostName 140.113.235.131
ForwardAgent yes
$ ssh user@linux1.cs.nycu.edu.tw
[user@linux1] $ 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
如同 tmux
,screen
亦可以在系統上建立虛擬終端機,可以在多個 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] $