Linux

腳本或 makefile 來自動創建新使用者?

  • May 23, 2020

我想要一個 shell 腳本或 makefile 來自動創建新使用者。我無法決定哪種方法更好 - 腳本還是生成文件?

我有兩種類型或使用者 - 都是 SFTP chrooted、個人帳戶和網路域的共享帳戶。

新使用者使用電子郵件地址“註冊”,如果域有效,我檢查 DNS MX 記錄,如果使用者名是有效收件人,則檢查 RCPT。

然後我不能使用useradd -m它,因為它會創建使用者擁有的 homedir,但是對於 SFTP chroot,它必須是 root 擁有的,並且不能被其他任何人寫入。因此,我手動創建了 dir 和 dir 佈局。

我也不能userdel -r完全刪除此類使用者,因為userdel -r如果 homedir 不屬於使用者(至少在 OpenBSD 上),則不會刪除它。

對於這樣的任務,腳本或生成文件有什麼更好的選擇?

PS:我不想使用ansible等…

我強烈建議使用腳本而不是 makefile。

簡而言之,原因是:

  • 堅持正常做法。或最小驚訝原則
  • 可維護性和可擴展性。
  • 事實上,makefile 旨在自動化建構過程,而不是自動化系統管理員任務。

使用 makefile 本身並不是“錯誤”的,它有它的好處,但也有很多警告。無論你決定什麼,你都應該知道權衡。

讓我詳細說明。

遵循慣例或最小驚訝原則

當我看到一個腳本時,我認為它會自動執行某些操作。當我看到一個 makefile 時,我認為它建構了一些東西。當我在你的辦公室工作並且我想添加一個使用者時,我查看了文件,它說要執行一個 makefile,我一開始會感到困惑。makefile 會建構我用來添加使用者的工具嗎?我將不得不檢查 makefile 以確保它確實添加了一個使用者。

可維護性和可擴展性

改變發生。系統變化。需求變化。需要調整工具。以下是我在嘗試調整用於自動化系統管理員任務的 makefile 時可以想到的一些注意事項。

沒有特別的順序:

  • 您必須在配方中的每一行前面加上一個選項卡(請參閱makefile 規則語法定義)。也許這只是我個人的煩惱。可以通過一個好的編輯器來克服它,該編輯器可以配置為不在生成文件中用空格替換前導選項卡。.RECIPEPREFIX可能的解決方法,但是你再次打破了普遍的期望。

  • 您不能(輕鬆)處理生成文件中的參數。這將使添加--verbose--force或之類的參數變得非常困難--no-action。有關更多說明,請參見此處:https ://stackoverflow.com/a/45003119/360899

  • 除上述之外:您不能自定義處理錯誤消息的參數。換句話說:如果使用者給出了不正確的參數,你就不能寫出有意義的錯誤資訊

  • 您不能(輕鬆)將通用程式碼提取到函式中。有“罐頭食譜”。但我寧願不要。

  • 您不能(輕鬆)編寫多行 shell 腳本結構,因為 make 會為自己執行配方中的每一行。例如if [ condition ]; then commands; fiorfor elements; do commands; done必須寫在一行中。使用.ONESHELL可能的解決方法

  • 此外,由於上述原因,您不能(輕鬆)在一行中設置標誌並在更下方的一行中對標誌進行操作。因為每條線都是獨立的。解決方法如上。

  • 其他神秘的 makefile 怪癖。例如:

額外的問題:您不能將 makefile 放入/usr/binor中~/bin。無論如何,您都需要編寫一個包裝腳本。

makefile 旨在自動化建構過程,而不是自動化系統管理員任務

使用 makefile 自動執行系統任務就像使用 git 而不是 rsync 進行系統備份。

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 都會正確推斷出沒有什麼需要做的。

引用自:https://unix.stackexchange.com/questions/496793