2011-04-17 19:50:06 +0000 2011-04-17 19:50:06 +0000
377
377

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

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

# usermod -G <grouplist> <user>

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

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

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

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

Ответы (12)

400
400
400
2011-11-06 15:28:07 +0000

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

su - $USER

id, которая теперь будет содержать список новой группы:

id
221
221
221
2011-10-10 17:36:48 +0000

H

168
168
168
2013-06-18 16:27:30 +0000

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

exec su -l $USER

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

35
35
35
2014-12-17 21:33:21 +0000

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

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

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

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

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

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

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

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

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

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Получение оболочки с новой группой без выхода из системы и снова 

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

exec sg newgrp id -gn “`

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

id - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. stuff означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды "выходить” из системы.

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

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

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

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

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

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

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

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды “выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

^M" “`

Обратите внимание, что для запуска &007 в сеансе Screen нужно выйти из бэк-тика, а ^M для получения Screen - нажать ‘enter’ в конце команды.

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

  • Чтобы избавиться от наполовину написанной команды, можно добавить ”^C" в начало команды.
  • Чтобы избежать выполнения команды в эмаковом окне и т.д., можно попросить `at’ фильтровать по заголовку окна и т.д. (в примере выше я использую “#”, что соответствует всем окнам, но можно фильтровать по заголовку окна, пользователю и т.д.)

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

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp ### 1. Получение оболочки с новой группой без выхода из системы и снова 

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

exec sg newgrp id -gn “`

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды "выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Получение оболочки с новой группой без выхода из системы и снова 

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

exec sg newgrp id -gn “`

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды "выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

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

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

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

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды “выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

^M" “`

Обратите внимание, что для запуска &007 в сеансе Screen нужно выйти из бэк-тика, а ^M для получения Screen - нажать ‘enter’ в конце команды.

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

  • Чтобы избавиться от наполовину написанной команды, можно добавить ”^C" в начало команды.
  • Чтобы избежать выполнения команды в эмаковом окне и т.д., можно попросить `at’ фильтровать по заголовку окна и т.д. (в примере выше я использую “#”, что соответствует всем окнам, но можно фильтровать по заголовку окна, пользователю и т.д.)

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

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

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

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

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды “выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Получение оболочки с новой группой без выхода из системы и снова 

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

exec sg newgrp id -gn “`

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды "выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

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

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

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

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

&007 - это newgrp, но он принимает команду для выполнения с новым идентификатором группы. &007 означает, что новая оболочка заменяет существующую оболочку, поэтому вам не нужно дважды “выходить” из системы.

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

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

Команда [ &007 ]&003 в Screen выполняет команду во всех указанных вами окнах (обратите внимание, что это команда Screen, а не shell).

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

^M" “`

Обратите внимание, что для запуска &007 в сеансе Screen нужно выйти из бэк-тика, а ^M для получения Screen - нажать ‘enter’ в конце команды.

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

  • Чтобы избавиться от наполовину написанной команды, можно добавить ”^C" в начало команды.
  • Чтобы избежать выполнения команды в эмаковом окне и т.д., можно попросить `at’ фильтровать по заголовку окна и т.д. (в примере выше я использую “#”, что соответствует всем окнам, но можно фильтровать по заголовку окна, пользователю и т.д.)

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

^M" “`

18
18
18
2016-10-07 04:53:42 +0000

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

newgrp <GroupName>

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

12
12
12
2012-01-30 16:17:03 +0000

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

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

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

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

Удачи вам.

11
11
11
2011-04-25 17:56:34 +0000

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

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

4
4
4
2017-02-10 23:21:38 +0000

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

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

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

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

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

1
1
1
2018-04-28 13:30:22 +0000

Я не смог заставить команду новобранцев работать. Я не уверен, зависит ли это от /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
0
0
2014-08-06 14:03:21 +0000

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

sudo su $USER
0
0
0
2019-10-21 22:03:04 +0000

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

Вот мое решение, которое использует много bash-isms: (обратите внимание, что окружающий скрипт нуждается в какой-то ветке, чтобы запустить эту функцию только в том случае, если требуемая группа в данный момент не активна):

(обратите внимание: скрипт подразумевает, что он запустил sudo adduser $user docker, что означает, что он также может просто запустить sudo docker везде вместо docker, но это было нежелательно в данном случае)

# save these for later
ORIGINAL_ARGS=("$@")

# This function is a little insane. The problem is this: user running
# this script is not a member of docker group, but used 'sudo' to add
# themselves to group. Without logging out and back in, the only way
# to gain access to that group is via the 'newgrp' command, which
# unfortunately starts a new shell rather than an arbitrary command...
#
# Also, we're going to newgrp twice: first to add the new group and
# again to restore the original group (but the new group remains in
# the 'groups' output).
#
# So this horrendous hack dups stdin to fd3 for later. Then runs
# 'newgrp' piping in a script that runs 'newgrp' a second time, piping
# in another script that restores stdin from fd3 and execs the
# original command...
restart-newgrp-newgrp() {
  # dup original stdin to fd3
  exec 3<&0

  local group="$1"
  local command="$0"
  local arg
  for arg in "${ORIGINAL_ARGS[@]}"; do
    printf -v command "%s %q" "$command" "$arg"
  done

  # restore original stdin from fd3; also replace any single-quote in
  # command with '"'"' to embed it in a single-quoted string
  local script
  printf -v script "exec newgrp %q <<<'exec <&3-; exec %s'" "$(id -gn)" "${command///\"\"}"

  exec newgrp "$group" <<<"$script"
}
0
0
0
2014-11-13 16:07:46 +0000

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

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

6
10
11
8
2