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
awk
funciona de manera diferente en Solaris– la versión disponible en /usr/bin
no admite la -v
opción. Usarnawk
para 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 .sh
script.
No utilizar $USER
como variable temporal; muchos programas esperan que esta variable particular contengasunombre de inicio de sesión. Elija algo como $user
en su lugar.
No analice /etc/group
cuando 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"