修改正在运行的进程的umask

修改正在运行的进程的umask

我有一个程序,可以由一个组使用,因此默认情况下输出应该具有组写入权限,因此umask 002.当然每个用户都可以这样做(umask 002 && cmd)。但由于这很麻烦而且容易出错,所以我想在cmd中设置它的umask。如何才能做到这一点? cmd 可以生成 shell 命令。

这似乎是可能的,因为 python 中有一个内置的解决方案(参见代码#1)https://www.geeksforgeeks.org/python-os-umask-method)。好吧,我还有另一种语言;但知道它是如何在ospython 中完成的可能会有所帮助(我被困在这里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.umaskPython:可以使用内置的:
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!?)。

相关内容