グループで使用できるプログラムがあるため、デフォルトでは出力にはグループ書き込み権限が必要であるため、umask 002
当然、すべてのユーザーがこれを行うことができます(umask 002 && cmd)
。しかし、これは面倒でエラーが発生しやすいので、cmdでumaskを設定したいと思います。これはどのように達成できますか? cmdはシェルコマンドを生成できます。
Pythonに組み込みのソリューションがあるため、これは可能です(コード#1を参照)。https://www.geeksforgeeks.org/python-os-umask-method)。まあ、他の言語がありますが、os
Pythonでどのように実行されているのかを知ることが役に立ちます。https://hg.python.org/cpython/file/v2.7.3/Modules/posixmodule.c#l2677)。
ベストアンサー1
それらのためにこれをしなさい(umask 002 && cmd)
。
実際のプログラムを起動する前に、umaskを設定するスクリプトを作成してください。次に、実際のコマンドの前にラッパースクリプトを配置するか、PATH
プログラム自体の名前を変更して、その場所にラッパースクリプトを配置します。 (ただし、名前が変更されたプログラムは必ずスクリプトから呼び出さなければなりません。)
たとえば、プログラムがあり、PATHに最初のプログラムがある/usr/bin/foo
場合は、次のようにします。/usr/local/bin
/usr/local/bin/foo
#!/bin/sh
umask 002 &&
exec /usr/bin/foo "$@"
("$@"
すべてのコマンドライン引数をプログラム自体に渡します。)
または、名前/usr/bin/foo
をに変更して/usr/bin/foo.orig
スクリプトをインストールして/usr/bin/foo
実行します/usr/bin/foo.orig
。
もちろん、プログラム自体を変更できますが、ラッパーを使用すると、プログラムの実装方法に関係なく動作します。ただし、スクリプトの名前を変更して置き換えると、アップグレード時に問題が発生する可能性があります。新しいバージョンによってスクリプトが破損する可能性があるため、別のディレクトリを使用する方が良いかもしれません。 (Debianには、dpkg-divert
パッケージマネージャにファイルを他の場所に置くように指示するために使用できる同様のものがありますが)
先ほどプロセスを開始したので、これは簡単です。 umask 強制変更すでに実行中外部からのプロセスはまったく異なる問題であり、標準ツールを使用することは不可能です。
(Linuxでは、プログラムへの接続を使用して、実際のプログラムが知らない間にシステムコールを実行させることがgdb
できますが、これは面倒でデバッグが制限されていない場合にのみ機能します。現代のシステムではこれが可能です。)umask()
kernel.yama.ptrace_scope