Перезавантажте групові завдання користувача Linux без виходу з системи


348

При призначенні списку вторинних груп користувача за допомогою:

# usermod -G <grouplist> <user>

чи можна змусити це групове призначення набути чинності без виходу з усіх запущених сеансів?

Це було б дуже корисно в ситуації, коли сеанс на екрані існує з багатьма запущеними оболонками, оскільки весь сеанс, по суті, повинен бути знищений для того, щоб призначення групи набуло чинності.

Я думаю, що я можу змінити основну групу користувача у запущеній оболонці за допомогою newgrpкоманди - чи є якась альтернатива, яка б працювала для вторинних груп?

В ідеалі я хотів би, щоб щось діяло в кожній оболонці, не запускаючись вручну в кожній, але, якщо цього не вдасться, можливо, якийсь спосіб змусити Screen виконувати одну і ту ж команду в кожній.


Я знаю, що принаймні для деяких менеджерів вікон / сесій можна зробити це таким чином, щоб сеанс підбирав нову групу, і вона була доступна для будь-яких нових процесів, запущених з меню, кнопок панелі чи будь-чого іншого. Я прийшов сюди тільки зараз, шукаючи, щоб знову це знайти, тому зараз не можу сказати, як це зробити, і це, мабуть, специфічно для менеджера вікон.
mc0e

Відповіді:


205

Жахливо хакі, але ви можете використовувати два шари, newgrpщоб досягти цього для певної групи:

id -g

... дасть вам поточний ідентифікатор первинної групи. Ми це назвемо orig_groupдля цього прикладу. Тоді:

newgrp <new group name>

... переключить вас у цю групу як основну та додасть її до списку груп, повернених groupsабо id -G. Тепер, далі:

newgrp <orig_group>

... отримає оболонку, в якій ви зможете побачити нову групу, а первинна - оригінальна.

Це жахливо, і ви отримаєте лише одну групу за один раз, але це допомогло мені кілька разів отримати групи, додані без виходу з системи / протягом усього мого сеансу X (наприклад, щоб запобіжник додався як група до користувача щоб sshfs працював).

Редагувати: для цього не потрібно вводити свій пароль, який suбуде.


6
Хороший трюк, мені подобається
Саймон

1
На Fedora мені довелося робити newgrp $USERзамість newgrp <orig_group>. Це означає, що мені не довелося знайти свій оригінальний ідентифікатор первинної групи, тому це навіть простіше, ніж це рішення.
Річард Тернер

2
Я вважав, що цього достатньо зробити newgrp <new group name>. Це було Ubuntu 14.04
Едвард Фолк

4
@EdwardFalk правильно, але ви не можете (можливо, не хочете) залишати цю групу як свою основну ...
mimoralea

4
Зауважте, що кожен newgrpстворює нову оболонку, тож коли вам потрібно повністю вийти з сеансу, вам потрібно зробити "вихід вихід", щоб отримати весь шлях (:
jwd

370

Зсередини оболонки можна видати таку команду

su - $USER

id тепер перелічить нову групу:

id

3
Я думаю, що це найкращий підхід у багатьох випадках, але оригінальний плакат хотів оновлювати декілька оболонок під час сеансу на екрані. Це рішення можна було б зробити з кожної оболонки.
Адріан Ратнапала

3
Гарний трюк, чудово працює!
genpfault

4
Оригінальне рішення також фіксувало б лише один сеанс оболонки на екрані. Я щойно це перевірив. Причина цього рішення працює в тому, що ви нерестуєте повний новий сеанс, а не успадковуєте його від початкового середовища.
Dror

4
Це дійсно має бути прийнятою відповіддю. Гарний трюк, спасибі!
dotancohen

2
Це вимагає, щоб ви ввели пароль, який може бути незручним / небажаним, якщо ви намагаєтеся це робити протягом багатьох сеансів.
Legooolas

155

Цей вишуканий трюк із цього посилання чудово працює!

exec su -l $USER

Я подумав, що опублікую його тут, як кожен раз, коли я забуду, як це зробити, це перше посилання, яке з'явилося в Google.


14
+1 за не розміщення користувача в передплаті; Ви можете вийти / вийти, як зазвичай, за допомогою цього. Крім того, якщо NOPASSWD: встановлено в / etc / sudoers, ви можете використовувати його, exec sudo su -l $USERщоб уникнути запиту пароля.
Іван X

21
Зверніть увагу: вам буде запропоновано пароль для sudo. Якщо ви помиляєтесь, ваш термінал закриється.
Тайлер Колліер,

1
@TylerCollier Іван зробив згадкаNOPASSWD:
pepoluan

32

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"

Дивовижний один вкладиш, який, схоже, не має інших побічних ефектів, дякую!
Кирило Дюшон-Доріс


12

Групи, як правило, перераховуються при вході в систему, і я не маю змоги змусити її повторно робити групове перерахування без виходу з системи та повторного входу.

Багато проголосованих тут відповідей, здається, використовують вирішення, яке викликає нову оболонку зі свіжим середовищем (те саме, що знову входити в систему). батьківська оболонка та всі інші безперервно запущені програми, як правило, не отримуватимуть нове членство в групі доти, доки не будуть повторно викликані з нового оболонки, як правило, після чистого виходу та реєстрації.


Правда, я майже впевнений, що це неправда - я знайшов спосіб це зробити раніше на скриньці Linux. Однак за все життя я не можу пригадати, якою була команда. Якщо я знайду його, опублікую. Редагувати: Щойно знайшов, я публікую це як відповідь.
обідне м’ясо317

1
Дякую, що ви вказали на це, це також моє розуміння. Кожна інша відповідь тут просто відкриває нову оболонку, незалежно від того, замінює вона одну відкриту оболонку чи екран перезавантаження чи інше. Немає чарівної панацеї, щоб видавати команду чи сценарій, і кожен запущений сеанс, включаючи ваш X сеанс, відображає нове членство в групі.
скрав

12

Ви можете це зробити.

Додайте стільки груп, скільки ви хочете використовувати usermod -G. Потім, як користувач із запущеним сеансом, запустіть newgrp -лише аргумент '-'.

Це повторно реалізує ідентифікатор групи за замовчуванням, але також встановить і вторинні групи. Ви можете перевірити це, запустивши groupsз поточної сесії, до і після того , як usermodі newgrp.

Це потрібно запускати з кожного відкритого сеансу - я не знаю багато про екран. Однак, якщо є можливість повторити всі відкриті сесії та запустити newgrp, ви повинні бути хорошими. Вам не доведеться турбуватися про те, щоб знати групи або ідентифікатори групи.

Вдачі вам


11
приміряв xterm в рамках сесії X, але це не спрацювало
dwery

3
спробував на сесії в tmux, і там теж не вийшло
Майкл

2
Спробував на Amazon linux 2, не вийшло
Кирило Дюшон-Доріс

1
newgrp -розпочинає новий процес оболонки
Piotr Findeisen

Зважаючи на ваш коментар до відповіді Mister_Tom, це, як і всі інші відповіді, обхідне рішення. Відповідь Mister_Tom все ще правильна.
scravy

4

Узагальнити:

exec newgrp <newlyaddedgroupname1>
exec newgrp <newlyaddedgroupname2>
...
exec newgrp -

Використання "exec" означає заміну існуючої оболонки на нову оболонку, запущену командою newgrp (так що вихід із нової оболонки виходить із системи).

Фінал newgrp -необхідний для відновлення нормальної первинної групи, тому файли, які ви згодом створите, матимуть це як власник групи.

Примітка. Питання оригінального плаката полягало в тому, як зробити новододані групи видимими в існуючих процесах. gpasswdІ usermodкоманди не впливають на існуючі процеси; нещодавно додані (або видалені!) групи з’являються у (зникають з) вашого облікового запису, тобто у файлах / etc / group та / etc / gshadow, але дозволи для існуючих процесів не змінюються. Щоб видалити дозволи, ви повинні знищити будь-які запущені процеси; newgrp -не перечитає / etc / group та не скине список груп; натомість, здається, просто використовують групи, раніше пов’язані з процесом.


До речі, exec su - <username>його можна використовувати для отримання нової оболонки для входу із встановленими групами, але це не працюватиме в скриптах, оскільки нова оболонка буде читати команди з терміналу. Ви можете використати su -c "command ..." <myusername>для перезапуску сценарію, але в результаті процес не має керуючого терміналу, тому помилка редактора екрана чи іншої інтерактивної команди буде здійснена.
jimav

Чому це було знято? Чи може хтось пояснити, що в цьому погано, адже саме це мені прийшло в голову і я думаю, що мені це найбільше подобається?
jasonmp85

Гах, я проголосував перед тестуванням. newgrp -ніяк НЕ замінить «основну групу». Відповідь Патріка Кондіді є найкращою тут, оскільки вона ні розвиває, ні змінює основну групу.
jasonmp85

1

У мене була схожа проблема, але також для користувачів, які не ввійшли в систему. Перезавантаження ДКНБ не допомогло, але виконання цієї команди зробив: nscd -i group. Це повинно доручити nscd (кешований демон) перезавантажити файл груп.


1

Я не зміг заставити команду newgrp працювати. Я не впевнений, чи це залежить від / etc / sudoers, але я зазвичай мушу вводити свій пароль для sudo, і це спрацювало, не вимагаючи мого пароля:

[leo60228@leonix:~]$ groups
users wheel

[leo60228@leonix:~]$ sudo echo hi
[sudo] password for leo60228:
hi

[leo60228@leonix:~]$ sudo -k # reset sudo timeout

[leo60228@leonix:~]$ exec sudo -i -u $(whoami) # no password necessary

[leo60228@leonix:~]$ groups
users wheel docker

0

Це робить трюк, якщо у вас є, sudoі це може врятувати вас від введення пароля ще раз у деяких випадках:

sudo su $USER
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.