1. Отримання оболонки з новою групою без виходу та повторного входу
Якщо ви додаєте лише одну групу, я використав наступне:
exec sg <new group name> newgrp `id -gn`
Це зміна двошарового фокусу newgrp Legooolas, але він знаходиться в одному рядку і не вимагає від вас вручну вводити основну групу.
sg
є newgrp, але приймає команду для виконання з новим ідентифікатором групи. Це exec
означає, що нова оболонка замінює існуючу оболонку, тому вам не потрібно двічі "виходити".
На відміну від використання su, вам не потрібно вводити свій пароль. Це також не оновлює ваше середовище (крім додавання групи), тому ви зберігаєте свій поточний робочий каталог тощо.
2. Виконання команди у всіх вікнах екрана за сеанс
at
Команда в екрані запускає команду в якій би вікна ви вкажете (зверніть увагу , що це команда екрану, а НЕ командна оболонка).
Ви можете використовувати таку команду, щоб надіслати команду на всі існуючі екранні сеанси:
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Зверніть увагу на необхідність уникнути задніх посилань, щоб id
запустити запуск на сеансі Screen, і ^ M, щоб екран натискав "Enter" в кінці вашої команди.
Зауважте також, що stuff
команда екрана просто вводить текст команди від вашого імені. Тому може трапитися щось дивне, якщо в одному з вікон екрана є команда напівписаної команди в командному рядку або працює інший додаток, ніж оболонка (наприклад, emacs, top). Якщо це питання, у мене є кілька ідей:
- Щоб позбутися будь-якої напівзаписаної команди, ви можете додати "^ C" до початку команди.
- Щоб уникнути запуску команди у вікні emacs тощо, ви можете попросити "at" фільтрувати за заголовком вікна тощо (у наведеному вище прикладі я використовую "#", що відповідає всім вікнам, але ви можете фільтрувати за заголовком вікна, користувачем тощо).
Щоб запустити команду у певному вікні (ідентифікований за номером вікна), використовуйте наступне:
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"