/etc/profile 및 /etc/bashrc에서 umask를 프로그래밍 방식으로 유지 관리하는 방법

/etc/profile 및 /etc/bashrc에서 umask를 프로그래밍 방식으로 유지 관리하는 방법

프로그래밍 방식으로 파일을 에 추가하는 방법을 찾고 있습니다 /etc/profile. /etc/bashrc다음과 같은 항목이 있습니다.

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

if그래서 위의 첫 번째 문장을 프로그래밍 방식으로 확인하고 싶습니다. 발견되면 다음 줄이 umask(주석 아님)인지 확인하고, 그렇다면 표준 umask에서 벗어나면 다시 설정하세요. 전체 파일을 복사할 수 있지만 다른 변경 사항을 방해하고 싶지는 않다는 것을 알고 있습니다. 누군가가 sed/awk/grep을 사용했고 이를 달성하는 방법에 대한 아이디어를 공유하거나 가질 수 있다고 확신합니다. 로그인 쉘과 비로그인 쉘에 대한 umask를 유지해야 합니다. 이것은 이것을 참조한다https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/ Assembly_managing-the-umask_configuring-basic-system-settings. 감사해요.

답변1

이것이 왜 의미가 있는지는 모르겠지만(댓글 참조) 작업은 다음과 같이 수행할 수 있습니다.

sed -i".bak" '\_if \[ $UID -gt 199 ] && \[ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then_,/^[^#]*else/s/^\([^#]*umask\).*/\1 002/' /etc/profile /etc/bashrc

주소 범위는 if해당 절과 다음 주석 없음 사이의 모든 줄을 포함합니다 else. 이 줄에서 umask주석 해제를 로 변경합니다 002.

이스케이프해야 하며 [모든 슬래시가 이스케이프되는 것을 방지하기 위해 첫 번째 주소의 구분 기호로 밑줄을 선택했습니다.

누군가/무언가가 실제로 이러한 파일을 변경하는 경우 해당 줄에 대해 보다 유연한 모드를 사용하는 것을 고려할 수 있습니다 if. 그렇지 않으면 if줄이 변경될 때 umask스크립트가 중단됩니다 . 아마도

sed -i".bak" '/if.*$UID *-gt *199/,/^[^#]*else/s/^\([^#]*umask\).*/\1 002/' /etc/profile /etc/bashrc

답변2

프로그래밍 방식으로 파일을 에 추가하는 방법을 찾고 있습니다 /etc/profile. /etc/bashrc다음과 같은 항목이 있습니다.

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

프로그래밍 방식으로 if위의 첫 번째 문을 확인하고 싶습니다. 발견되면 다음 줄이 umask(주석 아님)인지 확인하고, 그렇다면 표준 umask에서 벗어나면 다시 설정하세요.

댓글은 왜 중간에 뜨나요 if? 귀하의 예에서는 그렇지 않습니다. 다음을 통해 이 프로세스를 크게 단순화할 수 있습니다.코드 형식은 동일합니다.어디서나 존재 여부를 확인해야 합니다. 이 작업을 수행할 수 있다면 트릭을 수행할 Python 스크립트가 있습니다. 삼중따옴표 사이의 코드 텍스트가 다음과 같은지 확인하세요.정확히확인하려는 파일에서도 동일한 현상이 발생합니다(이 경우 코드가 스크립트에 여러 번 나타나는 경우 실제로 문제가 발생하지는 않지만).

snippet = '''
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi
'''
with open('/etc/profile','r+') as f:
    if snippet not in f.read():
        f.write(snippet)
with open('/etc/bashrc','r+') as f:
    if snippet not in f.read():
        f.write(snippet)

sudo쓰기 위치는 루트가 소유하므로 다음을 사용해야 합니다.sudo python myscript.py또는sudo python3 myscript.py. 스크립트는 정의된 텍스트 블록이 /etc/bashrc포함되어 있는지 확인 하고 포함되어 있지 않으면 파일에 추가합니다./etc/profilesnippet

그만한 가치가 있나요?

/etc/bashrc이제 의 내용과 내용이 변경될 수 있다는 우려를 표명하셨으니 /etc/profile, 누가 그러한 변경을 할 것이라고 생각하시는지 알고 싶습니다. 시스템 자체라면 어차피 사용하려는 umask 값이 기본값이기 때문에 시스템이 이를 다른 것으로 바꾸는 것을 볼 수는 없습니다. 반면에, sudoer파일을 가지고 장난을 치는 사람이 있거나 다른 사람이 있다면...

코드 텍스트가 스크립트에 있음을 알려주는 테스트는 해당 코드가 실행될지 여부를 알려주지 않는다는 점을 인식하는 것이 중요합니다. 그것은너무 쉽게뭔가하다연약한변화는코드가 실행되지 않도록 설정대본에 있었음에도 말이죠.

코드가 실행되기만 하는 경우 false = true(즉, 전혀 실행되지 않는 경우) 발생하는 상황은 다음과 같습니다.

if false; then

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

fi

이 코드는 호출되지 않는 HEREDOC 문자열로 코드를 래핑합니다.

: <<'no-umask-4u'

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

no-umask-4u

이는 코드가 실행된 후 umask를 변경합니다(여기에는 매우 간단한 예가 있습니다).

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

umask 077

무엇을 해야 할까요? 위의 모든 시나리오에서 코드가 실제로 실행되지 않더라도(또는 마지막으로 실행되었지만 덮어쓴 경우) 스크립트에 코드 텍스트가 있는지 확인하는 프로그래밍 방식 테스트는 통과됩니다.

전체 파일을 복사할 수 있지만 다른 변경 사항을 방해하고 싶지는 않다는 것을 알고 있습니다.

파일의 sha1 해시를 생성하고 변경되었는지 확인하는 것이 좋습니다(단순히 코드가 파일의 어딘가에 있는지 확인하는 것보다 확실히 더 안정적입니다). 당신이 우려하는 '다른 변화'의 근원이 무엇인지 궁금합니다.

관련 정보