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

De groepstoewijzingen van een Linux-gebruiker herladen zonder uit te loggen

Bij het toewijzen van de secundaire groepslijst van een gebruiker met behulp van:

# usermod -G <grouplist> <user>

is het mogelijk om deze groepstoewijzing in werking te laten treden zonder alle lopende sessies uit te loggen?

Dit zou zeer nuttig zijn in de situatie waarin een Scherm sessie bestaat met veel lopende schelpen, aangezien de hele sessie in wezen moet worden vernietigd om de groepstoewijzing in werking te laten treden.

Ik denk dat ik de primaire groep van de gebruiker in een draaiende shell kan veranderen met het newgrp commando - is er een alternatief dat zou werken voor secundaire groepen?

Idealiter zou ik iets willen dat in elke shell effect zou hebben zonder dat het handmatig in elke shell wordt uitgevoerd, maar als dat niet lukt, zou het misschien een manier zijn om Scherm te dwingen om hetzelfde commando in elke shell uit te voeren.

Antwoorden (12)

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

Vanuit een commandoregel kunt u het volgende commando geven

su - $USER

id zal nu de nieuwe groep weergeven:

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

Vreselijk hacky, maar je zou twee lagen van newgrp kunnen gebruiken om dit te bereiken voor een bepaalde groep:

id -g

…geeft je de huidige primaire groep ID. We noemen dit orig_group in dit voorbeeld. Dan:

newgrp <new group name>

…schakelt u over naar die groep als primaire groep en voegt deze toe aan de lijst van groepen die door groups of id -G worden geretourneerd. Nu nog:

newgrp <orig_group>

…geeft je een schil waarin je de nieuwe groep kunt zien en de primaire is de originele.

Dit is verschrikkelijk en geeft je slechts één groep tegelijk, maar het heeft me een paar keer geholpen om groepen toe te voegen zonder uit te loggen/in mijn hele X-sessie (e. g. om een zekering als groep aan een gebruiker toe te laten voegen zodat sshfs zullen werken).

Edit : Hiervoor hoef je ook niet je wachtwoord in te typen, wat su wel zal doen.

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

Deze handige truc uit deze link werkt geweldig!

exec su -l $USER

Ik dacht dat ik het hier zou plaatsen, want elke keer als ik vergeet hoe ik dit moet doen, is dit de eerste link die in google naar voren komt.

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

1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in

Als je maar één groep toevoegt, heb ik het volgende gebruikt:

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

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

sg is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De exec betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het at commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in 

Als je maar één groep toevoegt, heb ik het volgende gebruikt: 

exec sg newgrp id -gn “`

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

id is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De stuff betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het &007 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

id -gn### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in

Als je maar één groep toevoegt, heb ik het volgende gebruikt:

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

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

^M” “`

Let op de noodzaak om de backticks te ontlopen om &007 in de Scherm-sessie te laten draaien, en de ^M om Scherm op ‘enter’ te laten drukken aan het einde van uw opdracht.

Let ook op het [ &007 ]&003 commando op het scherm, dat eenvoudigweg de opdrachttekst namens u typt. Daarom kan er iets vreemds gebeuren als een van de schermvensters een half geschreven commando heeft op een commandoprompt of een andere toepassing dan een commandoregel uitvoert (bijv. emacs, top). Als dit een probleem is, heb ik enkele ideeën:

  • Om van een half geschreven commando af te komen, kun je ”^C" toevoegen aan het begin van het commando.
  • Om te voorkomen dat het commando in een emacs venster wordt uitgevoerd, etc, kun je `at’ vragen om te filteren op venstertitel etc (in het bovenstaande voorbeeld gebruik ik “#”, wat overeenkomt met alle vensters, maar je kunt filteren op venstertitel, gebruiker, etc).

Om het commando in een specifiek venster uit te voeren (geïdentificeerd op vensternummer), gebruik je het volgende:

screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp ### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in 

Als je maar één groep toevoegt, heb ik het volgende gebruikt: 

exec sg newgrp id -gn “`

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in 

Als je maar één groep toevoegt, heb ik het volgende gebruikt: 

exec sg newgrp id -gn ”`

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

id -gn### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in

Als je maar één groep toevoegt, heb ik het volgende gebruikt:

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

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

^M" “`

Let op de noodzaak om de backticks te ontlopen om &007 in de Scherm-sessie te laten draaien, en de ^M om Scherm op ‘enter’ te laten drukken aan het einde van uw opdracht.

Let ook op het [ &007 ]&003 commando op het scherm, dat eenvoudigweg de opdrachttekst namens u typt. Daarom kan er iets vreemds gebeuren als een van de schermvensters een half geschreven commando heeft op een commandoprompt of een andere toepassing dan een commandoregel uitvoert (bijv. emacs, top). Als dit een probleem is, heb ik enkele ideeën:

  • Om van een half geschreven commando af te komen, kun je ”^C" toevoegen aan het begin van het commando.
  • Om te voorkomen dat het commando in een emacs venster wordt uitgevoerd, etc, kun je `at’ vragen om te filteren op venstertitel etc (in het bovenstaande voorbeeld gebruik ik “#”, wat overeenkomt met alle vensters, maar je kunt filteren op venstertitel, gebruiker, etc).

Om het commando in een specifiek venster uit te voeren (geïdentificeerd op vensternummer), gebruik je het volgende:

id -gn### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in

Als je maar één groep toevoegt, heb ik het volgende gebruikt:

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

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp ### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in 

Als je maar één groep toevoegt, heb ik het volgende gebruikt: 

exec sg newgrp id -gn “`

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

id -gn### 1. Een shell krijgen met de nieuwe groep zonder uit te loggen en weer in

Als je maar één groep toevoegt, heb ik het volgende gebruikt:

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

Dit is een variatie op Legooolas’ tweelaagse newgrp truc, maar het zit in één regel en vereist niet dat je handmatig je primaire groep invoert.

&007 is newgrp maar accepteert een commando om uit te voeren met het nieuwe groeps-ID. De &007 betekent dat de nieuwe commandoregel de bestaande commandoregel vervangt, zodat u niet twee keer hoeft uit te loggen.

In tegenstelling tot het gebruik van su, hoeft u uw wachtwoord niet in te voeren. Het vernieuwt ook je omgeving niet (behalve het toevoegen van de groep), dus je behoudt je huidige werkmap etc.

2. Het [ &007 ]&003 commando in Scherm voert een commando uit in alle vensters die je specificeert (let op: dit is een Scherm commando, geen shell commando).

U kunt het volgende commando gebruiken om de opdracht naar alle bestaande Scherm-sessies te sturen:

^M” “`

Let op de noodzaak om de backticks te ontlopen om &007 in de Scherm-sessie te laten draaien, en de ^M om Scherm op ‘enter’ te laten drukken aan het einde van uw opdracht.

Let ook op het [ &007 ]&003 commando op het scherm, dat eenvoudigweg de opdrachttekst namens u typt. Daarom kan er iets vreemds gebeuren als een van de schermvensters een half geschreven commando heeft op een commandoprompt of een andere toepassing dan een commandoregel uitvoert (bijv. emacs, top). Als dit een probleem is, heb ik enkele ideeën:

  • Om van een half geschreven commando af te komen, kun je ”^C" toevoegen aan het begin van het commando.
  • Om te voorkomen dat het commando in een emacs venster wordt uitgevoerd, etc, kun je `at’ vragen om te filteren op venstertitel etc (in het bovenstaande voorbeeld gebruik ik “#”, wat overeenkomt met alle vensters, maar je kunt filteren op venstertitel, gebruiker, etc).

Om het commando in een specifiek venster uit te voeren (geïdentificeerd op vensternummer), gebruik je het volgende:

^M" “`

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

Het gebruik van het newgrp commando heeft het probleem voor mij opgelost:

newgrp <GroupName>

Deze blogpost heeft een gedetailleerde uitleg.

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

U kunt dit doen.

Voeg zoveel groepen toe als u wilt met usermod -G. Voer dan, als de gebruiker met een lopende sessie, newgrp - uit met alleen het ‘-’ argument.

Dit herinitialiseert de groep id naar de standaard, maar het stelt ook de secundaire groepen in. U kunt dit controleren door groups uit te voeren vanuit de huidige sessie, voor en na de usermod en de newgrp.

Dit moet worden uitgevoerd vanuit elke open sessie - ik weet niet veel over het scherm. Echter, als het mogelijk is om te itereren over alle open sessies en newgrp te draaien, moet je goed zijn. Je hoeft je geen zorgen te maken over het kennen van de groepen of de groeps-ID’s.

Veel succes.

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

Groepen worden meestal opgesomd bij het inloggen, ik weet niet hoe ik het kan dwingen om de groepstelling opnieuw te doen zonder uit te loggen en weer in te loggen.

Veel antwoorden die hier zijn gestemd lijken een workaround te gebruiken die een nieuwe shell met een nieuwe omgeving oproept (hetzelfde als het opnieuw inloggen). de ouder-shell en alle andere continu lopende programma’s zullen over het algemeen niet het nieuwe groepslidmaatschap ontvangen totdat ze opnieuw worden opgeroepen vanuit een nieuwe shell, meestal na een schone logout en het inloggen.

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

Om samen te vatten: exec newgrp <newlyaddedgroupname1> exec newgrp <newlyaddedgroupname2> ... exec newgrp -

Met ‘exec’ wordt de bestaande commandoregel vervangen door de nieuwe commandoregel die gestart wordt door het newgrp commando (dus het verlaten van de nieuwe commandoregel logt uit).

De uiteindelijke newgrp - is nodig om je normale primaire groep te herstellen, dus bestanden die je later aanmaakt hebben dat als hun groepseigenaar.

Opmerking: De oorspronkelijke poster vroeg hoe je nieuw toegevoegde groepen zichtbaar kon maken in bestaande processen. De gpasswd en usermod commando’s hebben geen invloed op bestaande processen; nieuw toegevoegde (of verwijderde!) groepen verschijnen in (verdwijnen uit) uw account, d.w.z. in de /etc/group en /etc/gshadow bestanden, maar de rechten voor bestaande processen worden niet gewijzigd. Om verwijder rechten moet je alle lopende processen uitschakelen; newgrp - zal /etc/group niet herlezen en de groepslijst resetten; in plaats daarvan lijkt het gewoon de groepen te gebruiken die eerder aan het proces waren gekoppeld.

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

Ik kon het newgrp-commando niet aan het werk krijgen. Ik weet niet zeker of dit afhankelijk is van /etc/sudoers, maar normaal gesproken moet ik mijn wachtwoord voor sudo intypen, en dit werkte zonder dat ik mijn wachtwoord nodig had:

[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

Dit doet de truc als je sudo hebt en het kan je in sommige gevallen besparen om je wachtwoord nog een keer in te voeren:

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

Ik moest dit doen in een shell script (script voegt de huidige gebruiker toe aan een groep, draait later commando’s die dat groepslidmaatschap vereisen). Het newgrp commando is broos omdat het alleen een nieuwe shell kan draaien in plaats van een willekeurig commando (ik wil het huidige shell script opnieuw uitvoeren met de originele commandoregel args).

Hier is mijn oplossing, die veel bash-isms gebruikt: (merk op dat het omringende script een soort tak nodig heeft om deze functie alleen uit te voeren als de vereiste groep op dat moment niet actief is):

(merk op: het script impliceert dat het sudo adduser $user docker draait, wat betekent dat het ook gewoon sudo docker overal kan draaien in plaats van docker, maar dat was in dit geval ongewenst)

# 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

Ik had een soortgelijk probleem, maar ook voor niet ingelogde gebruikers. Herstarten van nscd hielp niet, maar het uitvoeren van dit commando wel: nscd -i group. Dat zou nscd (caching daemon) moeten instrueren om het groepsbestand opnieuw te laden.