여러 서버에서 사용자를 삭제하려면 bash 루프를 작성하는 데 도움이 필요합니다.

여러 서버에서 사용자를 삭제하려면 bash 루프를 작성하는 데 도움이 필요합니다.

반복 bash의 새로운 기능입니다. txt 파일을 읽고 나열된 각 서버에서 사용자를 삭제하려면 스크립트가 필요합니다. 이것은 어떻게 보입니까?

for user in $(cat /tmp/server-list.txt); do userdel -f $USERID; done

실행되지만 서버에서 사용자 계정을 찾을 수 없습니다("id"가 존재하지 않음). 내가 뭘 잘못했나요?

답변1

당신이 다음과 같다고 가정해 봅시다:

  1. 서버 IP 주소 목록이 포함된 텍스트 파일을 반복해 보세요. 각 주소는 새 줄에 표시됩니다.
  2. 우분투 사용자로 각 서버에 SSH로 접속하고(사용자를 자유롭게 변경 가능) 각 시스템에서 특정 사용자 한 명을 삭제하려고 합니다(예: "john smith")
  3. 한 줄에 모두

USERID="john smith"; cat /tmp/server-list.txt | while read IP_ADDRESS; do ssh -q -n ubuntu@$IP_ADDRESS "userdel -f $USERID" ; done

여러 사용자와 여러 서버가 있는 경우 중첩 루프 또는 배열을 사용해야 합니다.

답변2

Bash라는 점을 고려하면 mapfile파일 내용이 포함된 배열을 만들 수 있습니다.

mapfile server </tmp/server-list.txt

그런 다음 다음 서버를 반복할 수 있습니다.

for s in "${server[@]}"
do
    #something
done

$s이제 코드를 작성할 때 자리 표시자 " "를 배치한 값을 사용해야 합니다 ("command" 매개변수가 다음과 같기 #something때문에 이는 약간 까다로울 수 있음).ssh문자열로 결합되어 sh -c서버 에 전달됩니다.):

    ssh "root@$s" "userdel -f '${USERID//\'/\'\\\'\'}''"

( $USERID스크립트 외부 어딘가에 설정되어 있다고 가정합니다. 이 까다로운 대체는 '원격 쉘을 혼란스럽게 하는 문자를 처리하는 것입니다.)

함께 넣어보세요:

read -p "Delete which user?" userid
mapfile server </tmp/server-list.txt
for s in "${server[@]}"
do
    ssh "root@$s" "userdel -f '${userid//\'/\'\\\'\'}''"
done

답변3

for user in $(cat /tmp/server-list.txt); do userdel -f $USERID; done

이는 user루프 변수의 이름입니다. 루프가 반복될 때마다 이를 /tmp/server-list.txt파일의 다음 줄로 설정합니다.

이 변수는 루프의 어느 곳에서도 사용되지 않습니다. 따라서 루프는 파일에 있는 줄 수만큼 동일한 명령문을 반복해서 실행합니다.

$USERIDUSERID이 코드에 설정되지 않은 변수를 읽습니다 . 따라서 해당 변수에 아무것도 할당하지 않는다고 가정하면 실행되는 실제 코드는 다음과 같습니다.

userdel -f

"server-list.txt" 파일의 행을 "user" 변수로 읽는 것은 실제로 오류는 아니지만 여전히 매우 혼란스럽습니다. 이는 스타일 오류이며 루프가 여러 명령으로 커지면 골치 아픈 원인이 됩니다.

관련 정보