5

いくつかのファイル/ディレクトリを更新する bash スクリプトを作成しています。スクリプトで umask を実行して、スクリプトによって作成されたファイル/ディレクトリのデフォルトのアクセス許可を設定したいと考えています。ファイルとディレクトリの両方のアクセス許可を設定するためにumaskできることはわかっていますが、ファイルとフォルダーのアクセス許可を変える必要があります。

I want files to be:   -rw----r-- (0604)
I want folders to be: drwx-----x (0701)

umask を使用してこれを行うことはできますか? もしそうなら、どうすればそれを行うことができますか?そうでない場合、それを達成するための最良の方法は何ですか? 前もって感謝します。

4

3 に答える 3

9

興味深い要件。現在 (少なくとも ではbash)umaskはグローバル設定であり、オブジェクト タイプに基づいて設定することはできません。

頭に浮かぶ解決策の 1 つは、 をファイル バリアントに設定し、 (パスの前にあるユーザー作成スクリプトなどを使用して) へのumask呼び出しをインターセプトして、次のことを行うことです。mkdirmkdir

umask 0701 ; /path/to/real/mkdir $1 ; umask 0604

そうすれば、すべてのディレクトリの作成が で行われていると仮定mkdirすると、別の設定を使用することが保証されumaskます。

umaskスクリプトは、強制的に実行するのではなく以前のものを復元するなど、おそらくもう少し堅牢にする必要があることに注意してください。また、0604より優れたエラーチェックと、複数の引数を処理する機能を追加することもできます。

しかし、それはすべての詳細です。上記のフレームワークは、開始するのに十分なはずです。

于 2012-09-16T08:53:44.200 に答える
5

これumaskは、ファイルではなくプロセスの属性です。これは UNIX アーキテクチャの一部であり、Bash やその他のシェル プログラムとは関係ありません。

実際の問題は、使用しているプログラムでは、作成時に権限を変更できないことです。たとえば、C ではmkdir、2 番目のパラメータであるmodeがあります。

ただし、C を記述する必要はありません。Python と Perl を使用すると、低レベルのインターフェイスを使用できます。アクセス許可はプロセスによって変更されるため、変更が不要な場合はゼロumaskに設定してください。unmask

/home/user1> umask 000
/home/user1> python -c 'import os;os.mkdir("mydir",0701)'
/home/user1> ls -ld mydir
drwx-----x 2 user1 QAPLADV 4096 Sep 16 10:28 mydir

/home/user1> python -c 'import os;os.open("myfile",os.O_CREAT,0604)'
/home/user1> ls -l myfile
-rw----r-- 1 user1 QAPLADV 0 Sep 16 10:32 myfile

この時点ではまだ 000 であることを忘れないでくださいumask。同じプロセスで他の作業を行っている場合は、以前の値に戻すことをお勧めします。

必要に応じて、Perl バージョンを次に示します。

perl -e "mkdir mydir,0701"
perl -MFcntl -e 'sysopen(my $h,"myfile",O_EXCL|O_CREAT,0604)'

もちろん、多数のファイルがあり、これを頻繁に実行する可能性が高い場合は、Perl または Python プログラムを作成してその作業を行う方がはるかに優れています。ファイルごとに perl または python を呼び出すのは少し非効率的です。 .

于 2012-09-16T09:53:38.920 に答える