web-dev-qa-db-pt.com

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

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 logout de todas as sessões em execução?

Isso seria muito útil na situação em que existe uma sessão Screen com muitos shells em execução, já que a sessão inteira precisa essencialmente ser destruída para que a designação de grupo tenha efeito.

Eu acho que posso alterar o grupo primário do usuário em um shell em execução usando o newgrp comando - 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, se isso não for feito, talvez seja necessário forçar o Screen a executar o mesmo comando em cada um deles.

312
Simon

Horrivelmente hacky, mas você poderia usar duas camadas de newgrp para conseguir isso para um grupo em particular:

id -g

... lhe dará o ID do grupo principal atual. Vamos chamar isto 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 você poderá ver o novo grupo e o primário é o original.

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

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

188
Legooolas

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

su - $USER

id agora listará o novo grupo:

id
331
stivlo

Este truque bacana de este link funciona muito bem!

exec su -l $USER

Eu imaginei que eu iria postar aqui como toda vez que eu esqueço como fazer isso, este é o primeiro link que aparece no google.

144
jhaagsma

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 do grupo. A 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 no Screen executa um comando em qualquer janela que você especificar (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 que id seja executado 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 em seu nome. 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 idéias:

  • 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 título da janela , 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"
30
Patrick Conheady

Você consegue fazer isso.

Adicione quantos grupos quiser 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 da usermod e da newgrp.

Isso tem que 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ê.

13
lunchmeat317

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

Muitas respostas votadas aqui parecem usar uma solução alternativa que invoca um novo Shell com um novo ambiente (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 Shell recente, normalmente após o logout limpo e login.

12
Mister_Tom

Usando o comando newgrp resolveu problema para mim:

newgrp <GroupName>

Este post do blog tem explicação detalhada.

12
Pavan Vegirouthu

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, sair do novo Shell faz o logout).

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

Nota: 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 remove permissões você tem que matar qualquer processo em execução; newgrp - não irá re-ler/etc/group e redefinir a lista de grupos; em vez disso, parece apenas usar os grupos anteriormente associados ao processo.

4
jimav

Eu tive problema semelhante, mas também para usuários não logados. 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.

1
Marki555

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, embora você possa definir todos os seus membros:

$ gpasswd -M user1,user2 groupname
0
Tombart

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

[[email protected]:~]$ groups
users wheel

[[email protected]:~]$ Sudo echo hi
[Sudo] password for leo60228:
hi

[[email protected]:~]$ Sudo -k # reset Sudo timeout

[[email protected]:~]$ exec Sudo -i -u $(whoami) # no password necessary

[[email protected]:~]$ groups
users wheel docker
0
snuggles08

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

Sudo su $USER
0
guaka