Al asignar la lista de grupos secundarios de un usuario usando:
# usermod -G <grouplist> <user>
¿Es posible forzar que esta asignación de grupo surta efecto sin cerrar todas las sesiones en ejecución?
Esto sería muy útil en la situación en la que existe una sesión de Screen con muchos shells en ejecución, ya que es necesario destruir toda la sesión para que la asignación del grupo surta efecto.
Creo que puedo cambiar el grupo primario del usuario en un shell en ejecución usando el newgrp
comando: ¿hay alguna alternativa que funcione para grupos secundarios?
Idealmente, quisiera algo que surta efecto en cada shell sin ejecutarse manualmente en cada uno, pero en su defecto, tal vez alguna forma de forzar a Screen a ejecutar el mismo comando en cada uno.
linux
shell
debian
permissions
gnu-screen
Simon
fuente
fuente
Respuestas:
Horriblemente hacky, pero podrías usar dos capas
newgrp
para lograr esto para un grupo en particular:... le dará la identificación actual del grupo primario. Llamaremos a esto
orig_group
para los propósitos de este ejemplo. Entonces:... lo cambiará a ese grupo como principal y lo agregará a la lista de grupos devueltos por
groups
oid -G
. Ahora, un más:... obtendrá un shell en el que puede ver el nuevo grupo y el primario es el original.
Esto es horrible y solo conseguirá que se agregue un grupo a la vez, pero me ha ayudado un par de veces a agregar grupos sin cerrar sesión / en toda mi sesión X (por ejemplo, para agregar fusibles como grupo a un usuario para que sshfs funcione).
Editar: Esto tampoco requiere que escriba su contraseña, lo que
su
sí lo hará.fuente
newgrp $USER
lugar denewgrp <orig_group>
. Eso significa que no tuve que encontrar mi ID de grupo primario original, por lo que es aún más fácil que esta solución.newgrp <new group name>
. Esto fue Ubuntu 14.04newgrp
crea un nuevo shell, por lo que cuando necesita salir completamente de su sesión, debe hacer "salir salir salir" para salir ((Desde dentro de un shell, puede emitir el siguiente comando
id ahora mostrará el nuevo grupo:
fuente
¡Este ingenioso truco de este enlace funciona muy bien!
Pensé que lo publicaría aquí, ya que cada vez que olvido cómo hacer esto, este es el primer enlace que aparece en Google.
fuente
exec sudo su -l $USER
para evitar que se le solicite la contraseña.NOPASSWD:
1. Obtener un shell con el nuevo grupo sin cerrar sesión y volver a iniciarla
Si solo agrega un grupo, utilicé lo siguiente:
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. Estoexec
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:
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 ejecutar el comando en una ventana específica (identificada por el número de ventana), use lo siguiente:
fuente
Usar el
newgrp
comando resolvió el problema para mí:Esta publicación de blog tiene una explicación detallada.
fuente
Por lo general, los grupos se enumeran al iniciar sesión, no sé cómo forzarlo a volver a hacer la enumeración de grupo sin cerrar sesión y volver a iniciarla.
Muchas de las respuestas votadas aquí parecen utilizar una solución alternativa que invoca un nuevo shell con un entorno nuevo (igual que iniciar sesión de nuevo). el shell principal y todos los demás programas en ejecución continua generalmente no recibirán la nueva membresía de grupo hasta que se vuelva a invocar desde un shell nuevo, generalmente después de un cierre de sesión y un inicio de sesión limpios.
fuente
Puedes hacerlo.
Agregue tantos grupos como desee usando
usermod -G
. Luego, como usuario con una sesión en ejecución, ejecutenewgrp -
solo con el argumento '-'.Esto reinicializa la identificación del grupo al valor predeterminado, pero también establecerá los grupos secundarios también. Puede verificar esto ejecutando
groups
desde la sesión actual, antes y después deusermod
y elnewgrp
.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 ejecutarse
newgrp
, debería ser bueno. No tendrá que preocuparse por conocer los grupos o las ID de grupo.La mejor de las suertes para ti.
fuente
newgrp -
comienza un nuevo proceso de shellPara resumir:
Usar 'exec' significa reemplazar el shell existente con el nuevo shell iniciado por el comando newgrp (por lo que salir del nuevo shell cierra la sesión).
La final
newgrp -
es necesaria para restaurar su grupo primario normal, por lo que los archivos que cree más adelante tendrán eso como propietario del grupo.Nota: La pregunta del póster original era cómo hacer visibles los grupos recién agregados en los procesos existentes. Los comandos
gpasswd
yusermod
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 cambian. Para eliminar los permisos, debe eliminar todos los procesos en ejecución;newgrp -
no volverá a leer / etc / group y restablecerá la lista de grupos; en cambio, parece usar solo los grupos previamente asociados con el proceso.fuente
exec su - <username>
se puede usar para obtener un nuevo shell de inicio de sesión con grupos configurados, pero eso no funcionará en los scripts porque un nuevo shell leerá comandos desde el terminal. Puede usarsu -c "command ..." <myusername>
para reiniciar su script, pero el proceso resultante no tiene un terminal de control, por lo que se producirá un error si se intenta un editor de pantalla u otro comando interactivo.newgrp -
no no reemplazar el "grupo primario". La respuesta de Patrick Conheady es la mejor aquí, ya que no se bifurca ni cambia el grupo primario.Tuve un problema similar pero también para los usuarios que no han iniciado sesión. Reinicio de nscd no ayudó, pero lo hizo ejecutar este comando:
nscd -i group
. Eso debería indicar a nscd (demonio de almacenamiento en caché) que vuelva a cargar el archivo de grupos.fuente
No pude hacer que el comando newgrp funcione. 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:
fuente
Esto es suficiente si lo tiene
sudo
y puede evitar que ingrese su contraseña una vez más en algunos casos:fuente