2011-04-17 19:50:06 +0000 2011-04-17 19:50:06 +0000
377
377

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

Cuando se asigna una lista de grupo secundario de un usuario utilizando:

# usermod -G <grouplist> <user>

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

Esto sería muy útil en la situación en la que existe una sesión de Pantalla con muchos shells en ejecución, ya que la sesión entera necesita esencialmente ser destruida para que la asignación de grupo surta efecto.

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

Idealmente, querría algo que tuviera efecto en cada shell sin ser ejecutado manualmente en cada una, pero en su defecto, tal vez alguna forma de forzar a Screen a ejecutar el mismo comando en cada una.

Respuestas (12)

400
400
400
2011-11-06 15:28:07 +0000

Desde el interior de un shell, puede emitir el siguiente comando

su - $USER

id ahora listará el nuevo grupo:

id
221
221
221
2011-10-10 17:36:48 +0000

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

id -g

…te dará la actual identificación del grupo primario. Llamaremos a esto orig_group para los propósitos de este ejemplo. Luego:

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, otro:

newgrp <orig_group>

…le dará un shell en el que podrá ver el nuevo grupo y el primario es el original.

Esto es horrible y sólo le dará un grupo añadido a la vez, pero me ha ayudado un par de veces a conseguir que se añadan grupos sin cerrar la sesión en toda mi sesión X (e. por ejemplo, para que se añada un fusible como grupo a un usuario para que los sshfs funcionen).

Editar : Esto tampoco requiere que escribas tu contraseña, lo cual su hará.

168
168
168
2013-06-18 16:27:30 +0000

Este ingenioso truco de este enlace funciona muy bien!

exec su -l $USER

Me imaginé que lo publicaría aquí ya que cada vez que me olvido de cómo hacer esto, este es el primer enlace que aparece en Google.

35
35
35
2014-12-17 21:33:21 +0000

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

Si sólo estás añadiendo un grupo, he utilizado 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 introduzcas manualmente tu grupo primario.

sg es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El exec significa que el nuevo shell reemplaza al existente, por lo que no necesitas “cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando at en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar 

Si sólo estás añadiendo un grupo, he utilizado lo siguiente: 

exec sg 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 introduzcas manualmente tu grupo primario.

id es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El stuff significa que el nuevo shell reemplaza al existente, por lo que no necesitas "cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando &007 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

id -gn### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar

Si sólo estás añadiendo un grupo, he utilizado 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas “cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

^M" “`

Ten en cuenta la necesidad de escapar de los backticks para que &007 se ejecute en la sesión de Screen, y el ^M para que Screen pulse ‘enter’ al final del comando.

Ten en cuenta también que el comando [ &007 ]&003 de Screen simplemente escribe el texto del comando en tu nombre. Por lo tanto, puede ocurrir algo extraño si una de las ventanas de la pantalla tiene un comando a medio escribir 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 añadir ”^C" al inicio del comando.
  • Para evitar ejecutar el comando en una ventana de emacs, etc, podría pedirle a `at’ que filtre en el título de la ventana, etc (en el ejemplo anterior, uso “#”, que coincide con todas las ventanas, pero puede filtrar por el título de la ventana, el usuario, etc).

Para ejecutar el comando en una ventana específica (identificada por el número de la ventana), use lo siguiente:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp ### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar 

Si sólo estás añadiendo un grupo, he utilizado lo siguiente: 

exec sg 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas "cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar 

Si sólo estás añadiendo un grupo, he utilizado lo siguiente: 

exec sg 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas "cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

id -gn### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar

Si sólo estás añadiendo un grupo, he utilizado 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas “cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

^M" “`

Ten en cuenta la necesidad de escapar de los backticks para que &007 se ejecute en la sesión de Screen, y el ^M para que Screen pulse ‘enter’ al final del comando.

Ten en cuenta también que el comando [ &007 ]&003 de Screen simplemente escribe el texto del comando en tu nombre. Por lo tanto, puede ocurrir algo extraño si una de las ventanas de la pantalla tiene un comando a medio escribir 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 añadir ”^C" al inicio del comando.
  • Para evitar ejecutar el comando en una ventana de emacs, etc, podría pedirle a `at’ que filtre en el título de la ventana, etc (en el ejemplo anterior, uso “#”, que coincide con todas las ventanas, pero puede filtrar por el título de la ventana, el usuario, etc).

Para ejecutar el comando en una ventana específica (identificada por el número de la ventana), use lo siguiente:

id -gn### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar

Si sólo estás añadiendo un grupo, he utilizado 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas “cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar 

Si sólo estás añadiendo un grupo, he utilizado lo siguiente: 

exec sg 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas "cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

id -gn### 1. Obtener un shell con el nuevo grupo sin cerrar la sesión y volver a entrar

Si sólo estás añadiendo un grupo, he utilizado 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 introduzcas manualmente tu grupo primario.

&007 es newgrp pero aceptando un comando a ejecutar con el nuevo ID de grupo. El &007 significa que el nuevo shell reemplaza al existente, por lo que no necesitas “cerrar la sesión” dos veces.

A diferencia de usar su, no necesitas escribir tu contraseña. Tampoco refresca su entorno (aparte de añadir el grupo), por lo que conserva su directorio de trabajo actual, etc.

2. 2. Ejecutar el comando en todas las ventanas de Screen en una sesión

El comando [ &007 ]&003 en Screen ejecuta un comando en cualquier ventana que usted especifique (note que este es un comando de Screen, no un comando de shell).

Puedes usar el siguiente comando para enviar el comando a todas las sesiones de Screen existentes:

^M" “`

Ten en cuenta la necesidad de escapar de los backticks para que &007 se ejecute en la sesión de Screen, y el ^M para que Screen pulse ‘enter’ al final del comando.

Ten en cuenta también que el comando [ &007 ]&003 de Screen simplemente escribe el texto del comando en tu nombre. Por lo tanto, puede ocurrir algo extraño si una de las ventanas de la pantalla tiene un comando a medio escribir 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 añadir ”^C" al inicio del comando.
  • Para evitar ejecutar el comando en una ventana de emacs, etc, podría pedirle a `at’ que filtre en el título de la ventana, etc (en el ejemplo anterior, uso “#”, que coincide con todas las ventanas, pero puede filtrar por el título de la ventana, el usuario, etc).

Para ejecutar el comando en una ventana específica (identificada por el número de la ventana), use lo siguiente:

^M" “`

18
18
18
2016-10-07 04:53:42 +0000

Usando el comando newgrp me resolvió el problema:

newgrp <GroupName>

Esta entrada de blog tiene una explicación detallada.

12
12
12
2012-01-30 16:17:03 +0000

Puedes hacerlo.

Añade tantos grupos como quieras usando usermod -G. Luego, como usuario con una sesión en curso, ejecute newgrp - con sólo el argumento ‘-’.

Esto reinicia el id de grupo al valor por defecto, pero también establecerá los grupos secundarios. Puede verificar esto ejecutando groups desde la sesión actual, antes y después del usermod y el newgrp.

Esto tiene que ser ejecutado 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ía ser bueno. No tendrás que preocuparte por conocer los grupos o las identificaciones de los grupos.

Te deseo la mejor de las suertes.

11
11
11
2011-04-25 17:56:34 +0000

Los grupos se enumeran normalmente en el momento del inicio de sesión, no conozco ninguna forma de forzarlo a rehacer la enumeración del grupo sin cerrar la sesión y volver a entrar.

Muchas de las respuestas votadas aquí parecen utilizar una solución que invoca un nuevo shell con un entorno fresco (lo mismo que volver a iniciar la sesión). 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 sean reinvocados desde un shell fresco, normalmente después de un cierre de sesión y un inicio de sesión limpios.

4
4
4
2017-02-10 23:21:38 +0000

Para resumir:

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

Usar ‘exec’ significa reemplazar el shell existente con el nuevo shell iniciado por el comando newgrp (así que al salir del nuevo shell se cierra la sesión).

El último newgrp - es necesario para restaurar su grupo primario normal, así que los archivos que cree más tarde tendrán eso como su propietario de grupo.

Nota: La pregunta del cartel original era cómo hacer visibles los grupos recién añadidos en los procesos existentes. Los comandos gpasswd y usermod no afectan a los procesos existentes; los grupos recién añadidos (¡o eliminados!) aparecen en (desaparecen de) su cuenta, es decir, en los archivos /etc/group y /etc/gshadow, pero los permisos de los procesos existentes no se modifican. Para eliminar permisos tienes que matar cualquier proceso en ejecución; newgrp - no volverá a leer /etc/group y restablecerá la lista de grupos; en su lugar, parece que sólo utiliza los grupos previamente asociados con el proceso.

1
1
1
2018-04-28 13:30:22 +0000

No pude hacer que el nuevo comando del grupo funcionara. No estoy seguro de si esto depende de /etc/sudoers, pero normalmente tengo que escribir mi contraseña para sudo, y esto funcionó sin requerir mi contraseña:

[leo60228@leonix:~]$ groups
users wheel

[leo60228@leonix:~]$ sudo echo hi
[sudo] password for leo60228:
hi

[leo60228@leonix:~]$ sudo -k # reset sudo timeout

[leo60228@leonix:~]$ exec sudo -i -u $(whoami) # no password necessary

[leo60228@leonix:~]$ groups
users wheel docker
0
0
0
2014-08-06 14:03:21 +0000

Esto hace el truco si tienes sudo y puede salvarte de introducir tu contraseña una vez más en algunos casos:

sudo su $USER
0
0
0
2019-10-21 22:03:04 +0000

Necesitaba hacer esto en un script de shell (el script agrega el usuario actual a un grupo, ejecuta comandos posteriores que requieren esa pertenencia al grupo). El comando newgrp es frágil ya que sólo puede ejecutar un nuevo shell en lugar de un comando arbitrario (quiero volver a ejecutar el script de shell actual con los args de la línea de comandos original).

Esta es mi solución, que usa muchos bash-ismos: (nota: el script circundante necesita algún tipo de rama para ejecutar esta función sólo si el grupo requerido no está activo actualmente):

(nota: el script implica que ejecutó sudo adduser $user docker, lo que significa que también podría ejecutar sudo docker en todas partes en lugar de docker pero eso no era deseable en este caso)

# save these for later
ORIGINAL_ARGS=("$@")

# This function is a little insane. The problem is this: user running
# this script is not a member of docker group, but used 'sudo' to add
# themselves to group. Without logging out and back in, the only way
# to gain access to that group is via the 'newgrp' command, which
# unfortunately starts a new shell rather than an arbitrary command...
#
# Also, we're going to newgrp twice: first to add the new group and
# again to restore the original group (but the new group remains in
# the 'groups' output).
#
# So this horrendous hack dups stdin to fd3 for later. Then runs
# 'newgrp' piping in a script that runs 'newgrp' a second time, piping
# in another script that restores stdin from fd3 and execs the
# original command...
restart-newgrp-newgrp() {
  # dup original stdin to fd3
  exec 3<&0

  local group="$1"
  local command="$0"
  local arg
  for arg in "${ORIGINAL_ARGS[@]}"; do
    printf -v command "%s %q" "$command" "$arg"
  done

  # restore original stdin from fd3; also replace any single-quote in
  # command with '"'"' to embed it in a single-quoted string
  local script
  printf -v script "exec newgrp %q <<<'exec <&3-; exec %s'" "$(id -gn)" "${command///\"\"}"

  exec newgrp "$group" <<<"$script"
}
0
0
0
2014-11-13 16:07:46 +0000

Yo tenía un problema similar pero también para los usuarios no registrados. El reinicio de nscd no ayudó, pero la ejecución de este comando sí lo hizo: nscd -i group. Eso debería instruir a nscd (demonio de caché) para recargar el archivo de grupos.