Linux /tmp目錄下執行腳本失敗提示Permission denied


  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:磁盤設備文件或者該設備的LabelUUID

  第二列:Mount point:設備的掛載點,就是你要掛載到哪個目錄下。

  第三列:filesystem:磁盤文件系統的格式,包括ext2ext3reiserfsnfsvfat等。可以使用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的問題,解決它的概率就比別人大很多了。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM