Pregunta Recargar las asignaciones de grupo de un usuario de Linux sin cerrar la sesión


Al asignar una lista de grupos secundarios del usuario usando:

# usermod -G <grouplist> <user>

¿Es posible forzar esta asignación de grupo para que tenga efecto sin cerrar sesión todas las sesiones en ejecución?

Esto sería muy útil en la situación en que Pantalla la sesión existe con muchos shells corriendo, ya que la sesión completa esencialmente necesita ser destruida para que la asignación del grupo entre en vigencia.

Creo que puedo cambiar el grupo primario del usuario en un shell en ejecución usando newgrp comando - ¿hay alguna alternativa que funcione para grupos secundarios?

Idealmente, desearía algo que tuviese efecto en cada shell sin que se ejecutara manualmente en cada uno, pero en su defecto, tal vez de alguna manera forzaría a Screen a ejecutar el mismo comando en cada uno.


254


origen


Sé que, al menos para algunos administradores de ventanas / sesiones, es posible hacer esto de modo que la sesión recoja el nuevo grupo y esté disponible para cualquier nuevo proceso iniciado desde los menús, botones del panel o lo que sea. Vine aquí buscando ahora encontrar eso de nuevo, por lo que no puedo decir ahora cómo hacerlo, y probablemente sea específico del administrador de ventanas. - mc0e


Respuestas:


Horriblemente raro, pero podrías usar dos capas de newgrp para lograr esto para un grupo en particular:

id -g

... le dará la identificación del grupo primario actual. Llamaremos esto orig_group para los propósitos de este ejemplo. Entonces:

newgrp <new group name>

... lo cambiará a ese grupo como primario y lo agregará a la lista de grupos devueltos por groups o id -G. Ahora, un más:

newgrp <orig_group>

... te conseguirá un caparazón en el que puedes ver el nuevo grupo y el principal es el original.

Esto es horrible y solo obtendrá un grupo agregado a la vez, pero me ha ayudado un par de veces para agregar grupos sin tener que cerrar sesión / en toda mi sesión X (por ejemplo, para agregar un fusible como un grupo a un usuario) para que sshfs funcione).

Editar: Esto no requiere que escriba su contraseña tampoco, que su será.


149



Buen truco, me gusta - Simon
En Fedora tuve que hacer newgrp $USER en lugar de newgrp <orig_group>. Eso significa que no tuve que encontrar mi ID de grupo principal original, por lo que es incluso más fácil que esta solución. - Richard Turner
Descubrí que era suficiente hacer newgrp <new group name>. Esto fue Ubuntu 14.04 - Edward Falk
@EdwardFalk está bien, pero no (quizás no) quiera dejar ese grupo como su principal ... - mimoralea
Tenga en cuenta que cada newgrp crea un nuevo intérprete de comandos, por lo que cuando necesite salir completamente de su sesión, debe hacer "salir de la salida" para salir completamente (: - jwd


Desde dentro de un shell, puede emitir el siguiente comando

su - $USER

id ahora mostrará el nuevo grupo:

id

252



Creo que este es el mejor enfoque en muchos casos, pero el póster original sí quería actualizar varios shells dentro de una sesión de pantalla. Esta solución debería hacerse desde cada caparazón. - Adrian Ratnapala
Buen truco, funciona genial! - genpfault
La solución original también solo arreglaría una sola sesión de shell en la pantalla. Acabo de probar eso. La razón por la que esta solución funciona es porque estás generando una nueva sesión completa en lugar de heredar del entorno original. - Dror
Esta realmente debería ser la respuesta aceptada. Buen truco, gracias! - dotancohen
Sin embargo, esto requiere que ingrese una contraseña, lo que puede ser incómodo / no deseado si está tratando de hacerlo en muchas sesiones. - Legooolas


Este ingenioso truco de este enlace ¡Funciona genial!

exec su -l $USER

Pensé que lo publicaría aquí ya que cada vez que olvido cómo hacerlo, este es el primer enlace que aparece en google.


115



+1 por no poner al usuario en una subshell; puede cerrar la sesión / salir como de costumbre con esto. Además, si NOPASSWD: está configurado en / etc / sudoers, puede usar exec sudo su -l $USER para evitar que se le solicite una contraseña. - Ivan X
Tenga en cuenta: se le pedirá una contraseña de sudo. Si lo haces mal, tu terminal se cerrará. - Tyler Collier
@TylerCollier Ivan hizo mencionar NOPASSWD: - pepoluan


1. Obtener un shell con el nuevo grupo sin cerrar sesión y volver a iniciar sesión

Si solo está agregando 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 ingrese manualmente su grupo primario.

sg es newgrp pero acepta un comando para ejecutar con la nueva ID del grupo. los exec significa que el nuevo caparazón reemplaza el caparazón existente, por lo que no necesita "cerrar sesión" dos veces.

A diferencia del uso de su, no necesita ingresar su contraseña. Tampoco refresca su entorno (aparte de agregar el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. Ejecutando el comando en todas las ventanas de la pantalla en una sesión

los at comando en Pantalla ejecuta un comando en las ventanas 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 apoyos para obtener id para ejecutar en la sesión de pantalla, y el ^ M para obtener pantalla para presionar 'enter' al final de su comando.

Tenga en cuenta también que la pantalla stuff comando 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 el símbolo del sistema o está ejecutando una aplicación que no sea un shell (por ejemplo, emacs, arriba). Si esto es un problema, tengo algunas ideas:

  • Para deshacerse de cualquier comando medio escrito, puede agregar "^ C" al comienzo del comando.
  • Para evitar ejecutar el comando en una ventana de emacs, etc., podría pedir `at 'para filtrar 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 número de ventana), use lo siguiente:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

19



Impresionante un trazador de líneas, que no parece tener otros efectos secundarios, gracias! - Cyril Duchon-Doris


Puedes hacerlo.

Agregue tantos grupos como desee usando usermod -G. Luego, como usuario con una sesión en ejecución, ejecuta newgrp - con solo el argumento '-'.

Esto reinicializa la identificación del grupo a la predeterminada, pero también configurará los grupos secundarios también. Puede verificar esto ejecutando groups de la sesión actual, antes y después del usermod y el newgrp.

Esto debe ejecutarse desde cada sesión abierta; no sé mucho sobre la pantalla. Sin embargo, si es posible iterar sobre todas las sesiones abiertas y ejecutar newgrp, deberías ser bueno. No tendrá que preocuparse por conocer los grupos o las identificaciones de grupo.

La mejor de las suertes para ti.


14



intentado en un xterm dentro de una sesión X, pero no funcionó - dwery
intentado en una sesión en tmux y tampoco funcionó allí - Michael
Intentó en Amazon Linux 2, no funcionó - Cyril Duchon-Doris
newgrp - comienza un nuevo proceso de shell - Piotr Findeisen


Los grupos generalmente se enumeran al iniciar sesión, no hay manera de que yo sepa de forzarlo a volver a hacer la enumeración grupal sin cerrar la sesión y volver a ingresar.

Muchas de las respuestas votadas aquí parecen usar una solución alternativa que invoca un nuevo shell con un entorno nuevo (lo mismo que iniciar sesión de nuevo). el shell principal y todos los demás programas que se ejecutan continuamente generalmente no recibirán la nueva membresía del grupo hasta que vuelvan a invocarse desde un shell nuevo, generalmente después de cerrar la sesión e iniciar sesión.


12



A decir verdad, estoy bastante seguro de que esto no es cierto. Encontré una forma de hacerlo en una caja de Linux. Sin embargo, por mi vida, no puedo recordar cuál fue el comando. Si lo encuentro, lo publicaré. Editar: acabo de encontrarlo, lo estoy publicando como una respuesta. - lunchmeat317


Utilizando newgrp comando resuelto problema para mí:

newgrp <GroupName>

Esta publicación de blog tiene una explicación detallada.


9



Bienvenido a Super Usuario! En este sitio de preguntas y respuestas, tratamos de proporcionar buenas respuestas a las preguntas que la gente publica. Una parte de esto es incluir la respuesta en tu publicación, en lugar de simplemente proporcionar un enlace a otra página que podría responder a la pregunta. Por favor, edite su respuesta para incluir la solución real a la pregunta publicada. - cascer1
Esta es la mejor manera en mi opinión y debe marcarse como la nueva respuesta aceptada. - Dakatine


Para resumir:

exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -

El uso de 'exec' significa reemplazar el shell existente con el nuevo shell iniciado por el comando newgrp (por lo que salir del nuevo shell lo desconecta).

El final newgrp - es necesario para restaurar tu grupo primario normal, por lo que los archivos que crees más adelante tendrán ese como propietario del grupo.

Nota: La pregunta del cartel original fue cómo hacer que los grupos recién agregados sean visibles en los procesos existentes. los gpasswd y usermod los comandos no afectan los procesos existentes; los grupos recién agregados (¡o eliminados!) aparecen en (desaparecen de) su cuenta, es decir, en los archivos / etc / group y / etc / gshadow, pero los permisos para los procesos existentes no se modifican. A retirar permisos que tienes que matar a cualquier proceso en ejecución; newgrp - no volverá a leer / etc / group y restablecerá la lista de grupos; en cambio, parece que solo usa los grupos previamente asociados con el proceso.


4



Por cierto, exec su - <username> se puede usar para obtener un nuevo shell de inicio de sesión con grupos establecidos, pero eso no funcionará en los scripts porque un nuevo shell leerá los comandos del terminal. Podrías usar su -c "command ..." <myusername> para reiniciar su secuencia de comandos, pero el proceso resultante no tiene un terminal de control y se producirá un error si se intenta un editor de pantalla u otro comando interactivo. - jimav
¿Por qué fue esto downvoted? ¿Alguien puede explicarme qué tiene de malo, porque fue lo que se me ocurrió y creo que me gusta más? - jasonmp85
Gah, lo voté antes de las pruebas. newgrp - hace no reemplazar el "grupo primario". La respuesta de Patrick Conheady es la mejor aquí, ya que ni bifurca ni cambia el grupo primario. - jasonmp85


Tuve un problema similar pero también para usuarios que no iniciaron sesión. El reinicio de nscd no ayudó, pero la ejecución de este comando hizo: nscd -i group. Eso debería indicar nscd (caching daemon) para volver a cargar el archivo de grupos.


1





Esto hace el truco si tienes sudo y puede evitar que ingrese su contraseña una vez más en algunos casos:

sudo su $USER

0