297

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

# usermod -G <grouplist> <user>

Можно ли заставить это групповое назначение вступить в силу без выхода из всех запущенных сеансов?

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

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

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

12 ответов12

303

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

su - $USER

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

id
179

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

id -g

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

newgrp <new group name>

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

newgrp <orig_group>

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

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

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

134

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

exec su -l $USER

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

28

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"
13

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

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

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

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

Удачи вам.

12

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

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

11

Использование команды newgrp решило проблему для меня:

newgrp <GroupName>

Этот пост имеет подробное объяснение.

4

Подвести итоги:

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

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

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

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

1

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

0

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

$ gpasswd -a user groupname

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

$ gpasswd -M user1,user2 groupname
0

Я не мог заставить команду 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .