Ich habe versucht, einen Befehl (Solaris-Server) zu schreiben, der einen Benutzer zu einer bestimmten Gruppe hinzufügt. Es ist ein ziemlich langer Befehl, deshalb werde ich den gesamten Befehl hier posten und ihn dann aufschlüsseln.
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
Das InnereawkDer Befehl kompiliert eine durch Kommas getrennte Liste der aktuellen Gruppen und der äußere Befehl übernimmt diese Liste im Parameter -G.
BeideawkUndBenutzermodgeben mir Syntaxfehler (in der Nähe von Zeile 1, aber es gibt nur eine Zeile), aber ich habe das Gefühl, dass ein Fehler durch den anderen verursacht wird.
Gibt es hier offensichtliche Syntaxfehler, die ich übersehen habe? Könnte dies durch ein Shell-Problem verursacht werden? Als Haftungsausschluss verwende ich aufgrund einiger Probleme bei der Textverarbeitung auf höherer Ebene die &&-Konstruktion anstelle eines Semikolons, aber meiner Meinung nach sollte dies die Ausführung nicht beeinträchtigen (ich habe es getestet).
Antwort1
awk
funktioniert unter Solaris anders– Die in verfügbare Version /usr/bin
unterstützt die -v
Option nicht. Verwenden Sienawk
für eine POSIX-ähnlichere Version.
Das zweite Problem ist, dass es, wie Sie bereits bemerkt haben, nur eine Zeile gibt. Versuchen Sie nicht, Einzeiler zu schreiben, wenn es nicht unbedingt nötig ist; lesbare Befehle lassen sich leichter korrigieren. Wenn Sie den Befehl irgendwo in eine Konfigurationsdatei schreiben müssen, schreiben Sie ihn .sh
stattdessen in ein Skript.
Nicht $USER
als temporäre Variable verwenden. Viele Programme erwarten, dass diese spezielle Variable Folgendes enthält:deinAnmeldename. Wählen Sie $user
stattdessen etwas wie.
Führen Sie keine Analyse durch /etc/group
, wenn es Tools gibt, die dies für Sie erledigen, wie z. B. groups
. (Sie vereinfachen nicht nur den Code, sondern funktionieren auch mit nicht lokalen Konten.)
#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"
oder wenn Sie darauf bestehen
user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"