腳本或 makefile 來自動創建新使用者?
我想要一個 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; fi
orfor elements; do commands; done
必須寫在一行中。使用.ONESHELL可能的解決方法此外,由於上述原因,您不能(輕鬆)在一行中設置標誌並在更下方的一行中對標誌進行操作。因為每條線都是獨立的。解決方法如上。
其他神秘的 makefile 怪癖。例如:
額外的問題:您不能將 makefile 放入
/usr/bin
or中~/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 都會正確推斷出沒有什麼需要做的。