Вопрос: Перезагрузите группы пользователей Linux без выхода из системы


При назначении списка дополнительных групп пользователя, используя:

# usermod -G <grouplist> <user>

возможно ли заставить это групповое задание вступить в силу, не выгружая все запущенные сеансы?

Это было бы очень полезно в ситуации, когда экран сеанс существует со многими запущенными командами, так как весь сеанс по существу необходимо уничтожить, чтобы сделать назначение группы вступившим в силу.

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

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


252
2018-04-17 19:50


Источник


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


Ответы:


Ужасно взломанный, но вы можете использовать два слоя newgrp для достижения этой цели для конкретной группы:

id -g

... даст вам текущий первичный идентификатор группы. Мы назовем это orig_group для целей этого примера. Затем:

newgrp <new group name>

... переключит вас в эту группу в качестве первичной и добавит ее в список групп, возвращаемых groups или id -G, Теперь, далее:

newgrp <orig_group>

... вы получите оболочку, в которой вы можете увидеть новую группу, а первичная - оригинальная.

Это ужасно, и вы получите только одну группу, добавленную за раз, но это помогло мне пару раз, чтобы добавить группы без выхода из системы / в течение всей моей X-сессии (например, чтобы добавить плагин в группу для пользователя так что sshfs будет работать).

Изменить. Это не требует ввода пароля. su будем.


148
2017-10-10 17:36



Хороший трюк, мне это нравится - Simon
В Fedora мне пришлось сделать newgrp $USER вместо newgrp <orig_group>, Это означает, что мне не нужно было найти свой первоначальный идентификатор основной группы, так что это даже проще, чем это решение. - Richard Turner
Я обнаружил, что этого достаточно newgrp <new group name>, Это был Ubuntu 14.04 - Edward Falk
@EdwardFalk правильно, но вы не можете (возможно, не захотите) оставить эту группу в качестве основной ... - mimoralea
Обратите внимание, что каждый newgrp создает новую оболочку, поэтому, когда вам нужно полностью выйти из сеанса, вам нужно выполнить «exit exit exit», чтобы получить весь выход (: - jwd


Изнутри оболочки вы можете выполнить следующую команду

su - $USER

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

id

251
2017-11-06 15:28



Я думаю, что это лучший подход во многих случаях, но оригинальный плакат действительно хотел обновить несколько оболочек в сеансе экрана. Это решение можно было бы сделать из каждой оболочки. - Adrian Ratnapala
Хороший трюк, отлично работает! - genpfault
Исходное решение также будет фиксировать только один сеанс оболочки на экране. Я просто испытал это. Причина этого решения заключается в том, что вы создаете совершенно новый сеанс, а не наследуете исходную среду. - Dror
Вы можете сделать команду немного более общей, например: su - $USER - bmaupin
Это действительно должен быть принятый ответ. Хороший трюк, спасибо! - dotancohen


Этот отличный трюк от эта ссылка прекрасно работает!

exec su -l $USER

Я решил, что разместил его здесь, так как каждый раз, когда я забываю, как это сделать, это первая ссылка, которая появилась в Google.


112
2018-06-18 16:27



+1 для того, чтобы не помещать пользователя в подоболочку; вы можете выйти и выйти, как обычно, с этим. Кроме того, если NOPASSWD: установлен в / etc / sudoers, вы можете вместо этого использовать exec sudo su -l $USER чтобы не запрашивать пароль. - Ivan X
Будьте внимательны: вас попросят ввести пароль sudo. Если вы ошибетесь, ваш терминал закроется. - Tyler Collier
@TylerCollier Ivan сделал упомянуть NOPASSWD: - pepoluan


1. Получение оболочки с новой группой без выхода из системы и снова

Если вы добавляете только одну группу, я использовал следующее:

exec sg <new group name> newgrp `id -gn`

Это вариация двухслойного трюка newgrp Legooolas, но она находится в одной строке и не требует, чтобы вы вручную вводили свою основную группу.

sg newgrp, но принимает команду для выполнения с новым идентификатором группы. exec означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды «выходить из системы».

В отличие от su, вам не нужно вводить пароль. Он также не обновляет вашу среду (кроме добавления группы), поэтому вы сохраняете текущий рабочий каталог и т. Д.

2. Выполнение команды во всех окнах экрана в сеансе

at Команда на экране запускает команду в любых окнах, которые вы указали (обратите внимание, что это команда Screen, а не команда оболочки).

Вы можете использовать следующую команду для отправки команды ко всем существующим сеансам экрана:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

Обратите внимание на необходимость избежать обратных шагов, чтобы получить id для запуска в сеансе экрана и ^ М, чтобы получить экран, чтобы нажать «enter» в конце вашей команды.

Обратите внимание, что экран stuff команда просто вводит текст команды от вашего имени. Поэтому может произойти что-то странное, если одно из окон экрана имеет наполовину написанную команду в командной строке или запускает приложение, отличное от оболочки (например, emacs, top). Если это проблема, у меня есть некоторые идеи:

  • Чтобы избавиться от какой-либо наполовину написанной команды, вы можете добавить «^ C» в начало команды.
  • Чтобы избежать запуска команды в окне emacs и т. Д., Вы можете попросить «at» фильтровать заголовок окна и т. Д. (В приведенном выше примере я использую «#», который соответствует всем окнам, но вы можете фильтровать по заголовку окна, пользователю , и т.д).

Чтобы запустить команду в определенном окне (идентифицируется номером окна), используйте следующее:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"

18
2017-12-17 21:33



Удивительный один лайнер, который, похоже, не имеет других побочных эффектов, спасибо! - Cyril Duchon-Doris


Вы можете сделать это.

Добавьте столько групп, сколько хотите. usermod -G, Затем, когда пользователь с запущенным сеансом запускает newgrp - с аргументом «-».

Это повторно инициализирует идентификатор группы по умолчанию, но также будет устанавливать и вторичные группы. Вы можете проверить это, выполнив groups от текущей сессии до и после usermod и newgrp,

Это нужно запускать с каждого открытого сеанса - я мало что знаю о экране. Однако, если можно выполнить итерацию по всем открытым сеансам и выполнить newgrp, вы должны быть хорошими. Вам не придется беспокоиться о знании групп или идентификаторов групп.

Удачи вам.


14
2018-01-30 16:17



попробовал xterm в течение X сеанса, но он не работал - dwery
пробовал на сеансе в tmux, и он там не работал - Michael
Пробовал на Amazon linux 2, он не работал - Cyril Duchon-Doris
newgrp - запускает новый процесс оболочки - Piotr Findeisen


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

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


12
2018-04-25 17:56



Честно говоря, я уверен, что это неверно - я нашел способ сделать это раньше на Linux-боксе. Однако, для жизни меня, я не могу вспомнить, что это за команда. Если я найду это, я отправлю его. Редактировать: просто нашел это, я отправляю его как ответ. - lunchmeat317


С помощью newgrp для меня решена проблема:

newgrp <GroupName>

Это сообщение в блоге имеет подробное объяснение.


9
2017-10-07 04:53



Добро пожаловать в Суперпользователя! На этом Q & A сайте мы пытаемся предоставить хорошие ответы на вопросы, которые публикуют люди. Часть этого включает ответ на ваш пост, вместо простого предоставления ссылки на другую страницу, которая может ответить на вопрос, Измените свой ответ, чтобы включить фактическое решение поставленного вопроса. - cascer1
Это лучший способ, на мой взгляд, и должен быть отмечен как новый принятый ответ. - Dakatine


Обобщить:

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

Использование «exec» означает замену существующей оболочки новой оболочкой, запущенной командой newgrp (так что выходим из новой оболочки).

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

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


4
2018-02-10 23:21



Кстати, exec su - <username> может использоваться для получения новой оболочки входа с установленными группами, но это не будет работать в сценариях, потому что новая оболочка будет читать команды с терминала. Вы можете использовать su -c "command ..." <myusername>для перезапуска вашего сценария, но в результате процесс не имеет управляющего терминала, и поэтому возникает ошибка при попытке редактирования редактора экрана или другой интерактивной команды. - jimav
Почему это было приостановлено? Может кто-то объяснить, что плохого в этом, потому что это было то, что произошло со мной, и я думаю, что мне это нравится лучше всего? - jasonmp85
Га, я проголосовал перед тестированием. newgrp - делает не замените «основную группу». Ответ Патрика Конгони здесь лучший, поскольку он не вилки и не изменения основной группы. - jasonmp85


У меня была аналогичная проблема, но также и для неавторизованных пользователей. Перезапуск nscd не помог, но выполнение этой команды: nscd -i group, Это должно помочь nscd (кэшировать демон) перезагрузить файл групп.


1
2017-11-13 16:07