새 사용자를 자동으로 생성하는 스크립트 또는 makefile?

새 사용자를 자동으로 생성하는 스크립트 또는 makefile?

새 사용자를 자동으로 생성하는 쉘 스크립트나 makefile이 필요합니다. 스크립트와 메이크파일 중 어느 방법이 더 나은지 결정할 수 없습니다.

SFTP chroot, 개인 계정 및 웹 도메인의 공유 계정이라는 두 가지 유형 또는 사용자가 있습니다.

새로운 사용자는 이메일 주소로 "등록"하고 도메인이 유효하면 DNS MX 레코드를 확인하고 사용자 이름이 유효한 수신자이면 RCPT를 확인합니다.

useradd -m그런 다음 사용자가 소유한 homedir을 생성하기 때문에 사용할 수 없지만 SFTP chroot의 경우 루트가 소유해야 하며 다른 사람이 쓸 수 없어야 합니다. 따라서 dir 및 dir 레이아웃을 수동으로 생성합니다.

또한 homedir이 해당 사용자에게 속하지 않으면(적어도 OpenBSD에서는) 삭제되지 않기 userdel -r때문에 이러한 사용자를 완전히 삭제하는 데 사용할 수도 없습니다 .userdel -r

그러한 작업에는 스크립트와 makefile 중 어느 것이 더 낫습니까?

추신 : 나는 ansible 등을 사용하고 싶지 않습니다 ...

답변1

makefile 대신 스크립트를 사용하는 것이 좋습니다.

간단히 말해서 그 이유는 다음과 같습니다.

  • 규칙을 따르십시오. 또는최소 놀라움의 원리.
  • 유지 관리성 및 확장성.
  • 실제로 makefile은 시스템 관리 작업을 자동화하기보다는 빌드 프로세스를 자동화하도록 설계되었습니다.

makefile을 사용하는 데 본질적으로 "잘못된" 것은 없습니다. 장점도 있지만 주의할 점도 많습니다. 무엇을 결정하든 장단점을 이해해야 합니다.

자세히 설명하겠습니다.

관례 또는 최소 놀라움의 원칙을 따르십시오.

스크립트를 봤을 때 자동으로 뭔가가 실행될 거라고 생각했어요. makefile을 볼 때 뭔가를 구축하는 것 같습니다. 제가 귀하의 사무실에서 일할 때 사용자를 추가하고 싶었고 문서를 보니 makefile을 실행하라는 내용이 있어서 처음에는 혼란스러웠습니다. makefile이 사용자를 추가하는 데 사용하는 도구를 구축합니까? 실제로 사용자가 추가되었는지 확인하기 위해 makefile을 확인해야 했습니다.

유지 관리성 및 확장성

변화가 일어납니다. 시스템이 변경됩니다. 요구사항이 변경됩니다. 도구를 조정해야 합니다. 시스템 관리 작업을 자동화하기 위해 makefile을 조정하려고 할 때 고려할 수 있는 몇 가지 고려 사항은 다음과 같습니다.

순서대로 나열되지 않은 이름:

  • 레시피의 각 줄 앞에는 탭이 있어야 합니다(참조:Makefile 규칙 구문 정의). 어쩌면 이것은 내 개인적인 불만일지도 모릅니다. 이 문제는 makefile에서 선행 탭을 공백으로 바꾸지 않도록 구성할 수 있는 좋은 편집기를 사용하여 극복할 수 있습니다. 가능한 해결책은.레시피 접두사하지만 당신은 일반적인 기대를 깨뜨렸습니다.

  • makefile에서는 매개변수를 (쉽게) 처리할 수 없습니다. 이렇게 하면 --verbose또는 --force같은 매개변수를 추가하기가 매우 어려워집니다 --no-action. 자세한 지침은 여기를 참조하세요.https://stackoverflow.com/a/45003119/360899

  • 위 사항 외에도 매개변수 처리 오류 메시지를 사용자 정의할 수 없습니다. 즉, 사용자가 잘못된 매개변수를 제공하면 의미 있는 오류 메시지를 작성할 수 없습니다.

  • (쉽게) 일반 코드를 함수로 추출할 수는 없습니다. 가지다"통조림 레시피". 하지만 나는 그러지 않는 편이 낫습니다.

  • make가 레시피 자체의 각 라인을 실행하기 때문에 여러 줄의 쉘 스크립트 구성을 (쉽게) 작성할 수 없습니다. 예를 들어 if [ condition ]; then commands; fior는 for elements; do commands; done한 줄에 써야 합니다. 가능한 해결책.ONESHELL

  • 또한 위에서 언급한 이유로 인해 한 줄에 플래그를 (쉽게) 설정하고 아래 줄에서 이에 대해 작업을 수행할 수 없습니다. 왜냐하면 각 라인은 독립적이기 때문입니다. 해결 방법은 위에서 언급한 바와 같습니다.

  • 다른 신비한 메이크파일의 단점. 예를 들어:

/usr/bin보너스 질문: makefile을 또는 에 넣을 수 없습니다 ~/bin. 어쨌든 래퍼 스크립트를 작성해야 합니다.

makefile은 시스템 관리 작업을 자동화하는 것이 아니라 빌드 프로세스를 자동화하도록 설계되었습니다.

makefile을 사용하여 시스템 작업을 자동화하는 것은 시스템 백업에 rsync 대신 git을 사용하는 것과 같습니다.

Make는 빌드 프로세스를 자동화하는 많은 기능을 갖춘 강력한 도구입니다. Git은 코드 버전 제어를 위한 많은 기능을 갖춘 강력한 도구입니다. 도구를 사용하는 것이 많은 도움이 된다면 이러한 단점은 허용될 수 있습니다. 하지만 현재 작업에 더 적합한 다른 도구가 있는데 왜 다른 작업을 수행하는 데 사용되는 도구의 단점을 해결해야 할까요?


일부 데모:

제가 생각하는 makefile의 좋은 점은 매개변수 처리를 위해 상용구를 작성할 필요가 없다는 것입니다. 비교하다:

파일 생성:

useradd:
    @echo commands that do the things for useradd

userdel:
    @echo commands that do the things for userdel

스크립트:

#!/bin/sh

if [ $# == 0 ]; then
  echo "need argument: useradd or userdel"
  exit 1
fi

if [ "$1" == "useradd" ]; then
  echo "commands that do the things for useradd"
elif [ "$1" == "userdel" ]; then
  echo "commands that do the things for userdel"
else
  echo "unknown argument: $1"
  exit 1
fi

하지만:

$ make userdell
make: *** No rule to make target 'userdell'.  Stop.
$ ./script.sh userdell
unknown argument: userdell

오류 메시지를 사용자 정의할 수 없습니다.

$ touch userdel
$ make userdel
make: 'userdel' is up to date.

userdel어떤 이유로든 이름이 지정된 파일이 존재하면 make는 아무 작업도 수행할 필요가 없다고 올바르게 추론합니다.

관련 정보