web-dev-qa-db-ja.com

コマンドラインで設定された権限でファイルを作成できますか?

ディレクトリを作成する場合、mkdir -m <mode> <dir>は、指定されたモード/権限セットを(原子的に)1つ以上のディレクトリを作成するために提供されます。

コマンドラインでファイルを作成するための同等のものはありますか?

次のようなもの:

open("file", O_WRONLY | O_APPEND | O_CREAT, 0777);

ここでtouchの後にchmodを使用するのが私の唯一のオプションですか?


編集:installを使用するというteppicの提案を試した後、straceを実行して、アトミックにどれだけ近いかを確認しました。答えは、それほどではありません。

$ strace install -m 777 /dev/null newfile
...
open("newfile", O_WRONLY|O_CREAT|O_EXCL, 0666) = 4
fstat(4, {st_mode=S_IFREG|0666, st_size=0, ...}) = 0
...
fchmod(4, 0600)                         = 0
close(4)                                = 0
...
chmod("newfile", 0777)                  = 0
...

それでも、これは単一のシェルコマンドで、以前は知らなかったものです。

38
quornian

installコマンド(GNU coreutils)の一部)をダミーファイルで使用できます。

install -b -m 755 /dev/null newfile

-bオプションは、すでに存在する場合はnewfileをバックアップします。このコマンドを使用して、所有者を設定することもできます。

48
teppic

touchは、ファイルが存在しない場合は常に作成し、常にシンボリックリンクをたどり、常にファイルを実行不可にします。 mask を使用して、読み取りビットと書き込みビットを決定できます。

(umask 077; touch file)  # creates a 600 (rw-------) file
(umask 002; touch file)  # creates a 664 (rw-rw-r--) file

「安全な」アトミックファイルの作成(特にO_NOFOLLOWを使用)は、従来のシェルツールでは不可能です。 Perlではsysopenを使用できます。 BSD風のmktempユーティリティがある場合、O_NOFOLLOWでアトミックにファイルを作成します。デフォルトモードの600が適切でない場合は、後でchmodを呼び出す必要があります。

@teppicの答えに基づいて、コンテンツとモードを同時に持つファイルを作成したい場合(bash):

_install -m 755 <(echo commands go here) newscript
_

<()は、出力を一時ファイルに配置します。 Process-Substitution を参照してください。

0
laktak