1. Obtendo um shell com o novo grupo sem sair e entrar novamente
Se você estiver adicionando apenas um grupo, usei o seguinte:
exec sg <new group name> newgrp `id -gn`
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. Os exec
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:
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
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 se livrar de qualquer comando semi-escrito, você pode adicionar "^ C" ao início do comando.
- Para evitar a execução do comando em uma janela do emacs, etc, você pode pedir ao 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, 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"