グループで使用できるプログラムがあるため、デフォルトでは出力にはグループ書き込み権限が必要であるため、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
答え2
したがって、cmdを呼び出す必要がありますumask
( "libc.so.6"から)。
例:
- bash:cmdがbashスクリプトの場合は、cmdスクリプトに移動できます。
umask 2
os.umask
Python:組み込み機能を使用できます。
import os
oct(os.umask(0o0002))
- Python:cライブラリ呼び出しを表示するために再実装されました(unix)
from ctypes import CDLL
libc = CDLL("libc.so.6")
libc.umask(2)
- アイドル:
print, call_external('libc.so.6', 'umask', '0002'O, /all_value, /auto_glue), format='(O)'
8O
進数の形式を表します。
print, call_external('libc.so.6', 'umask', 0, 0), format='(O)'
これはうまくいきますが、idlでは奇妙に動作します。これは別の話です。 (誰かがcall_external('libc.so.6', 'umask', 2, /value)
これが必要になると予想しました。umaskに渡された数字は引数の数のようです。umaskが元の0022だったとき、最初の呼び出しは18!?を返しました。)