lines=$(grep '^[^:]\+::' /etc /shadow)
전체 명령은 무엇을 의미합니까?
무슨 뜻이에요 '^[^:]\+::'
?
내가 if else
이렇게 선언한다면:
if [ "$lines" == "" ]; then
비밀번호가 비어 있는 사용자(내가 원하는 것)가 표시됩니까?
답변1
grep
/(따라서 이름)에서 명령을 구현하는 명령입니다 g/<RE>/p
. 즉, 주어진 정규식(regex 또는 줄여서 regexp)과 일치하는 행을 인쇄합니다.ed
ex
p
r
e
여기서는 '^[^:]\+::'
정규 표현식입니다(셸이 일부 문자를 특별하게 처리하지 않도록 따옴표를 사용). 보다 정확하게는(정규식의 구현이 여러 개 있고 grep
대부분이 정규식의 여러 변형을 처리할 수 있기 때문에) 이는 GNU 기본 정규식입니다.
정규식은 문자열을 일치시키는 데 사용되는 패턴입니다. grep
각 줄의 내용을 패턴과 비교하고 일치하는 항목을 인쇄합니다.
^
일치시킬 문자열의 시작 부분과 일치하는 기본 정규식 연산자입니다. 문자열의 시작 부분에 검색을 고정한다고 말합니다. 그렇지 않으면 검색은 줄 내의 어느 곳에서나 이루어집니다.[^:]
모든 문자와 일치하지만:
\+
GNU 특정 비표준 정규식 연산자입니다(비록 현재 이를 지원하는 다른 구현을 찾았지만). 이는 하나 이상의 선행 원자를 의미합니다. 이는 표준 기본 정규식 연산자의 약어입니다\{1,\}
.:
특별하지도 않고 잘 어울리는데요.
그래서 여기서 정규식은 라인과 일치합니다시작:
뒤에 두 개의 문자가 오지 않는 한 하나 이상의 문자를 포함하는 시퀀스입니다 :
.
의 맥락에서 /etc/shadow
이는 항목이 3개 이상의 필드와 일치하고 사용자 이름 필드가 비어 있지 않지만 비밀번호 필드가 비어 있음을 의미합니다(일반적으로 사용자가 비밀번호 없이 로그인할 수 있음을 의미함). root::
에서는 일치 x::whatever
하지만 root:x:
또는 에서는 일치하지 ::whatever
않습니다 root:
.
grep
또한 종료 상태를 통해 어떤 줄과 일치하는지 보고합니다.
- 일치하는 항목이 하나 이상 있으면 성공
- 그렇지 않으면 실패하거나 오류가 발생합니다.
쉘에 의해 할당된 종료 상태는 명령 대체에서 실행된 마지막 명령의 종료 상태입니다.
예를 들어 종료 상태
var=$(exit 2)$(exit 4)
4가 될 것이다.
여기서는 다음과 같이 할 수 있습니다.
if lines=$(grep '^[^:]\+::' /etc/shadow); then
printf 'There are users with an empty password:\n%s\n' "$lines"
else
printf 'OK, no user with empty passwords'
fi
답변2
grep '^[^:]\+::' /etc/shadow
정규식 패턴이 올바르지 않기 때문에 아무것도 표시되지 않습니다.
시스템 계정과 연결된 암호가 없는 사용자를 찾을 수 있을 것 같습니다. 이 경우 다음을 수행하십시오.
grep '^[^:]\+:.:' /etc/shadow
분석해 보겠습니다.
^[^:]\+
:
줄의 시작 부분부터 다음 줄까지의 부분, 즉 사용자 이름을 찾습니다.사용자 이름 뒤에는
:
정규식 토큰으로 표시되는 단일 문자.
(!
또는*
)가 오고 그 뒤에는:
.