쉘 명령이 있습니다.
printf '/^PermitRootLogin/\nc\nPermitRootLogin no\n.\nw\nq\n' | ed -s /etc/ssh/sshd_config
문장에서 이 문구를 사용하여 #PermitRootLogin
유사 PermitRootLogin
하지만 주석 처리되지 않은 단락을 캡처해야 합니다. 저는 ed 텍스트 편집기를 사용하고 있으며 RegExp를 사용하여 해당 명령의 모든 항목을 캡처하는 방법을 찾으려고 노력하고 있습니다.
이 OS에는 GNU 유틸리티가 없습니다. 답변 주셔서 감사합니다!
답변1
정규식은 쉘 글로브 패턴과 동일하지 않습니다. 이는 줄의 시작 부분과 일치하고 이전 하위 표현식의 0 또는 1(이 경우 )을 나타내기 ^?
때문에 정규 표현식으로서 유효한 의미가 없습니다 .^
?
^
이 시도:
grep `^.?SomeString`
설명하다:
^ anchors the match to the start of the line
.? means 0 or 1 of any character
SomeString match "Somestring"
답변2
ㅏ,나, 그리고씨독립적인 명령이므로 뒤에 텍스트가 와야 합니다.다음 줄에. 따라서 다음 줄을 마무리해야 합니다.씨. 당신은 이미 그것을 얻었습니다 \
. 방금 잊어버린 것 같습니다 n
.
printf '/^PermitRootLogin/\nc\NPermitRootLogin 아니요\n. \nw\nq\n' | ed -s /etc/ssh/sshd_config ↑
답변3
- 구성 파일에 절대 나타나지 않는 임의의 문자열을 선택하십시오.
/
,.
,*
등[
의 특수문자는 사용하지 않는 것이 좋습니다]
. 예를 들어 를 사용하겠습니다<G-Man>
. 다음을 수행하십시오.
ed -s /etc/ssh/sshd_config << EOF g/^#*PermitRootLogin/s/^/<G-Man>/ g/^<G-Man>##*PermitRootLogin...../s/<G-Man>// 1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/ w q EOF
이것은 무엇을 합니까?
모든 행을 찾습니다
- 로 시작
PermitRootLogin
하거나 - 하나 이상의
#
문자로 시작하고 그 뒤에PermitRootLogin
최대 4개의 다른 문자가 옵니다.
로 변경하고
PermitRootLogin no
줄#
시작 부분의 문자를 그대로 유지합니다.- 로 시작
아? 무엇? 왜 이런 일을 하는가?
목표는 다음 줄 중 하나를 변경하는 것입니다.
PermitRootLogin yes PermitRootLogin no PermitRootLogin The quick brown fox jumps over the lazy dog. #PermitRootLogin yes #PermitRootLogin no
그러나 다음 줄은 아닙니다.
#In this section we set #PermitRootLogin to “maybe”, #because we haven’t decided yet.
이 디자인에는 다음과 같은 불행한 부작용이 있을 수 있습니다.
##PermitRootLogin yes ##PermitRootLogin ???
~ 할 것이다변경하고 다음 줄을 추가합니다.
PermitRootLogin yes # PermitRootLogin yes #PermitRootLogin yes
하지 않을 것이다.
- 어떻게 작동하나요?
g/^#*PermitRootLogin/s/^/<G-Man>/
PermitRootLogin
로 시작 하거나#
바로 뒤에 하나 이상의 문자로 시작 하는 모든 줄을 찾아PermitRootLogin
문자열로 "표시"합니다<G-Man>
(줄 시작 부분에 삽입).PermitRootLogin
문자 앞이나 뒤에 공백(또는 다른 것)이 없으면 주석 처리된 행에 영향을 미칩니다 .#
g/^<G-Man>##*PermitRootLogin...../s/<G-Man>//
라벨이 있는 모든 행 찾기마지막 하나#
시작 부분에 5자 이상의 문자가 오고PermitRootLogin
태그를 제거하세요.PermitRootLogin
길이를 초과하는 주석 줄의 표시가 해제됩니다yes
. (물론 수량을 변경할 수 있습니다..
당신이 할 의향이 있다면. )1,$s/^<G-Man>\(#*PermitRootLogin\).*/\1 no/
여전히 마커가 있는 모든 줄을 찾아 마커를 제거PermitRootLogin
하고 모든 이전#
문자를 캡처하여 유지하고 나머지 줄을no
.
- 물론,
printf
원하는 경우 이러한 명령을 a로 축소할 수 있습니다.