1. Obtener un shell con el nuevo grupo sin cerrar sesión y volver a iniciarla
Si solo agrega un grupo, utilicé lo siguiente:
exec sg <new group name> newgrp `id -gn`
Esta es una variación del truco newgrp de dos capas de Legooolas, pero está en una línea y no requiere que ingreses manualmente a tu grupo principal.
sg
es newgrp pero acepta un comando para ejecutar con la nueva ID de grupo. Esto exec
significa que el nuevo shell reemplaza al shell existente, por lo que no necesita "cerrar sesión" dos veces.
A diferencia de usar su, no necesita escribir su contraseña. Tampoco actualiza su entorno (aparte de agregar el grupo), por lo que conserva su directorio de trabajo actual, etc.
2. Ejecutar el comando en todas las ventanas de pantalla en una sesión
El at
comando en pantalla ejecuta un comando en cualquier ventana que especifique (tenga en cuenta que este es un comando de pantalla, no un comando de shell).
Puede usar el siguiente comando para enviar el comando a todas las sesiones de pantalla existentes:
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Tenga en cuenta la necesidad de escapar de los backticks para poder id
ejecutar la sesión de la pantalla, y la ^ M para que la pantalla presione 'enter' al final de su comando.
Tenga en cuenta también que el stuff
comando de la pantalla simplemente escribe el texto del comando en su nombre. Por lo tanto, puede suceder algo extraño si una de las ventanas de la pantalla tiene un comando medio escrito en un símbolo del sistema o está ejecutando una aplicación que no sea un shell (por ejemplo, emacs, top). Si esto es un problema, tengo algunas ideas:
- Para deshacerse de cualquier comando medio escrito, puede agregar "^ C" al inicio del comando.
- Para evitar ejecutar el comando en una ventana de emacs, etc., puede pedirle a 'at' que filtre el título de la ventana, etc. (en el ejemplo anterior, uso "#", que coincide con todas las ventanas, pero puede filtrar por título de ventana, usuario , etc.)
Para ejecutar el comando en una ventana específica (identificada por el número de ventana), use lo siguiente:
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"