Questão 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 um Tela Existe uma sessão com muitos shells em execução, já que a sessão inteira precisa ser destruída para que a atribuição do grupo seja efetivada.

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 funcione 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.


254


origem


Eu sei que pelo menos para alguns gerenciadores de janela / sessão é possível fazer isso de tal forma que a sessão escolha o novo grupo e esteja disponível para qualquer novo processo iniciado a partir dos menus, botões do painel ou o que for. Eu vim aqui apenas agora olhando para encontrar isso de novo, então não posso dizer agora como fazê-lo, e é provavelmente específico para o gerenciador de janelas. - mc0e


Respostas:


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

id -g

... lhe dará o ID do grupo principal atual. Nós vamos chamar isso orig_group para os propósitos deste exemplo. Então:

newgrp <new group name>

... mudará você para esse grupo como o 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 obter um fusível adicionado como um grupo a um usuário para que o sshfs funcione).

Edit: Isso não requer que você digite sua senha também, que su vai.


149



Bom truque, eu gosto - Simon
No Fedora eu tive que fazer newgrp $USER ao invés de newgrp <orig_group>. Isso significa que não precisei encontrar meu ID de grupo primário original, por isso é ainda mais fácil do que essa solução. - Richard Turner
Eu achei que era suficiente para fazer newgrp <new group name>. Este foi o Ubuntu 14.04 - Edward Falk
@EdwardFalk certo, mas você não pode (pode não) querer deixar esse grupo como seu principal ... - mimoralea
Note que cada newgrp cria um novo shell, portanto, quando você precisar sair completamente da sua sessão, precisará "sair da saída" para sair totalmente (: - jwd


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

su - $USER

id agora listará o novo grupo:

id

252



Acho que essa é a melhor abordagem em muitos casos, mas o autor original queria atualizar vários shells em uma sessão de tela. Esta solução teria que ser feita a partir de cada shell. - Adrian Ratnapala
Bom truque, funciona muito bem! - genpfault
A solução original também só consertaria uma única sessão de shell na tela. Eu apenas testei isso. O motivo pelo qual essa solução funciona é porque você está gerando uma nova sessão completa em vez de herdar do ambiente original. - Dror
Esta realmente deveria ser a resposta aceita. Bom truque, obrigado! - dotancohen
Isso requer que você digite uma senha, o que pode ser estranho / indesejado se você estiver tentando fazer isso em várias sessões. - Legooolas


Este truque bacana de esse link funciona 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.


115



+1 por não colocar o usuário em uma subcamada; você pode sair / sair como de costume com isso. Além disso, se NOPASSWD: estiver configurado em / etc / sudoers, você poderá usar exec sudo su -l $USER para evitar a solicitação de senha. - Ivan X
Esteja avisado: será solicitada uma senha sudo. Se você errar, o seu terminal será fechado. - Tyler Collier
@TylerCollier Ivan fez menção NOPASSWD: - pepoluan


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, assim você não precisa "sair" 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 at comando na tela executa um comando em qualquer janela que você especificar (note que este é um comando de tela, 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 obter id para executar na sessão de tela, e o ^ M para fazer com que a tela pressione "enter" no final do seu comando.

Note também que a tela stuff comando simplesmente digita o texto do 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 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 título de janela, 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"

19



Um forro impressionante, que não parece ter outros efeitos colaterais, obrigado! - Cyril Duchon-Doris


Você consegue fazer isso.

Adicione quantos grupos quiser usando usermod -G. Então, como o usuário com uma sessão em execução, execute newgrp - com apenas 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 a 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 newgrpvocê deveria ser bom. Você não precisa se preocupar em conhecer os grupos ou os IDs do grupo.

Boa sorte para você.


14



tentou em um xterm dentro de uma sessão X, mas não funcionou - dwery
tentei em uma sessão no tmux e não funcionou lá também - Michael
Tentei no Amazon linux 2, ele não funcionou - Cyril Duchon-Doris
newgrp - inicia um novo processo shell - Piotr Findeisen


Grupos são geralmente enumerados no login, não há como 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 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.


12



Na verdade, tenho certeza de que isso não é verdade - eu encontrei uma maneira de fazer isso antes em uma caixa Linux. No entanto, para a vida de mim, não consigo lembrar qual era o comando. Se eu encontrar, vou postar. Edit: Apenas achei, estou postando como resposta. - lunchmeat317


Usando newgrp comando resolvido problema para mim:

newgrp <GroupName>

Esta postagem do blog tem explicação detalhada.


9



Bem-vindo ao superusuário! Neste site de perguntas e respostas, tentamos fornecer boas respostas às perguntas que as pessoas postam. Uma parte disso é incluir a resposta no seu post, em vez de simplesmente fornecer um link para outra página que possa responder à pergunta. Por favor, edite sua resposta para incluir a solução real para a pergunta postada. - cascer1
Esta é a melhor maneira na minha opinião e deve ser marcada como a nova resposta aceita. - Dakatine


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 final newgrp - é 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 pôster original era como tornar grupos recém-adicionados visíveis em processos existentes. o gpasswd e usermod os comandos 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.


4



A propósito, exec su - <username> pode ser usado para obter um novo shell de login com grupos definidos, mas isso não funcionará em scripts porque um novo shell lerá comandos do terminal. Você poderia usar su -c "command ..." <myusername> para reiniciar seu script, mas o processo resultante não tem terminal de controle e, portanto, ocorrerá um erro se um editor de tela ou outro comando interativo for tentado. - jimav
Por que isso foi downvoted? Alguém pode explicar o que é ruim sobre isso, porque foi o que me ocorreu e acho que eu gosto mais? - jasonmp85
Gah, eu votei antes de testar. newgrp - faz não substitua o "grupo primário". A resposta de Patrick Conheady é a melhor aqui, já que não bifurca nem muda o grupo primário. - jasonmp85


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





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