![修改正在运行的进程的umask](https://linux22.com/image/206039/%E4%BF%AE%E6%94%B9%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E8%BF%9B%E7%A8%8B%E7%9A%84umask.png)
我有一个程序,可以由一个组使用,因此默认情况下输出应该具有组写入权限,因此umask 002
.当然每个用户都可以这样做(umask 002 && cmd)
。但由于这很麻烦而且容易出错,所以我想在cmd中设置它的umask。如何才能做到这一点? cmd 可以生成 shell 命令。
这似乎是可能的,因为 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
实际命令之前的某个位置,或者重命名程序本身并将包装脚本放在其位置。 (不过,请确保从脚本中调用重命名的程序。)
例如,如果程序是/usr/bin/foo
,并且您/usr/local/bin
在 PATH 中有第一个,则创建/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)
- idl:
print, call_external('libc.so.6', 'umask', '0002'O, /all_value, /auto_glue), format='(O)'
其中O
表示八进制格式。
print, call_external('libc.so.6', 'umask', 0, 0), format='(O)'
这可行,但在 idl 中表现得很奇怪,这是另一个故事了。 (有人期望call_external('libc.so.6', 'umask', 2, /value)
这是必需的。传递给 umask 的数字似乎是 args 的数量。当 umask 最初是 0022 时,第一次调用返回 18!?)。