Bash

為什麼 Bash 的源碼不需要執行位?

  • January 25, 2018

使用 Bashsource可以在沒有設置執行位的情況下執行腳本。這是記錄和預期的行為,但這不是反對使用執行位嗎?

我知道,這source不會創建子外殼。

Bash 是一個解釋器;它接受輸入並做任何它想做的事情。它不需要注意可執行位。事實上,Bash 是可移植的,可以在沒有任何可執行位概念的作業系統和文件系統上執行。

真正關心可執行位的是作業系統核心。例如,當 Linux 核心執行時exec,它會檢查文件系統是否未使用noexec選項掛載,它會檢查程序文件的可執行位,並強制執行安全模組(例如 SELinux 或 AppArmor)施加的任何要求。

請注意,可執行位是一種相當隨意的控制。例如,在 Linux x86-64 系統上,您可以通過顯式呼叫/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2解釋器來繞過核心對可執行位的驗證:

cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls

這有點類似於在 Bash 中獲取 Bash 原始碼,除了它ld.so是解釋器,它執行的程式碼是 ELF 格式的機器程式碼。

source或等效但標準的.不執行腳本,而是從腳本文件中讀取命令,然後在目前 shell 環境中逐行執行它們。

沒有什麼反對使用執行位,因為shell只需要讀取權限就可以讀取文件的內容。

只有在執行腳本時才需要執行位。在這裡,shell 將fork()新建程序,然後使用execve()函式從腳本創建新的程序映像,該腳本需要是正常的執行檔。

引用自:https://unix.stackexchange.com/questions/291404