Bash
使用者如何在未經許可的情況下執行文件?
我創建了一個與*“Hello World”相呼應的 Bash 腳本。我還創建了一個測試使用者bob*,使用
adduser
.沒有人有權執行該文件,如下所示
ls
:$ ls -l hello.sh -rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh
從上面我們可以看出,文件的所有者是george,他只有讀寫權限,但沒有執行權限。但是以喬治身份登錄,我可以直接執行腳本:
$ . hello.sh Hello World
更糟糕的是,我以bob身份登錄,我只有讀取權限,但我仍然能夠執行該文件:
$ su bob Password: $ . /home/george/testdir/hello.sh Hello World
這是怎麼回事?
在您的範例中,您不是在執行文件,而是在採購它們。
執行將通過
$ ./hello.sh
為此,需要執行權限。在這種情況下,會打開一個子 shell,在其中執行腳本文件的命令。
採購,即
$ . hello.sh
(中間有空格)只讀取文件,然後呼叫
. hello.sh
命令的shell 會直接執行讀取的命令,即不打開子shell。由於該文件是只讀的,因此讀取權限足以進行操作。(另請注意,像這樣聲明腳本文件名會呼叫PATH
搜尋,因此如果hello.sh
您的文件中有另一個PATH
文件名將被獲取!使用顯式路徑,. ./hello.sh
以確保您獲取“正確的”。)如果您想防止這種情況發生,您還必須刪除任何不應該使用腳本的使用者的讀取權限。如果您真的擔心未經授權使用腳本,這無論如何都是合理的,因為
- 未經授權的使用者可以輕鬆地繞過缺少的執行權限,只需將腳本內容複製並粘貼到他們可以授予自己執行權限的新文件中,以及
- 正如 Kusalananda 所指出的,否則未經授權的使用者仍然可以通過呼叫它來輕鬆地使用該腳本
sh ./hello.sh
代替
./hello.sh
因為這也只需要腳本文件的讀取權限(例如,請參閱此答案)。
作為一般說明,請記住,採購和執行腳本之間存在細微差別(例如,請參閱此問題)。