iT邦幫忙

2025 iThome 鐵人賽

DAY 20
2

嗨!歡迎回到上班族的命令列生存手冊。一首簡單的歌,讓你的心情快樂。一個簡單的 Shell Script,改善下午上班的心情。終於進入了 Shell Script 的環節,本章節會帶領讀者一起來寫一個實際的 Script 並且跑跑看喔。

老實說本篇並不強制在命令列裡頭手刻 Shell Script,讀者可以使用自己喜歡的編輯器開啟即可(像是 VSCode 換成 Shell Script 模式),先來了解一下什麼是 Shell Script。

什麼是 Shell Script

就是一連串的 Shell 指令,裡頭可以有一些邏輯判斷,像是 if - else 或是 switch 等判斷式。不過大部分的時間都只是一連串的指令連發。

還記得前幾章節介紹過 echo 指令嗎?以下就是一個超簡單的 Shell Script:

#!/bin/bash
echo "Hi there! $1"

把他存成一個 hello.sh 檔案,試著執行看看。你會發現「不能執行」,但這個不是因為寫壞了,或是有瑟情守門員。是因為這個檔案沒有執行的權限。

權限

筆者先用兩個不同的 Shell Script 示範,一個是可以執行的,一個是不能執行的,就像是上面的範例一樣。
還記得 $ ls -la 會印出 Long Format 嗎?有一個環節到現在還沒解釋,就是前面有一塊像是亂碼的地方。

https://ithelp.ithome.com.tw/upload/images/20251004/20141615KcdOPOxXwY.png

-rwxr-xr-x. 1 louis383 staff 31  8月 20 21:18 sayHi.sh* -rw-r--r--. 1 louis383 staff 31  8月 20 21:26 sayYo.sh

sayHi.sh 是可以執行的,sayYo.sh 則是不能。可以注意到可以執行的 Script 後面有星星以外,請看開頭的那一串字。那一串字就代表這個檔案能不能被不同的角色讀取、寫入和執行

https://ithelp.ithome.com.tw/upload/images/20251004/20141615WbaUfWIdEg.png

這裡需要前情提要一些事情,也把以下的 output 放進來討論:

drwxr-xr-x. 2 louis383 staff  32  8月 20 21:22 newFolder/ lrwxrwxrwx. 1 louis383 staff  10  8月 13 20:59 link -> file

先看第一個字,在 Day13 除了介紹 cp 指令複製檔案以外,還有介紹怎麼建立捷徑。(就不贅述,忘記了記得往前看喔。)如果一個檔案是軟連結,也就是 Symbolic Link,第一個字就會是 l

接著看資料夾,newFolder 是一個資料夾,他的第一個字是 d。除此之外,一般的檔案都會是 -

第一個字的意義是提供這個檔案的「檔案類型」,現在知道三種:

  • - :一般的檔案
  • l:捷徑 Symbolic Link
  • d:目錄,也就是資料夾

前幾章節隱約透漏 POSIX 系統「萬物皆檔案」的設計,也有一些在其他系統 (aka. Windows) 不常見的類型,舉一些範例來說:

  • b:這是區塊裝置(Block device),例如隨身碟
  • c:字元裝置(Character device),通常是某種輸入裝置,像是鍵盤之類的。古早時期可能是一個終端機。

當然不只這幾個,不過這邊還是以經典的三件套(-/l/d)來看就好。
好,知道了第一個字之後,接下來需要「三個字」一組來看。

檔案類型 擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
-/l/d rwx rwx rwx

可授權的行為

先來看 rwx 這一串,這三個文字分別代表三種權限:

  • r :Read 讀取權限
  • w: Write 寫入權限,可以修改檔案
  • x:Execute 執行權限
  • -:未授權,無權做這件事

拿上面筆者的範例檔案作為例子,

-rwxr-xr-x. 1 louis383 staff  31  8月 20 21:18 sayHi.sh*

套到上面的表格中,可以這樣解讀:

檔案類型 擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
- rwx r-x r-x
是檔案! 作者本人可以讀取、修改、執行! 檔案群組裡的人,可以讀取、執行,但不能修改 閒雜人等,可以讀取、執行,但不能修改

喔?所以 sayHi.sh 可以正常執行,因為擁有者本人可以執行。
再來看看不能執行的那個檔案:

-rw-r--r--. 1 louis383 staff  31  8月 20 21:26 sayYo.sh

套用到表格上面

檔案類型 擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
- rw- r-- r--
是檔案! 作者本人可以讀取、修改、但無法執行。 檔案群組裡的人,可以讀取,其他禁止。 閒雜人等,可以讀取,其他禁止。

看來在調整執行權限以前,擁有者本人製作出來的檔案,也是無法「執行」的!

角色

接下來來分析權限設定裡頭的角色,分別有三位:

  • User:檔案的擁有者,如果這台電腦只有你用,那應該就是你本人。TWICE 的子瑜健的,就是子瑜。
  • Group:檔案所在的群組的成員們,檔案如果是 TWICE 成員建的,那就是 TWICE 的每個成員。
  • Other:其他人,閒雜人等。上面例子來看就是子瑜和 TWICE 成員以外的其他人。

權限控管功能非常強大,這種可以設定非常細的權限控制,很適合在多人協作的情境,像是伺服器。
以下舉幾個例子來說明:

你是 iPhone 37 鍵盤開發的主管

你們團隊負責最新 iOS 46 的鍵盤功能,專案目錄叫 project k 。權限怎麼設定呢?

擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
rwx rw- r--
你是主管!可以讀取、修改任何內容(你是主管!)、執行編譯 Script 等等,還要可以部屬 Dogfood。 同一個團隊的工程師、設計師…等,需要可以編輯程式碼,設計稿。 閒雜人等,可以讀取文件之類的吧(嘿我們談論的是庫克時期以後的 Apple)

你是 iPhone 37 鍵盤開發工程師

你寫了一個超讚的 Shell Script,可以提昇生產力至少 10 倍(10 倍工程師)但有毒的工作環境讓你不想分享,只想私藏,享受更早下班的特權。權限怎麼設定呢?

擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
rwx --- ---
你可以讀取、修改內容、執行這個超讚 Script。 別想用,連讀取都不行 別想用,連讀取都不行

你是隔壁團隊,iPhone 36 網頁的工程師

前一陣子公司發表會吹太兇,隨意放無線充電板難產出包,要從網頁上移除掉。因為是一塊蛋糕你做超快,更新好網頁後。權限怎麼設定呢?

擁有者 (User) 檔案所在群組的人們 (Group) 其他人 (Other)
rw- r-- r--
你可以讀取、修改內容。沒什麼東西需要執行,因為只是網頁。 其他人要可以看才行,包含團隊成員。 網頁要開放給大家看。

目錄的權限

目錄和一般檔案的權限稍微有點不同,尤其是 x 執行權限的意義,和一般檔案有差別。目錄的 x 的意思是:擁有這個目錄的鑰匙,可以進入的權限。

也有這個狀況,有 x 進入的權限,卻沒有 r 讀取權限。這什麼神奇的狀況?在這情境,該使用者可以成功的進去這個目錄,但是看不到任何的檔案,也就是 $ ls 會沒反應。

不過,如果知道想存取的檔案名的話,是可以正常存取的喲!

$ cat /some/dir/my_secret.txt

只要有目標檔案的讀取權限,這樣還是可以正常看到的。
如果狀況反過來,一個目錄只給 r 權限,而不給 x 權限會是怎麼樣呢?就變成能看到該目錄下的檔案($ ls 有反應)但進不去,就像隔著玻璃看裡面的房間。

給 Nerd 專用表格

目錄權限 ls dir (列出內容) cd dir (進入目錄) cat dir/file.txt (存取內部檔案)
r-x (可讀可執行) 成功 成功 成功
r-- (僅可讀) 成功 失敗 失敗
--x (僅可執行) 失敗 成功 成功 (若你知道檔名)
--- (無權限) 失敗 失敗 失敗

目錄的 write 權限

寫入權限代表能夠調整該目錄下檔案的能力,例如刪除、建立、移動這個目錄的檔案。如果沒有 w 權限,則以上能力都做不到。

超貼心的總整理表格

權限 作用於一般檔案 作用於目錄
r (讀取) 允許讀取檔案的內容 (cat, less) 允許列出目錄內的檔名列表 (ls)
w (寫入) 允許修改檔案的內容 (nano, tee) 允許修改目錄的內容 (touch, rm, mv)
x (執行) 允許將檔案作為程式執行 (./script.sh) 允許進入該目錄 (cd)

欸,因為筆者寫到這邊已經半夜了(已哭),所以 Shell Script 篇就先暫時停在這邊,這章節介紹權限怎麼看,下一個章節就可以說明怎麼改變權限,並寫一個 Script,下次見囉。


上一篇
Day19 進階觀念篇:重新導向和 tee
下一篇
Day21 進階觀念篇:權限怎麼修改?來談談 chmod
系列文
上班族的命令列 (CLI) 生存手冊25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
chiaominchang222
iT邦新手 5 級 ‧ 2025-10-04 12:55:12

怎麼都能夠有這麼生動的教學

3
AndyAWD
iT邦新手 2 級 ‧ 2025-10-04 22:06:45

太棒啦,剩下三分之一

各位太強了

我要留言

立即登入留言