usermod + awk 語法無效

usermod + awk 語法無效

我一直在嘗試編寫一個命令(Solaris 伺服器)將使用者新增至特定群組。這是一個相當長的命令,因此我將在此處發布整個命令,然後將其分解。

USER=myUser && sudo /usr/sbin/usermod -G `awk -v delim="," -F: '/[:,]'$USER'/ { groups = groups $1 delim; } END { groups = groups "myGroup"; print groups}' /etc/group` myUser

內部awk指令編譯目前群組的逗號分隔列表,外部指令在 -G 參數中取得此列表。

兩個都awk使用者模式給我語法錯誤(靠近第 1 行,但只有一行),但我有一種感覺,一個錯誤是由另一個錯誤引起的。

這裡有我遺漏的明顯語法錯誤嗎?這可能是由 shell 問題引起的嗎?作為免責聲明,由於一些更高級別的文本處理問題,我使用 && 結構而不是分號,但在我看來,這不應該影響執行(我已經測試過)。

答案1

awk在 Solaris 上的工作方式有所不同– 可用版本/usr/bin不支援此-v選項。使用nawk更類似 POSIX 的版本。


第二個問題是,正如您已經注意到的,只有一行。如果不是絕對必要,不要嘗試寫俏皮話;可讀的命令更容易修復。如果您必須將命令放在設定檔中的某個位置 - 將其放在.sh腳本中。

不要用作$USER臨時變數;許多程式期望這個特定變數包含你的登入名。選擇類似的東西$user來代替。

當有工具可以為您執行解析時,請不要解析/etc/group,例如groups. (除了使程式碼更簡單之外,它們還可以使用非本機帳戶。)

#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"

或者如果你堅持

user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"

相關內容