1. Получение оболочки с новой группой без выхода и повторного входа
Если вы добавляете только одну группу, я использовал следующее:
exec sg <new group name> newgrp `id -gn`
Это разновидность двухслойного трюка Легуоласа newgrp, но он в одну строку и не требует ручного входа в основную группу.
sg
является newgrp, но принимает команду для выполнения с новым идентификатором группы. exec
означает, что новая оболочка заменяет существующую, поэтому вам не нужно дважды выходить из системы.
В отличие от использования su, вам не нужно вводить пароль. Он также не обновляет вашу среду (кроме добавления группы), поэтому вы сохраняете текущий рабочий каталог и т.д.
2. Выполнение команды во всех окнах экрана в сеансе
Команда at
в Screen запускает команду в любых окнах, которые вы укажете (обратите внимание, что это команда Screen, а не команда shell).
Вы можете использовать следующую команду, чтобы отправить команду всем существующим сеансам экрана:
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"