그룹에서 사용할 수 있는 프로그램이 있으므로 기본적으로 출력에는 그룹 쓰기 권한이 있어야 하므로 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
.
물론 프로그램 자체를 수정할 수 있지만 래퍼를 사용하면 프로그램 구현 방식에 관계없이 작동합니다. 하지만 스크립트 이름을 바꾸고 교체하는 것은 업그레이드 시 문제가 될 수 있습니다. 새 버전으로 인해 스크립트가 손상될 수 있으므로 다른 디렉토리를 사용하는 것이 더 나을 수 있습니다. (데비안에는 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)'
8 O
진수 형식을 나타냅니다.
print, call_external('libc.so.6', 'umask', 0, 0), format='(O)'
이것은 작동하지만 idl에서는 이상하게 작동합니다. 이는 또 다른 이야기입니다. (누군가는 call_external('libc.so.6', 'umask', 2, /value)
이것이 필요할 것이라고 예상했습니다. umask에 전달된 숫자는 인수의 수인 것 같습니다. umask가 원래 0022였을 때 첫 번째 호출은 18!?을 반환했습니다.)