web-dev-qa-db-ja.com

出力をリダイレクトするときに特定のファイル権限を設定するにはどうすればよいですか?

これはおそらく重複していますが、私の検索ではすべて、許可が拒否されたエラーに関する質問が表示されています。

Bashシェルでコマンドを実行しています。出力をリダイレクトして、最初の実行時におそらく存在しないファイルに追加したいと思います。出力リダイレクトでこのファイルを作成する必要がある場合は、特定のファイルアクセス許可モードを設定します。 1つのコマンドでこれを行う方法はありますか?

たとえば、私はしようとするかもしれません

foo >> /tmp/foo.log 0644

ここで、0644は、foo.logに最終的に与えたいアクセス許可です。私がbashで試したほとんどのコマンドは、0644fooへの追加の引数として解釈することになります。

これにより、書き込みの前または後に、アクセス許可をchmodに2番目のコマンドで取得するという感じがします。

GNU bash 4.2.25とUbuntu 12.04を使用しています。違いがある場合-一般的な答えが優先されます。

11
Patrick M

私の知る限り、パイプ処理中にそれを行う方法はありません。単純なスクリプトが最善の解決策かもしれません。

if [ -e /tmp/foo.log ]; then
    foo >> /tmp/foo.log
else
    foo >> /tmp/foo.log
    chmod 0644 /tmp/foo.log
fi
5
user270595

古い質問だとは思いますが、2セント追加したいと思いました。

私は同じ考えを持っていて、 BowlesCR のような解決策を思いつきました。彼の解決策の問題は、実行する前にumaskを変更するとコマンド(foo)が機能しないことでした。これが問題の私の見解です。

foo | ( umask 0033; cat >> /tmp/foo.log; )

ここで、umaskは、サブシェルのfoo.logへのリダイレクトにのみ影響します。他のすべては影響を受けません。

少し複雑ですが、機能します。

14
xynomorf

真のスクリプトがなければ、少し連鎖できます。

_touch /tmp/foo.log; chmod 0644 /tmp/foo.log; foo >> /tmp/foo.log
_

実質的に Slowkiの回答 に似ていますが、ワンライナーに凝縮されています。

私が考えることができる他の唯一のものは、umaskをいじくることです。現在の環境を汚染しないように、サブシェルでこれを行うのが最善です。

_(umask 0033 && foo >> /tmp/foo.log)
_

ただし、それには2つの問題があります。

  1. Umaskは、creat() syscallで指定されたレベル(0666はBashが使用しているように見える)を超える権限を上げることはできません。
  2. これは既存のファイルの権限を変更しません(umaskはファイルcreationにのみ適用されるため)。
5
BowlesCR

リダイレクトが間違った許可を設定した場合、例えば:

$ rm capture.*
$ Perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ Perl -e 'print STDERR "$$ STDERR\n"; print STDOUT "$$ STDOUT\n"' \
                            >> capture.STDOUT 2>> capture.STDERR
$ ls -l capture.*
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDERR
-rw-rw-rw- 1 jcookinf jcookinf 22 Jun 12 10:38 capture.STDOUT
$ cat capture.*
215 STDERR
216 STDERR
215 STDOUT
216 STDOUT

私は、xynomorfのようなものを使用でき、Orsiris de Jongからのstderrの懸念に少し変更して bashプロセスの置換 を使用するように対処できると思います。

$ rm capture.*
$ Perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ Perl -e 'print STDERR "$$ STDERR text\n"; print STDOUT "$$ STDOUT text\n"' \
            > >(umask 0033; cat >> capture.STDOUT) 2> >(umask 0033; cat >> capture.STDERR)
$ ls -l capture.*
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDERR
-rw-r--r-- 1 jcookinf jcookinf 32 Jun 12 10:43 capture.STDOUT
$ cat capture.*
233 STDERR text
238 STDERR text
233 STDOUT text
238 STDOUT text

当然、umask 0077を使用してモード600を取得し、他のユーザーがコンテンツを表示できないようにします。

1
piCookie

umaskとは異なり、プロセス置換とinstallを使用してスクリプトにリダイレクトする場合は、実行ビットを設定することもできます。

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

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

0
laktak