filetest - Perl pragma 用於控制檔案測試權限運算子
$can_perhaps_read = -r "file"; # use the mode bits
{
use filetest 'access'; # intuit harder
$can_really_read = -r "file";
}
$can_perhaps_read = -r "file"; # use the mode bits again
此 pragma 告訴編譯器變更檔案測試權限運算子的行為,-r
-w
-x
-R
-W
-X
(請參閱 perlfunc)。
檔案測試運算子的預設行為是使用 stat() 系統呼叫所傳回的簡單模式位元。但是,許多作業系統有其他功能來定義更複雜的存取權限,例如 ACL(存取控制清單)。對於此類環境,use filetest
可能有助於權限運算子傳回與其他工具更一致的結果。
use filetest
或 no filetest
陳述會影響其區塊中定義的檔案測試,直到最近的封閉區塊結束(它們是詞彙區塊範圍)。
目前,僅實作 access
子 pragma。它會在可用的時候啟用(或停用)access(),也就是在大部分 UNIX 系統和其他 POSIX 環境中。請參閱以下詳細資料。
stat() 模式位元可能適用於系統中找到的大部分檔案和目錄,因為很少人想要使用 access() 提供的其他功能。但是,如果程式在使用 ACL 的系統上執行,您可能會遇到意外情況,因為 stat() 資訊不會反映實際的權限。
當 filetest pragma 生效時,檔案測試作業可能會稍微降低效能,因為檢查位元非常便宜。
此外,請注意,從一開始就使用檔案測試來確保安全性是一件徒勞無功的事:競爭條件已開啟一個視窗(誰能保證在測試和實際操作之間權限不會改變?)。因此,如果您認真看待安全性,請嘗試實際操作並測試其是否成功 - 思考原子操作。當您不需要磁碟上元素的內容時,檔案測試更適用於檔案系統管理任務。
UNIX 和 POSIX 系統提供抽象的 access() 作業系統呼叫,應使用該呼叫查詢讀取、寫入和執行權限。此函數隱藏了其他作業系統特定安全功能中的各種不同方法,例如存取控制清單 (ACL)
只有當運算子的引數是檔案名稱(而非檔案控制代碼)時,Perl 才會使用延伸的檔案測試功能。
_
的限制由於 access() 沒有呼叫 stat()(至少在 Perl 中不可見),因此不會設定 stat 結果快取「_」。這表示下列兩個測試的結果不同。第一個在 _
中有 /etc/passwd 的 stat 位元,而在第二個案例中,這仍然包含 /etc
的位元。
{ -d '/etc';
-w '/etc/passwd';
print -f _ ? 'Yes' : 'No'; # Yes
}
{ use filetest 'access';
-d '/etc';
-w '/etc/passwd';
print -f _ ? 'Yes' : 'No'; # No
}
當然,除非您的作業系統沒有實作 access(),否則實用程式將會被忽略。最好在檔案測試實用程式處於活動狀態的檔案中完全不使用 _
!
由於 _
不起作用,因此堆疊的檔案測試運算子(-f -w $file
)也不會起作用。
此限制可能會在未來的 perl 版本中移除。