Recarregue as atribuições de grupo de um usuário Linux sem fazer logout

265

Ao atribuir a lista de grupos secundários de um usuário usando:

# usermod -G <grouplist> <user>

é possível forçar essa atribuição de grupo a entrar em vigor sem efetuar o logout de todas as sessões em execução?

Isso seria muito útil na situação em que existe uma sessão Tela com muitos shells, pois a sessão inteira essencialmente precisa ser destruído para que a atribuição do grupo tenha efeito.

Acho que posso alterar o grupo principal do usuário em um shell em execução usando o comando newgrp - é Existe alguma alternativa que funcionaria para grupos secundários?

Idealmente, eu gostaria de algo que entraria em vigor em cada shell sem ser executado manualmente em cada um, mas, caso contrário, talvez alguma forma de forçar o Screen a executar o mesmo comando em cada um deles.

    
por Simon 17.04.2011 / 21:50

12 respostas

163

Horrivelmente hacky, mas você pode usar duas camadas de newgrp para conseguir isso para um grupo específico:

id -g

... fornecerá o ID do grupo principal atual. Chamaremos isso de orig_group para os propósitos deste exemplo. Então:

newgrp <new group name>

... mudará você para esse grupo como principal e o adicionará à lista de grupos retornados por groups ou id -G . Agora, mais um:

newgrp <orig_group>

... você receberá um shell no qual poderá ver o novo grupo e o primário é o original.

Isso é horrível e só vai te adicionar um grupo de cada vez, mas me ajudou algumas vezes a adicionar grupos sem sair / em toda a minha sessão X (por exemplo, para adicionar fusível como um grupo para um usuário para que o sshfs funcione).

Edit: Isto não requer que você digite sua senha, que su irá.

    
por 10.10.2011 / 19:36
268

De dentro de um shell, você pode emitir o seguinte comando

su - $USER

id agora listará o novo grupo:

id
    
por 06.11.2011 / 16:28
124

Este truque interessante de este link funciona muito bem!

exec su -l $USER

Eu pensei em postar aqui, pois toda vez que eu esqueço como fazer isso, esse é o primeiro link que aparece no Google.

    
por 18.06.2013 / 18:27
20

1. Obtendo um shell com o novo grupo sem sair e entrar novamente

Se você só adicionar um grupo, usei o seguinte:

exec sg <new group name> newgrp 'id -gn'

Esta é uma variação do truque newgrp de duas camadas do Legooolas, mas está em uma linha e não requer que você insira manualmente seu grupo primário.

sg é newgrp mas aceita um comando para executar com o novo ID de grupo. O exec significa que o novo shell substitui o shell existente, portanto, você não precisa "efetuar logout" duas vezes.

Ao contrário do uso do su, você não precisa digitar sua senha. Ele também não atualiza seu ambiente (além de adicionar o grupo), então você mantém seu diretório de trabalho atual, etc.

2. Executando o comando em todas as janelas de tela em uma sessão

O comando at na Tela executa um comando nas janelas especificadas (note que este é um comando Screen, não um comando shell).

Você pode usar o seguinte comando para enviar o comando para todas as sessões de tela existentes:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \'id -gn\'^M"

Observe a necessidade de escapar dos backticks para executar id na sessão Screen, e o ^ M para fazer com que o Screen pressione 'enter' no final do seu comando.

Note também que o comando stuff da tela simplesmente digita o texto de comando no seu lado. Portanto, algo estranho pode acontecer se uma das janelas de tela tiver um comando parcialmente escrito em um prompt de comando ou estiver executando um aplicativo diferente de um shell (por exemplo, emacs, top). Se isso é um problema, tenho algumas ideias:

  • Para se livrar de qualquer comando parcialmente escrito, você pode adicionar "^ C" ao início do comando.
  • Para evitar a execução do comando em uma janela do emacs, etc, você poderia pedir 'at' para filtrar o título da janela etc (no exemplo acima, eu uso "#", que corresponde a todas as janelas, mas você pode filtrar por janela título, usuário, etc).

Para executar o comando em uma janela específica (identificada pelo número da janela), use o seguinte:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \'id -gn\'^M"
    
por 17.12.2014 / 22:33
13

Você pode fazer isso.

Adicione quantos grupos desejar usando usermod -G . Então, como usuário com uma sessão em execução, execute newgrp - apenas com o argumento '-'.

Isso reinicializa o ID do grupo para o padrão, mas também define os grupos secundários. Você pode verificar isso executando groups da sessão atual, antes e depois do usermod e do newgrp .

Isso precisa ser executado a partir de cada sessão aberta - não sei muito sobre a tela. No entanto, se for possível iterar todas as sessões abertas e executar newgrp , você deve ser bom. Você não precisa se preocupar em conhecer os grupos ou os IDs do grupo.

Boa sorte para você.

    
por 30.01.2012 / 17:17
12

Grupos são geralmente enumerados no login, não há como saber para forçá-lo a re-fazer a enumeração do grupo sem sair e voltar novamente.

Muitas respostas votadas aqui parecem usar uma solução alternativa que invoca um novo shell com ambiente novo (o mesmo que fazer login novamente). o shell pai e todos os outros programas em execução contínua geralmente não receberão a nova associação de grupo até serem chamados novamente a partir de um novo shell normalmente após o logout limpo e login.

    
por 25.04.2011 / 19:56
10

Usar o comando newgrp resolveu o problema para mim:

newgrp <GroupName>

Este blog post tem uma explicação detalhada.

    
por 07.10.2016 / 06:53
4

Para resumir:

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

Usar 'exec' significa substituir o shell existente pelo novo shell iniciado pelo comando newgrp (assim que sair do novo shell faz o logout).

O newgrp - final é necessário para restaurar seu grupo primário normal, portanto, os arquivos criados posteriormente terão esse como o proprietário do grupo.

Observação: a pergunta do autor original era como tornar os grupos recém-adicionados visíveis nos processos existentes. Os comandos gpasswd e usermod não afetam os processos existentes; grupos recém-adicionados (ou excluídos!) aparecem (desaparecem) da sua conta, ou seja, nos arquivos / etc / group e / etc / gshadow, mas as permissões para processos existentes não são alteradas. Para remover permissões você tem que matar qualquer processo em execução; newgrp - não irá reler / etc / group e redefinir a lista de grupos; em vez disso, parece apenas usar os grupos anteriormente associados ao processo.

    
por 11.02.2017 / 00:21
1

Eu tive um problema semelhante, mas também para usuários que não fizeram login. O reinício do nscd não ajudou, mas a execução deste comando fez: nscd -i group . Isso deve instruir o nscd (daemon de armazenamento em cache) a recarregar o arquivo de grupos.

    
por 13.11.2014 / 17:07
0

Isso faz o truque se você tem sudo e pode evitar que você digite sua senha mais uma vez em alguns casos:

sudo su $USER
    
por 06.08.2014 / 16:03
0

Um pouco atrasado para a festa, gpasswd deve fazer o trabalho, sem criar uma nova sessão:

$ gpasswd -a user groupname

Você pode modificar um grupo de cada vez, mas pode definir todos os seus membros:

$ gpasswd -M user1,user2 groupname
    
por 18.11.2016 / 15:26
0

Eu não consegui fazer o comando newgrp funcionar. Não tenho certeza se isso depende de / etc / sudoers, mas normalmente tenho que digitar minha senha para o sudo, e isso funcionou sem exigir minha senha:

[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
    
por 28.04.2018 / 15:30