스크립트로 생성된 수백 명의 사용자를 삭제하는 방법은 무엇입니까?

스크립트로 생성된 수백 명의 사용자를 삭제하는 방법은 무엇입니까?

나는 이전에 비밀번호 생성기의 출력을 사용자 이름으로 사용하여 100명 이상의 사용자를 생성하는 bash 스크립트를 만들었습니다. 지금까지 제가 본 가장 가까운 해결책은 삭제할 사용자 목록을 만든 다음 해당 목록을 실행하는 스크립트를 만드는 것입니다.

원치 않는 사용자를 모두 수동으로 나열하지 않고도 이러한 사용자를 모두 제거할 수 있는 방법이나 빠른 대안이 있는지 궁금합니다.

답변1

댓글에 게시된 내용은 실제로 가장 간단한 솔루션입니다.

즐겨 사용하는 텍스트 편집기를 사용하여 , , 을 /etc/passwd연 다음 삭제하세요./etc/shadow/etc/group

제가 추가해야 할 유일한 것은, 정말(~해야 한다자명하지만 그렇지 않음)은 다음과 같습니다.해당 파일을 편집하기 전에 백업하십시오.

그래서 당신은 다음과 같은 것을 얻게 될 것입니다 :

sudo cp /etc/passwd /etc/passwd.bak
sudo cp /etc/shadow /etc/shadow.bak
sudo cp /etc/group /etc/group.bak
sudo -e /etc/passwd /etc/shadow /etc/group

물론 지금, 만약 당신이반품이러한 사용자의 홈 디렉토리를 삭제해야 하지만 문제가 해결되지는 않습니다. 하지만 사용자 자체를 삭제하면 됩니다. 그게 전부입니다.


만약 너라면하다홈 디렉터리를 삭제하는 가장 쉬운 방법은 /etc/passwd백업 복사본과 수정된 복사본 간의 차이점을 필터링하는 것입니다.

comm -2 -3 /etc/passwd.bak /etc/passwd | cut -d: -f6,6 > /tmp/dirs-to-delete

그럼 (당신이 언제매우목록에 원하는 파일만 포함되어 있는지 확인하십시오. 목록을 반복하여 해당 파일을 모두 제거합니다.

사실, 먼저 공백이나 기타 이상한 조건을 확인하기 위해 추가적인 온전성 검사를 수행합니다.

awk 'NF > 1 { printf "Problem with entry <%s> on line %d\n", $0, NR }' /tmp/dirs-to-delete

그리고 디렉터리가 모두 실제로 존재하는지 확인하세요.

for d in $(cat /tmp/dirs-to-delete); do
  [ -d "$d" ] ||
    printf 'Supposed directory <%s> is not a directory\n' "$d"
done

그리고 어떤 문자도 와일드카드로 해석되지 않도록 해야 합니다(특수 문자를 사용하여 줄의 줄 번호를 인쇄하세요).

sed -n '/[][*?]/=' /tmp/dirs-to-delete

하지만 정말 만족스러우면 다음과 같이 하세요.

rm -rf $(cat /tmp/dirs-to-delete)

(참고로 명령어는존나 위험해당신이 모른다면정확히파일에 무엇이 들어있나요? 조심하지 않으면 하드 드라이브가 지워질 수도 있습니다. )

답변2

사용자를 추가하는 데 사용한 명령, 옵션 및 시스템 구성에 따라 다릅니다. 예를 들어, 시스템이 UID_MIN1000에서 시작하도록 구성되어 있고 시스템에 단 한 명의 사용자(UID 1000)만 있는 경우 다음과 같은 것을 사용할 수 있습니다.목록만 가져오기Bash의 사용자 수:

for user in $(cut -d : -f 1 /etc/passwd)
do
    user_id=$(id -g ${user})
    if [ ${user_id} -ge 1001 -a ${user_id} -le 1100 ]
    then
        echo ${user};
    fi
done

생성 중에 이러한 옵션을 사용한 경우 생성된 그룹 및 홈 폴더를 삭제할 수도 있습니다.

답변3

추가한 사용자를 계속 추적하거나(예: 임의의 사용자 이름을 생성한 이후 로그 파일에 있을 수도 있음) 두 사용자를 구별하는 데 사용할 수 있는 패턴이 있는 경우가 아니면 이를 수행하는 좋은 방법이 있을 수 있는지 모르겠습니다. 제거하려는 사용자와 유지하려는 사용자(예: 모든 "실제" 사용자 이름에 알파벳 문자만 포함되어 있고 모든 임의의 사용자 이름에 알파벳이 아닌 문자가 포함될 수 있음)

이것이 절약할 수 있다고 생각하는 유일한 경우는 유지하려는 사용자 집합이 삭제하려는 사용자 집합보다 훨씬 작거나 어딘가에 연속적으로 나열되어 있는 경우입니다. 임의의 사용자를 모두 한 번에 추가한 다음 다른 사용자를 추가하지 않으면 실제로 이런 일이 발생할 수 있습니다. 이 경우 다음과 같은 사용자 목록을 얻을 수 있습니다.

cat /etc/passwd | tail -n 100 | cut -d: -f1

그런 다음 삭제할 수도 있습니다(참고: 실행하기 전에 모든 것을 다시 확인하세요!).

for username in $(cat /etc/passwd | tail -n 100 | cut -d: -f1); do
    sudo userdel "${username}"
done

답변4

이하의 사용자 ID를 가진 사용자는 삭제하면 안 된다는 조건을 체크하여 사용자를 삭제하려면 아래 라인을 사용하십시오.1001

cat /etc/passwd | awk -F ":" '{print $1,$3}' | awk '$2 > 1001 {print “userdel -r”  “ “ $1}’

관련 정보