Linux上執行具有可執行權限Shell腳本失敗提示Permission denied問題的分析過程。
問題現象
Linux /tmp目錄下,執行./test.sh運行失敗,提示Permission denied。
問題分析
1、檢查test.sh腳本是否有可執行權限。執行ls -al test.sh,權限為777。具有可執行權限。
2、嘗試使用sh test.sh運行,可以執行。為啥。。
3、是/tmp目錄沒有執行權限?執行stat / 和stat /tmp發現權限都滿足。也不是該原因引起的。下圖stat命令執行結果供參考。
4、借助搜索。發現是由於/tmp文件系統的屬性被設置了noexec導致該目錄下的程序無法執行。noexec表示對應文件系統不允許執行可執行程序,即使文件具有可執行過權限。通常是考慮安全原因會這么設置。
問題解決
1、將腳本放到其他不具有noexec文件系統目錄執行或者使用sh test.sh運行。
2、如果程序必須在/tmp目錄下以./test.sh方式運行。通常是第三方調用情況。可以將/tmp文件系統中noexec屬性去掉,操作步驟如下(說明:僅限測試環境操作)
(1)在/etc/fstab文件中將/tmp文件系統的noexec屬性刪掉。
(2)重新掛載/tmp文件系統。執行umount /tmp; mount /tmp將/tmp文件重新掛載。
知識拓展
這里無法一時間解決該問題主要是因為不了解文件系統掛載參數的約束。學習下/etc/fstab文件及掛載參數內容。
/etc/fstab文件內容總共包含6列。
第一列:Device:磁盤設備文件或者該設備的Label、UUID
第二列:Mount point:設備的掛載點,就是你要掛載到哪個目錄下。
第三列:filesystem:磁盤文件系統的格式,包括ext2、ext3、reiserfs、nfs、vfat等。可以使用df -T查看
第四列:parameters:文件系統的參數
Async/sync 設置是否為同步方式運行,默認為async(性能較佳)
auto/noauto 當執行mount -a 的命令時,此文件系統是否被主動掛載。默認為auto
rw/ro 是否以只讀或者讀寫模式掛載
exec/noexec 限制此文件系統內是否能夠運行可執行文件。
user/nouser是否允許用戶使用mount命令掛載
suid/nosuid 是否允許SUID的存在
Usrquota 啟動文件系統支持磁盤配額模式。這個涉及到磁盤配額的知識。有興趣可以擴展看看
Grpquota 啟動文件系統對群組磁盤配額模式的支持
Defaults 同時具有rw,suid,dev,exec,auto,nouser,async等參數。基本上,默認使用Defaults設置即可。
第五列:能否被dump備份命令作用:dump是一個用來作為備份的命令。通常值為0或者1。測試環境很少用。
第六列:是否檢驗扇區:開機的過程中,系統默認會以fsck檢驗我們系統是否為完整(clean)。一般來說,根目錄設置為1,其他的文件系統設置為2。以前經常會在IBM的AIX系統遇到該問題。
總結
看了這個案例,相信如果你以后再遇到Shell腳本運行失敗提示Permission denied的問題,解決它的概率就比別人大很多了。。