1. Получение оболочки с новой группой без выхода и повторного входа
Если вы добавляете только одну группу, я использовал следующее:
exec sg <new group name> newgrp `id -gn`
Это разновидность двухслойного трюка Легуоласа с newgrp, но он в одну строку и не требует ручного входа в основную группу.
sg
является newgrp, но принимает команду для выполнения с новым идентификатором группы. Это exec
означает, что новая оболочка заменяет существующую, поэтому вам не нужно дважды выходить из системы.
В отличие от использования su, вам не нужно вводить пароль. Он также не обновляет вашу среду (кроме добавления группы), поэтому вы сохраняете текущий рабочий каталог и т. Д.
2. Выполнение команды во всех окнах экрана в сеансе
Команда at
в Screen запускает команду в любых окнах, которые вы укажете (обратите внимание, что это команда Screen, а не команда оболочки).
Вы можете использовать следующую команду, чтобы отправить команду всем существующим сеансам экрана:
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
Обратите внимание на необходимость избегать обратных галочек, чтобы id
запустить в сеансе Screen, и ^ M, чтобы заставить Screen нажать «enter» в конце вашей команды.
Также обратите внимание, что stuff
команда screen просто вводит текст команды от вашего имени. Поэтому может произойти что-то странное, если одно из окон экрана имеет наполовину написанную команду в командной строке или запускает приложение, отличное от оболочки (например, emacs, top). Если это проблема, у меня есть несколько идей:
- Чтобы избавиться от любой наполовину написанной команды, вы можете добавить «^ C» в начало команды.
- Чтобы избежать запуска команды в окне emacs и т. Д., Вы можете попросить `at 'отфильтровать заголовок окна и т. Д. (В приведенном выше примере я использую« # », который соответствует всем окнам, но вы можете фильтровать по заголовку окна, пользователю , и т.д).
Чтобы запустить команду в определенном окне (определяется номером окна), используйте следующее:
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"