syntaxe invalide avec usermod + awk

0

J'ai essayé d'écrire une commande (serveur Solaris) qui ajoute un utilisateur à un groupe spécifique. C'est une commande assez longue donc je vais poster la commande entière ici et ensuite la décomposer.

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

La commande inner awk compile une liste de groupes actuels délimitée par des virgules et la commande externe prend cette liste dans le paramètre -G.

Les deux awk et usermod me donnent des erreurs de syntaxe (près de la ligne 1, mais il n'y a qu'une seule ligne), mais je dois est causée par l'autre le sentiment d' une erreur.

Y a-t-il des erreurs de syntaxe flagrantes ici qui me manquent? Cela pourrait-il être causé par un problème de shell? En tant que clause de non-responsabilité, j'utilise la construction && au lieu d'un point-virgule en raison de problèmes de traitement de texte de niveau supérieur, mais cela ne devrait pas affecter l'exécution, à mon avis (je l'ai testée).

marque
la source
Plutôt que de nous demander de corriger votre code erroné, il serait préférable de donner un exemple d'entrée et de sortie. Il est fort probable que la meilleure réponse ne soit peut-être pas la façon dont vous essayez de le faire.
SiegeX
J'aurais dû expliquer plus clairement dans ma question que je suis absolument obligé d'utiliser ce modèle en raison de son utilisation dans une application plus large. Aussi, j'ai décrit l'entrée et la sortie si vous lisez attentivement l'article: "La commande interne awk compile une liste de groupes actuels délimitée par des virgules et la commande externe usermod prend cette liste dans le paramètre -G." Compte tenu de ces informations, la commande usermod fonctionnera comme tout le monde l’attend compte tenu de ces paramètres.
Mark

Réponses:

2

awkfonctionne différemment sous Solaris - la version disponible dans /usr/binne prend pas en charge cette -voption. Utiliser nawkpour une version plus semblable à POSIX.


Le deuxième problème est que, comme vous l'avez déjà remarqué, il n'y a qu'une seule ligne. N'essayez pas d'écrire une ligne si ce n'est absolument nécessaire; les commandes lisibles sont plus faciles à corriger. Si vous devez placer la commande dans un fichier de configuration, placez-la dans un .shscript.

Ne pas utiliser $USERcomme variable temporaire; de nombreux programmes s'attendent à ce que cette variable contienne votre nom de connexion. Choisissez quelque chose comme à la $userplace.

Ne pas analyser /etc/groupquand il existe des outils qui le font pour vous, tels que groups. (En plus de simplifier le code, ils fonctionnent également avec des comptes non locaux.)

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

ou si vous insistez

user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"
Grawity
la source
J'apprécie votre tentative de script plus efficace et croyez-moi, j'en utiliserais un si je le pouvais, mais de la manière dont cette application fonctionne, je suis obligé d'utiliser des commandes d'une seule ligne. C'est moche, mais je n'ai pas le choix.
Mark
@ Mark: /usr/local/bin/add-user-to-group.shest une commande d' une ligne aussi bien :) Quoi qu'il en soit, je l'ai fait inclure une version d' une ligne que vous pouvez utiliser, au fond de mon poste.
grawity
Oui, cela a fourni une bonne base. Il est difficile de décrire dans un message à quel point l'environnement d'exécution est totalement restreint. Toutefois, cette commande s'exécute sur des centaines de serveurs. Je ne peux pas copier le script sur tous les serveurs. Je dois donc utiliser les points communs connus de chaque serveur.
Mark