스크립트에서 sed를 사용하는 사용자에 대한 sudo 액세스 권한을 취소해야 합니다.
행에 /bin/su가 포함된 경우에만 사용자에게 주석을 달고 싶습니다. - root
첫 번째 행에만 주석을 달아야 하는 다음 파일을 고려해 보겠습니다.
mindadmin ALL = NOPASSWD: /bin/su - root
mindadmin ALL = NOPASSWD: /bin/ifconfig
내가 사용한 명령은 sed
다음과 같습니다.
sed -e 's/minadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+/bin/su - root/#mindadmin ALL = NOPASSWD: /bin/su - root/g' /etc/sudoers
하지만 작동하지 않습니다. 문법적 오류가 있나요?
답변1
두 가지 문제가 있습니다. 첫 번째는 sudoers
has mindadmin
와 mode minadmin
(nothing d
)입니다.
두 번째 문제는 /
s 의 /bin/su
정규 표현식에서 다음을 이스케이프 처리해야 한다는 것입니다.
sed -e 's/mindadmin[\s]+ALL[\s]+=[\s]+NOPASSWD:[\s]+\/bin\/su - root/#mindadmin ALL = NOPASSWD: \/bin\/su - root/g' /etc/sudoers
그렇지 않으면 패턴이 종료됩니다.
대신 다른 구분 기호를 선택할 수도 /
있으며 파일에 해당 구분 기호가 나타나지 않는 한 이스케이프할 필요가 없습니다.
답변2
sed '/\/bin\/su - root/ s/^/#/' filename
파일 이름에 포함된 줄을 찾아 /bin/su - root
줄 시작 부분에 주석(#)(^)을 추가합니다.
파일에 영향을 미치도록 sed에 옵션을 추가합니다 -i
.
답변3
/bin/su - root
줄 끝을 포함하여 모든 줄을 주석 처리하려면 sed 표현식을 단순화하면 됩니다.
sed 's/.*\/bin\/su - root$/#&/'
아니면 더 간단하게
sed 's,.*/bin/su - root$,#&,'
/bin/su - root
포함 라인의 모든 라인을 주석 처리하려면 다음을 수행하십시오 .
sed 's,.*/bin/su - root,#&,'
답변4
&
일치하는 패턴 전체가 교체되므로 또 다른 해결 방법은 다음과 같습니다 .
sed -i 's,.*/bin/su\s\+-\s+root,#&,' /etc/sudoers
/
다른 구분 기호로 대체되므로 이스케이프할 필요가 없습니다. su 명령 뒤의 간격이 다른 경우에도 이 모드는 더 유연합니다.
최소값만 변경하는 경우디관리자 사용자:
sed -i 's,^mindadmin\s.*/bin/su\s+-\+root,#&,' /etc/sudoers
플래그 -i는 변경 사항을 파일에 직접 적용합니다.