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 sair de todas as sessões em execução?
Isso seria muito útil na situação em que existe uma sessão de tela com muitos shells em execução, pois a sessão inteira precisa ser essencialmente destruída para que a atribuição do grupo entre em vigor.
Eu acho que posso alterar o grupo principal 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 na falta disso, talvez alguma maneira de forçar a Screen a executar o mesmo comando em cada um.
linux
shell
debian
permissions
gnu-screen
Simon
fonte
fonte
Respostas:
Horrivelmente hacky, mas você pode usar duas camadas
newgrp
para conseguir isso em um grupo específico:... fornecerá o ID do grupo principal atual. Chamaremos isso
orig_group
para os fins deste exemplo. Então:... alternará você para esse grupo como principal e o adicionará à lista de grupos retornados por
groups
ouid -G
. Agora, mais:... você receberá um shell no qual poderá ver o novo grupo e o principal é o original.
Isso é horrível e você só adiciona um grupo de cada vez, mas me ajudou algumas vezes a adicionar grupos sem fazer logout / em toda a minha sessão X (por exemplo, para adicionar um fusível como um grupo a um usuário para que o sshfs funcione).
Editar: Isso também não exige que você digite sua senha
su
.fonte
newgrp $USER
vez denewgrp <orig_group>
. Isso significa que não precisei encontrar meu ID de grupo primário original, por isso é ainda mais fácil do que esta solução.newgrp <new group name>
. Este foi Ubuntu 14.04newgrp
um deles cria um novo shell; portanto, quando você precisa sair totalmente da sua sessão, é necessário "exit exit exit" para obter todo o caminho (:De dentro de um shell, você pode emitir o seguinte comando
id agora listará o novo grupo:
fonte
Este truque bacana deste link funciona muito bem!
Eu pensei em publicá-lo aqui, pois sempre que esqueço como fazer isso, esse é o primeiro link que aparece no google.
fonte
exec sudo su -l $USER
para evitar a solicitação de senha.NOPASSWD:
1. Obtendo um shell com o novo grupo sem sair e entrar novamente
Se você estiver adicionando apenas um grupo, usei o seguinte:
Essa é uma variação do truque newgrp de duas camadas do Legooolas, mas está em uma linha e não exige que você insira manualmente seu grupo principal.
sg
é newgrp, mas aceita um comando para executar com o novo ID do grupo. Osexec
meios que o novo shell substitui o shell existente, para que você não precisa "logout" duas vezes.Ao contrário de usar su, você não precisa digitar sua senha. Ele também não atualiza seu ambiente (exceto a adição do grupo); portanto, você mantém seu diretório de trabalho atual etc.
2. Executando o comando em todas as janelas da tela em uma sessão
O
at
comando Screen executa um comando em qualquer janela que você especificar (observe 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:
Observe a necessidade de escapar dos backticks para
id
executar na sessão Screen e o ^ M para fazer com que a tela pressione 'enter' no final do seu comando.Observe também que o
stuff
comando da tela simplesmente digita o texto do comando em seu nome. Portanto, algo estranho pode acontecer se uma das janelas da tela tiver um comando semi-escrito em um prompt de comando ou estiver executando um aplicativo que não seja um shell (por exemplo, emacs, top). Se este for um problema, tenho algumas idéias:Para executar o comando em uma janela específica (identificada pelo número da janela), use o seguinte:
fonte
Usando o
newgrp
comando resolvido problema para mim:Esta postagem do blog tem explicação detalhada.
fonte
Os grupos geralmente são enumerados no login, não há como eu forçá-lo a refazer a enumeração de grupos sem fazer logoff e logon novamente.
Muitas respostas votadas aqui parecem usar uma solução alternativa que chama 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 do grupo até serem reinvocados de um shell novo, geralmente após o logout e o logon limpos.
fonte
Você consegue fazer isso.
Adicione quantos grupos você quiser usar
usermod -G
. Então, como usuário com uma sessão em execução, executenewgrp -
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 a
groups
partir da sessão atual, antes e depois dousermod
e donewgrp
.Isso deve ser executado em cada sessão aberta - não sei muito sobre tela. No entanto, se for possível iterar em todas as sessões abertas e executar
newgrp
, você deve ser bom. Você não precisará se preocupar em conhecer os grupos ou os IDs do grupo.Boa sorte para você.
fonte
newgrp -
inicia um novo processo de shellPara resumir:
Usar 'exec' significa substituir o shell existente pelo novo shell iniciado pelo comando newgrp (sair do novo shell faz o logout).
A final
newgrp -
é necessária para restaurar seu grupo principal normal, para que os arquivos criados posteriormente tenham esse nome como proprietário do grupo.Nota: A pergunta do pôster original era como tornar os grupos adicionados recentemente visíveis nos processos existentes. Os comandos
gpasswd
eusermod
não afetam os processos existentes; grupos adicionados recentemente (ou excluídos!) aparecem na sua conta (desaparecem da), ou seja, nos arquivos / etc / group e / etc / gshadow, mas as permissões dos processos existentes não são alteradas. Para remover permissões, você precisa eliminar todos os processos em execução;newgrp -
não relerá o arquivo / etc / group e redefinirá a lista de grupos; em vez disso, parece usar apenas os grupos anteriormente associados ao processo.fonte
exec su - <username>
pode ser usado para obter um novo shell de login com grupos configurados, mas isso não funcionará em scripts, porque um novo shell lerá comandos do terminal. Você pode usarsu -c "command ..." <myusername>
para reiniciar o script, mas o processo resultante não possui terminal de controle e, portanto, ocorrerá um erro se tentar um editor de tela ou outro comando interativo.newgrp -
se não substituir o "grupo principal". A resposta de Patrick Conheady é a melhor aqui, pois não bifurca nem altera o grupo principal.Eu tive um problema semelhante, mas também para usuários não logados. Reinício do nscd não ajudou, mas executar este comando fiz:
nscd -i group
. Isso deve instruir o nscd (daemon de cache) a recarregar o arquivo de grupos.fonte
Não consegui que o comando newgrp funcionasse. Não tenho certeza se isso depende de / etc / sudoers, mas normalmente tenho que digitar minha senha para sudo, e isso funcionou sem exigir minha senha:
fonte
Isso funciona, se você tiver,
sudo
e pode evitar que você digite sua senha mais uma vez em alguns casos:fonte