Çıkış yapmadan bir Linux kullanıcısının grup atamalarını yeniden yükleyin


338

Bir kullanıcının ikincil grup listesini atarken:

# usermod -G <grouplist> <user>

Tüm çalışan oturumları kapatmadan bu grup çalışmasını yürürlüğe girmeye zorlamak mümkün mü?

Bu, çok sayıda çalışan mermi ile bir Screen oturumunun olduğu durumlarda , grubun atamasının yürürlüğe girmesi için tüm oturumun esasen imha edilmesi gerektiğinden çok faydalı olacaktır .

Sanırım kullanıcının birincil grubunu çalışan bir kabukta newgrpkomutu kullanarak değiştirebilirim - ikincil gruplar için işe yarayacak bir alternatif var mı?

İdeal olarak, her bir kabukta, her birinde manuel olarak çalıştırılmadan etkili olacak bir şey istiyorum, ancak bunu, belki de Ekranın her birinde aynı komutu yerine getirmesi için zorlamanın bir yolu.


En azından bazı pencere / oturum yöneticileri için, oturumun yeni grubu seçebileceği ve menülerden, panel düğmelerinden ya da her neyse başlatılan her yeni işlem için kullanılabilir olduğunu biliyorum. Buraya şimdi tekrar bulmaya geldim, o yüzden şimdi nasıl yapılacağını söyleyemem ve muhtemelen pencere yöneticisine özgüdür.
mc0e

Yanıtlar:


201

Korkunç derecede saldırgan ama newgrpbelirli bir grup için bunu başarmak için iki katman kullanabilirsiniz :

id -g

... size mevcut birincil grup kimliğini verecektir. orig_groupBu örneği bu amaç için arayacağız . Sonra:

newgrp <new group name>

... sizi o gruba birincil olarak geçirecek ve groupsya da tarafından döndürülen gruplar listesine ekleyecektir id -G. Şimdi, bir başka:

newgrp <orig_group>

... size yeni grubu görebileceğiniz bir kabuk verecek ve birincil olanı orijinal olanıdır.

Bu korkunç bir şeydir ve size bir seferde yalnızca bir grup ekleyecektir, ancak tüm X oturumumda oturum açmadan / gruba giriş yapmadan eklenmiş gruplar elde etmek için birkaç kez bana yardımcı oldu (örneğin, bir kullanıcıya gruba sigorta eklenmesi için) böylece sshfs çalışacak).

Düzenleme: Bu ya, hangi şifrenizi yazmanız gerekmez suolacak.


6
Güzel numara, beğendim
Simon

1
Fedora'da newgrp $USERbunun yerine yapmak zorunda kaldım newgrp <orig_group>. Bu, orijinal birincil grup kimliğimi bulmak zorunda olmadığım anlamına geliyordu, bu yüzden bu çözümden daha kolay.
Richard Turner

2
Bunu yapmak için yeterli olduğunu buldum newgrp <new group name>. Bu Ubuntu idi 14.04
Edward Falk

4
@EdwardFalk haklı, ama bu grubu birincil olarak bırakmak istemiyorsunuz (belki de değil) ...
mimoralea

4
Her birinin newgrpyeni bir kabuk yarattığını unutmayın , bu nedenle oturumunuzdan tamamen çıkmanız gerektiğinde, tüm yolu bulmak için "exit exit exit" yapmanız gerekir (:
jwd

357

Bir kabuğun içinden, aşağıdaki komutu verebilirsiniz

su - $USER

kimliği şimdi yeni grubu listeleyecek:

id

2
Bunun birçok durumda en iyi yaklaşım olduğunu düşünüyorum, ancak orijinal poster bir ekran oturumu içerisinde birden fazla mermi güncellemek istedi. Bu çözelti her bir kabuğundan yapılıyordu.
Adrian Ratnapala

2
Güzel numara, harika çalışıyor!
genpfault

4
Orijinal çözüm, ekrandaki yalnızca tek bir kabuk oturumunu da düzeltecektir. Daha yeni test ettim. Bu çözümün işe yaramasının nedeni, orijinal ortamdan miras almak yerine tamamen yeni bir oturum başlattığınızdır.
Dror,

3
Bu gerçekten kabul edilen cevap olmalı. Güzel numara, teşekkürler!
dotancohen

2
Bu, çok sayıda oturumda yapmaya çalışıyorsanız, garip / istenmeyen bir şifre olsa da yazmanızı gerektirir.
Legooolas

151

Bu bağlantıdan bu şık numara harika çalışıyor!

exec su -l $USER

Bunu nasıl yapacağımı unuttuğum her zaman buraya göndereceğimi düşündüm, bu google'da ortaya çıkan ilk bağlantı.


14
Kullanıcıyı alt kabuğa koymadığı için +1; bununla her zamanki gibi çıkış / çıkış yapabilirsiniz. Ayrıca, NOPASSWD: / etc / sudoers içinde ayarlanmışsa, exec sudo su -l $USERşifre sorulmasını önlemek için kullanabilirsiniz .
Ivan X,

21
Tavsiye edilir: Bir sudo şifresi istenir. Yanlış yaparsan terminalin kapanacak.
Tyler Collier

1
@TylerCollier Ivan yaptığı sözNOPASSWD:
pepoluan

32

1. Yeni gruptan çıkış yapıp tekrar açmadan bir kabuk alma

Yalnızca bir grup ekliyorsanız, aşağıdakileri kullandım:

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

Bu, Legooolas'ın iki katmanlı newgrp numarasındaki bir varyasyondur, ancak bir satırdadır ve birincil grubunuza manuel olarak girmenizi gerektirmez.

sgnewgrp, ancak yeni grup kimliği ile çalıştırılacak bir komutu kabul ediyor. execİki kere "çıkış" gerekmez çok yeni kabuk, mevcut kabuk değiştirir anlamına gelir.

Su kullanmanın aksine, şifrenizi girmenize gerek yoktur. Ayrıca ortamınızı yenilemez (grup eklemek dışında), bu nedenle geçerli çalışma dizininizi de korursunuz.

2. Bir oturumdaki tüm Ekran pencerelerinde komutu yürütme

Ekrandaki atkomut, belirttiğiniz pencerelerde bir komut çalıştırır (bunun bir kabuk komutu değil, bir Ekran komutu olduğunu unutmayın).

Komutu varolan tüm Ekran oturumlarına göndermek için aşağıdaki komutu kullanabilirsiniz:

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

idEkran oturumunda çalıştırmak için geri tepmelerden kaçmanın ve komutunuzun sonunda 'Enter'a basmak için ^ M tuşuna dikkat edin.

Ayrıca o ekranın stuffkomutunun sadece sizin adınıza komut metnini yazdığını unutmayın. Bu nedenle, ekran pencerelerinden birinin komut isteminde yarı yazılmış bir komutu varsa veya bir kabuktan başka bir uygulamayı çalıştırıyorsa (örn. Emacs, top) garip bir şey olabilir. Bu bir sorunsa, bazı fikirlerim var:

  • Herhangi bir yarı yazılı komuttan kurtulmak için komutun başına "^ C" ekleyebilirsiniz.
  • Komutu bir emacs penceresinde, vb. Çalıştırmaktan kaçınmak için `at 'dan pencere başlığını vb. , vb).

Komutu belirli bir pencerede çalıştırmak için (pencere numarası ile tanımlanır), aşağıdakileri kullanın:

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

Müthiş bir liner, başka yan etkileri yok gibi görünüyor, teşekkürler!
Cyril Duchon-Doris

14

newgrpKomutu kullanmak benim için sorunu çözdü:

newgrp <GroupName>

Bu blog yazısının ayrıntılı açıklaması var.


1
Süper Kullanıcıya Hoşgeldiniz! Bu soru- cevap sitesinde, insanların gönderdiği sorulara iyi cevaplar vermeye çalışıyoruz . Bunun bir kısmı, soruyu cevaplayabilecek başka bir sayfaya bağlantı vermek yerine, yazınızın cevabını içerir . Lütfen gönderilen soruna gerçek çözümü eklemek için cevabınızı düzenleyin.
cascer1

1
Bu benim görüşüme göre en iyi yoldur ve kabul edilen yeni cevap olarak işaretlenmelidir.
Dakatine

Lütfen gönderilen soruna gerçek çözümü eklemek için cevabınızı düzenleyin.
DIG mbl

en güzel çözüm
Sergey Povisenko

13

Bunu yapabilirsiniz.

Kullanmak istediğiniz kadar grup ekleyin usermod -G. Ardından, çalışan bir oturumu olan kullanıcı olarak, newgrp -sadece '-' bağımsız değişkeniyle çalıştırın.

Bu, grup kimliğini varsayılan değerine yeniden başlatır, ancak ikincil grupları da ayarlayacaktır. Sen çalıştırarak doğrulayabilirsiniz groupsönce ve sonra, geçerli oturumdaki usermodve newgrp.

Bu her açık oturumdan çalıştırılmalıdır - ekran hakkında fazla bir şey bilmiyorum. Ancak, tüm açık oturumları yinelemek ve koşmak mümkün ise newgrp, iyi olmalısınız. Grupları veya grup kimliklerini bilmek konusunda endişelenmenize gerek yoktur.

Sana iyi şanslar.


10
X oturumunda bir xterm üzerinde denedim ama işe yaramadı
dwery

2
tmux'da bir seansta denedim ve o da işe yaramadı
Michael

1
Amazon linux 2 üzerinde çalıştı, işe yaramadı
Cyril Duchon-Doris

newgrp -yeni bir kabuk süreci başlattı
Piotr Findeisen

12

Gruplar genellikle giriş sırasında numaralandırılır, çıkış yapıp tekrar giriş yapmadan yeniden gruplandırmayı yeniden yapmaya zorladığımı bilmeme imkân yok.

Burada oylanan yanıtların çoğu, yeni çevreye sahip yeni bir kabuk çağıran bir geçici çözüm kullanıyor gibi görünüyor (tekrar giriş yapmakla aynı). ana kabuk ve sürekli çalışan tüm diğer programlar genellikle temiz oturum açtıktan ve giriş yaptıktan sonra yeni bir kabuktan tekrar çağrılana kadar yeni grup üyeliğini almayacaktır.


Doğrusu, bunun doğru olmadığından eminim - daha önce bir Linux kutusunda yapmanın bir yolunu buldum. Ancak, benim için, emrin ne olduğunu hatırlayamıyorum. Onu bulursam, gönderirim. Düzenleme: Sadece buldum, cevap olarak gönderiyorum.
öğle yemeği317

4

Özetlemek:

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

'Exec' kullanmak, varolan kabuğu newgrp komutu tarafından başlatılan yeni kabukla değiştirmek anlamına gelir (bu nedenle yeni kabuktan çıkma sizi kapatır).

Final newgrp -, normal birincil grubunuzu geri yüklemek için gereklidir, bu nedenle daha sonra oluşturduğunuz dosyalar kendi grup sahiplerine sahip olur.

Not: Orijinal posterin sorusu, yeni eklenen grupların mevcut işlemlerde nasıl görünür hale getirileceği idi. gpasswdVe usermodkomutlar mevcut süreçler etkilemez; yeni eklenen (veya silinmiş!) gruplar, hesabınızda, yani / etc / group ve / etc / gshadow dosyalarında görünür (onlardan kaybolur), ancak varolan işlemlerin izinleri değişmez. To kaldırmak Eğer çalışan tüm işlemlerden öldürmek zorunda izinleri; newgrp -/ etc / group komutunu yeniden okuyup grup listesini sıfırlamaz; bunun yerine, daha önce süreçle ilişkilendirilmiş grupları kullanmaktadır.


Bu arada, exec su - <username>grupları ayarlanmış yeni bir giriş kabuğu almak için kullanılabilir, ancak komut dosyalarında çalışmaz, çünkü yeni bir kabuk terminalden komutları okuyacaktır. su -c "command ..." <myusername>Komut dosyanızı yeniden başlatmak için kullanabilirsiniz , ancak ortaya çıkan işlem kontrol terminali içermez ve bu nedenle bir ekran düzenleyici veya başka bir etkileşimli komut denenirse bir hata oluşur.
Jimav

Bu neden indirildi? Birisi bununla ilgili neyin kötü olduğunu açıklayabilir mi, çünkü başıma gelen buydu ve bence en çok hoşuma gitti mi?
jasonmp85

Gah, test etmeden önce oy kullandım. newgrp -yok değil "birincil grubu" değiştirin. Patrick Conheady'nin cevabı buradaki en iyisidir, çünkü ne temel grup ne de çatalları değiştirir.
jasonmp85

1

Benzer bir sorunum vardı ama aynı zamanda oturum açmamış kullanıcılar için de. Nscd yeniden başlaması yardımcı olabilir, ancak bu komutu yürütülürken koymuştur: nscd -i group. Bu, nscd'ye (önbellek daemon) grup dosyasını yeniden yüklemesini bildirmelidir.


1

Newgrp komutunu çalıştıramadım. Bunun / etc / sudoers uygulamasına bağlı olup olmadığından emin değilim, ancak normalde sudo şifremi girmem gerekiyor ve bu işlem benim şifremi gerektirmeden çalıştı:

[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

Yaptığınız hileyi yapar ve sudobazı durumlarda şifrenizi bir kez daha girmenizi engelleyebilir:

sudo su $USER
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.