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

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

  # usermod -G <grouplist> & Lt; & пользователь GT;
 

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

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

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

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

249 голосов | спросил Simon 17 PMpSun, 17 Apr 2011 23:50:06 +040050Sunday 2011, 23:50:06

12 ответов


147

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

  id -g
 

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

  newgrp <новое имя группы>
 

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

  newgrp <orig_group>
 

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

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

Изменить: это не требует ввода пароля, который будет su .

ответил Legooolas 10 +04002011-10-10T21:36:48+04:00312011bEurope/MoscowMon, 10 Oct 2011 21:36:48 +0400 2011, 21:36:48
251

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

  su - $ USER
 
Теперь

id будет отображать новую группу:

  идентификатор
 
ответил stivlo 6 72011vEurope/Moscow11bEurope/MoscowSun, 06 Nov 2011 19:28:07 +0400 2011, 19:28:07
112

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

  exec su -l $ USER
 

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

ответил jhaagsma 18 J0000006Europe/Moscow 2013, 20:27:30
18

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

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

  exec sg <новое имя группы> 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"
 
ответил Patrick Conheady 18 ThuEurope/Moscow2014-12-18T00:33:21+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 00:33:21 +0300 2014, 00:33:21
14

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

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

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

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

Удачи вам.

ответил lunchmeat317 30 Jpm1000000pmMon, 30 Jan 2012 20:17:03 +040012 2012, 20:17:03
12

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

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

ответил Mister_Tom 25 PMpMon, 25 Apr 2011 21:56:34 +040056Monday 2011, 21:56:34
9

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

  newgrp <GroupName>
 

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

ответил Pavan Vegirouthu 7 +03002016-10-07T07:53:42+03:00312016bEurope/MoscowFri, 07 Oct 2016 07:53:42 +0300 2016, 07:53:42
4

Подводя итог:

  exec newgrp <newaddedgroupname1>
exec newgrp <newaddedgroupname2>
...
exec newgrp -
 

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

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

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

ответил jimav 11 FebruaryEurope/MoscowbSat, 11 Feb 2017 02:21:38 +0300000000amSat, 11 Feb 2017 02:21:38 +030017 2017, 02:21:38
1

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

ответил Marki555 13 42014vEurope/Moscow11bEurope/MoscowThu, 13 Nov 2014 19:07:46 +0300 2014, 19:07:46
0

Это делает трюк, если у вас есть sudo , и в некоторых случаях он может спасти вас от ввода пароля:

  sudo su $ USER
 
ответил guaka 6 PM00000060000002131 2014, 18:03:21
0

Немного поздно для вечеринки, gpasswd должен выполнить задание, не создавая новый сеанс:

  $ gpasswd -a user groupname
 

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

  $ gpasswd -M user1, user2 groupname
 
ответил Tombart 18 52016vEurope/Moscow11bEurope/MoscowFri, 18 Nov 2016 17:26:14 +0300 2016, 17:26:14
0

Я не мог заставить команду newgrp работать. Я не уверен, зависит ли это от /etc /sudoers, но обычно я должен ввести пароль для sudo, и это сработало без моего пароля:

  [leo60228 @ leonix: ~] $ groups
колесо пользователя

[leo60228 @ leonix: ~] $ sudo echo hi
[sudo] пароль для leo60228:
Здравствуй

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

[leo60228 @ leonix: ~] $ exec sudo -i -u $ (whoami) # нет пароля необходимо

[leo60228 @ leonix: ~] $ groups
Пользователи
 
ответил snuggles08 28 PMpSat, 28 Apr 2018 16:30:22 +030030Saturday 2018, 16:30:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132