
MSSQL 데이터베이스의 사용자 목록과 비활성화된 AD 사용자 목록을 비교하는 스크립트를 만들었습니다. AD 인증용 도구는 다음 형식(열 사이에 더 많은 공백 포함)으로 데이터를 반환하므로 (파이썬에서) 비교를 허용하려면 데이터를 구문 분석해야 합니다.
User info (Level-2):
====================
Name: domain\username
UPN: [email protected]
Generated UPN: NO
DN: DN....
Uid: 123456
Gid: 123456
Gecos: User Name
Shell: /shell/path
Home dir: /homedir
Other attributes: ....
Other attributes: ....
Account disabled (or locked): TRUE
Other attributes: ....
Other attributes: ....
Other attributes: ....
etc
명령줄에서 다음 접근 방식을 사용하면 효과가 있지만 매우 혼란스럽기 때문에 누군가가 더 깔끔한 접근 방식을 제안할 수 있기를 바랍니다. awk를 시도했지만 명령 크기를 줄이는 데 큰 성공을 거두지 못했습니다.
/opt/util/enum-users --level 2 |
grep "Name:\|Account disabled (or locked): TRUE" |
grep -x "Account disabled (or locked): TRUE" -B 1 |
grep "Name:" |
sed -r 's/^.{35}//'
그러면 필요에 따라 데이터가 출력됩니다.
username
username
etc
답변1
더 효율적인지는 모르겠지만 정확히 다음과 같이 할 수 있습니다 awk
.
awk -F': *' '$1 == "Name" {name = $2; next};
$0 == "Account disabled (or locked): TRUE" {
print gensub(/.*\\/, "", 1, name)
}'
답변2
sed
어쨌든 사용하고 있으므로 정확하게 다음을 수행해야 합니다 .
/opt/util/enum-users --level 2 |
sed -n '/^Name:/h;//,/^Account/{
/^Account/!d;/TRUE[^:]*$/!d;g
s/^[^:]*:[[:blank:]]*//p
}'
실제로 비즈니스를 어떻게 처리해야 하는지는 모르지만 [[:blank:]]
위에서 가정한 바에 따르면 흥미로운 라인 그룹은 다음과 같이 시작할 수 있습니다.
^Name:[[:blank:]]*[INFORMATION YOU WANT]$
...그리고 다음 행은 문자열로 시작합니다.계정문자열로 끝나야 함진짜그 뒤에 공백이 여러 개 있으면 지루한 그룹이 있을 수 있습니다.잘못된또는 다른 것.