2016-12-25 4 views
4

は、私はPerlでのファイルは/ var/tmpの/ファイル名たPerl:ファイルのアクセス権のチェックとは対照的に、

を持って、私は次のスニペット

#!/usr/bin/env perl 
use strict; 
use warnings; 

if (-W /var/tmp/filename) 
{ 
... 
} 

exit; 
を書くと言う**書き込み可能な実際**ファイルであることを確かめるテスト

-Wおよび-w関数(http://perldoc.perl.org/functions/-X.html)は、が実際にに書き込まれることを確認するか、ファイルのアクセス許可が書き込みを許可することを確認するだけですか?書き込みを許可しますか?

私が尋ねる理由は、サーバーからクッキーを取得するスクリプトを作成していることです。

このスクリプトは、クッキーファイルをファイルシステムに書き込むことができる必要がありますが、クッキーファイルへのファイルシステムパスが読み取り専用の場合、ファイルのアクセス権は問題になりません。だから私は調理師が実際にはの書き込み可能であるかどうかを試してみたい。

+0

私は意図的にファイルシステムを読み取り専用にするシステムを持っていないので、私はそれをテストすることができませんでした。したがって、どのように-wと-Wが動作するのかという問題。 – Speeddymon

+0

あなたはCDまたはDVDを試すことができます。これらは読み取り専用のファイルシステムです。 –

+0

私はRackspaceによってホストされているクラウドサーバでこれを書いているので、残念ながらサーバへの物理的なアクセスはありません。私のサーバーでもないので、私はrootを持っていません。 – Speeddymon

答えて

4

場合は、あなたがいるかどうかを確認することができます

あなたは、touchコマンドを使用することができます読み取り専用でマウントされます。その場合、/proc/mountsの行にはroがあるので、roとファイルシステムの行にはファイルgrepを開きます。

これは/procを使用するファイルシステムでのみ機能しますが、あなたのファイルシステムでは機能します。

mountでクエリするのは信頼性が低いことに注意してください。

確かにファイルを書き込もうとするのですが、そのためにはFile::Tempを使用します。

0

はい。

if (-r $file && -w $file) { 
    # file exists, I can read and write it 
} 
+0

申し訳ありませんが、それはすでに質問で対処されています。私は、ファイルが書き込み可能かどうかをテストするために-w関数が実際にopen()呼び出しを '>'演算子で実行するかどうか、あるいは-w関数が単にstat()を使ってファイルのアクセス権をチェックするかどうか調べたいと思います。 – Speeddymon

+1

statとのパーミッションをチェックします。 'ACLを使用している場合は、filetestというプラグマがあり、これは、ベア・スタット・モード・ビットよりも正確な結果を生成する可能性があります。 ' –

3

一般に、-X演算子は、ファイルが実際に書き込み可能かどうかではなく、ファイルモードをテストするだけです。したがって、実際に操作をテストし、失敗をキャッチする必要があります。

http://perldoc.perl.org/functions/-X.htmlから

ファイルパーミッション演算子の解釈-r、-R、-w、-W、-x、および-Xは、デフォルトでは、ファイルのモードのみに基づいて、ユーザーのuidとgid。ネットワークファイルシステムアクセス制御、ACL(アクセス制御リスト)、読み取り専用ファイルシステム、認識できない実行形式など、実際にファイルを読み書きしたり実行したりすることができないその他の理由があります。競合状態になる可能性があるため、これらの6つの特定の演算子を使用して、ある種の操作が可能かどうかを検証するのは通常間違いです。

私は、読み取り専用のファイルシステム・イン・ファイルの私のテスト・システム(Ubuntuの16.04)上のマウントをループバックと-Wフラグが実際に誤っレポートファイルができることをして、これを単に確認しましたに書かれている。実行backticsを使用する場合にこれが成功した場合に長さゼロの文字列を返します

$ touch /media/MountPoint/testfile 
touch: cannot touch '/media/MountPoint/testfile': Read-only file system 

:あなたの懸念はファイルシステムがある

unless (length `touch $filename`) 
{ 
    print "Can write\n"; 
} 
+2

リターン・コードも生成されませんか?それは私の心にとってより良いテストに見えます。 – Sobrique

関連する問題