usermod + awk sintaxis no válida

usermod + awk sintaxis no válida

He estado intentando escribir un comando (servidor Solaris) que agregue un usuario a un grupo específico. Es un comando bastante largo, así que publicaré el comando completo aquí y luego lo desglosaré.

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

El interiorawkEl comando compila una lista delimitada por comas de los grupos actuales y el comando externo toma esta lista en el parámetro -G.

Ambosawkymod de usuariome están dando errores de sintaxis (cerca de la línea 1, pero solo hay una línea), pero tengo la sensación de que un error es causado por el otro.

¿Hay aquí algún error de sintaxis evidente que me falta? ¿Podría esto deberse a un problema de shell? Como descargo de responsabilidad, estoy usando la construcción && en lugar de un punto y coma debido a algunos problemas de procesamiento de texto de nivel superior, pero eso no debería afectar la ejecución, en mi opinión (lo he probado).

Respuesta1

awkfunciona de manera diferente en Solaris– la versión disponible en /usr/binno admite la -vopción. Usarnawkpara una versión más parecida a POSIX.


El segundo problema es que, como ya habrás notado, solo hay una línea. No intente escribir frases ingeniosas si no es absolutamente necesario; Los comandos legibles son más fáciles de arreglar. Si tiene que poner el comando en un archivo de configuración en algún lugar, póngalo en un .shscript.

No utilizar $USERcomo variable temporal; muchos programas esperan que esta variable particular contengasunombre de inicio de sesión. Elija algo como $useren su lugar.

No analice /etc/groupcuando haya herramientas que lo hagan por usted, como groups. (Además de simplificar el código, también funcionan con cuentas no locales).

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

o si insistes

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

información relacionada