프로그래밍 방식으로 파일을 에 추가하는 방법을 찾고 있습니다 /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/profile
snippet
그만한 가치가 있나요?
/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 해시를 생성하고 변경되었는지 확인하는 것이 좋습니다(단순히 코드가 파일의 어딘가에 있는지 확인하는 것보다 확실히 더 안정적입니다). 당신이 우려하는 '다른 변화'의 근원이 무엇인지 궁금합니다.