बिना लॉग आउट किए एक लिनक्स उपयोगकर्ता के समूह असाइनमेंट को फिर से लोड करें


348

उपयोग करते समय उपयोगकर्ता की द्वितीयक समूह सूची असाइन करते समय:

# usermod -G <grouplist> <user>

क्या इस समूह असाइनमेंट को सभी चल रहे सत्रों को लॉग आउट किए बिना प्रभावी करने के लिए मजबूर करना संभव है?

यह उस स्थिति में बहुत उपयोगी होगा जहां एक स्क्रीन सत्र कई चल रहे गोले के साथ मौजूद होता है, क्योंकि समूह असाइनमेंट को प्रभावी बनाने के लिए पूरे सत्र को अनिवार्य रूप से नष्ट करने की आवश्यकता होती है।

मुझे लगता है कि मैं newgrpकमांड का उपयोग करके उपयोगकर्ता के प्राथमिक समूह को एक रनिंग शेल में बदल सकता हूं - क्या कुछ विकल्प हैं जो माध्यमिक समूहों के लिए काम करेंगे?

आदर्श रूप से, मैं कुछ ऐसा चाहता हूं जो प्रत्येक शेल में मैन्युअल रूप से चलाए बिना प्रत्येक में प्रभावी हो, लेकिन यह विफल हो सकता है, शायद स्क्रीन को प्रत्येक में एक ही कमांड को निष्पादित करने के लिए मजबूर करने का कोई तरीका।


मुझे पता है कि कम से कम कुछ विंडो / सत्र प्रबंधकों के लिए ऐसा करना संभव है कि सत्र नए समूह को चुनता है और यह मेनू, पैनल बटन या जो कुछ भी है, उससे शुरू हुई किसी भी नई प्रक्रिया के लिए उपलब्ध है। मैं यहाँ अभी आया था कि फिर से खोज रहा हूँ, इसलिए अभी यह नहीं कह सकता कि यह कैसे करना है, और यह शायद खिड़की प्रबंधक के लिए विशिष्ट है।
mc0e

जवाबों:


205

बुरी तरह से हैक, लेकिन आप newgrpएक विशेष समूह के लिए इसे प्राप्त करने के लिए दो परतों का उपयोग कर सकते हैं :

id -g

... आपको वर्तमान प्राथमिक समूह आईडी देगा। हम इसे orig_groupइस उदाहरण के प्रयोजनों के लिए कहेंगे । फिर:

newgrp <new group name>

... प्राथमिक के रूप में उस समूह के लिए आप स्विच और द्वारा दिया समूहों की सूची में जुड़ जाएगा groupsया id -G। अब, एक और:

newgrp <orig_group>

... आपको एक शेल मिलेगा जिसमें आप नए समूह को देख सकते हैं और प्राथमिक मूल एक है।

यह भयानक है और आपको केवल एक ही समय में एक समूह जोड़ा जाएगा, लेकिन इसने मुझे कुछ समय के लिए समूहों को बिना लॉग आउट किए / मेरे पूरे X सत्र में जोड़ने में मदद की है (जैसे कि उपयोगकर्ता के लिए समूह के रूप में जोड़ा गया फ्यूज ताकि sshfs काम करेगा)।

संपादित करें: इसके लिए आपको अपना पासवर्ड टाइप करने की आवश्यकता नहीं है, जो suहोगा।


6
अच्छी चाल, मुझे यह पसंद है
शमौन

1
फेडोरा पर मुझे newgrp $USERइसके बजाय करना था newgrp <orig_group>। इसका मतलब है कि मुझे अपना मूल प्राथमिक समूह आईडी नहीं ढूंढना था, इसलिए यह इस समाधान से भी आसान है।
रिचर्ड टर्नर

2
मैंने पाया कि यह करना पर्याप्त था newgrp <new group name>। यह उबंटू 14.04
एडवर्ड फॉक

4
@EdwardFalk सही है, लेकिन आप नहीं कर सकते (हो सकता है) अपने प्राथमिक के रूप में उस समूह को छोड़ना नहीं चाहते ...
mimoralea

4
ध्यान दें कि प्रत्येक newgrpएक नया खोल बनाता है, इसलिए जब आप पूरी तरह से अपने सत्र से बाहर निकलने आप "से बाहर निकलने के लिए बाहर निकलें बाहर निकलें" (सभी तरह बाहर निकलने के लिए क्या करने की जरूरत की जरूरत है:
jwd

370

एक शेल के अंदर से, आप निम्नलिखित कमांड जारी कर सकते हैं

su - $USER

आईडी अब नए समूह की सूची देगा:

id

3
मुझे लगता है कि यह कई मामलों में सबसे अच्छा तरीका है, लेकिन मूल पोस्टर एक स्क्रीन सत्र के भीतर कई गोले अपडेट करना चाहता था। यह समाधान प्रत्येक शेल से किया गया होगा।
एड्रियन रत्नापाल

3
बढ़िया चाल, बढ़िया काम!
Genpfault

4
मूल समाधान स्क्रीन में केवल एकल शेल सत्र को भी ठीक करेगा। मैंने अभी-अभी परीक्षण किया है। यह समाधान काम करता है इसका कारण यह है कि आप मूल वातावरण से विरासत के बजाय एक पूर्ण नया सत्र पैदा कर रहे हैं।
Dror

4
यह वास्तव में स्वीकृत उत्तर होना चाहिए। अच्छी चाल, धन्यवाद!
dotancohen

2
इसके लिए आपको एक पासवर्ड टाइप करना होगा, जो कि बहुत अजीब / अवांछित हो सकता है अगर आप इसे बहुत सारे सत्रों में करने की कोशिश कर रहे हैं।
लेगोयूलस

155

इस लिंक से यह निफ्टी ट्रिक बहुत काम आती है!

exec su -l $USER

मुझे लगा कि मैं इसे यहाँ पोस्ट करूँगा क्योंकि हर बार मैं यह भूल जाता हूँ कि यह कैसे करना है, यह पहली कड़ी है जो Google में आती है।


14
उपयोगकर्ता को एक उपधारा में नहीं रखने के लिए +1; आप इसके साथ हमेशा की तरह लॉगआउट / निकास कर सकते हैं। इसके अलावा, अगर NOPASSWD: / etc / sudoers में सेट है, तो आप exec sudo su -l $USERपासवर्ड के लिए संकेत दिए जाने से बचने के लिए उपयोग कर सकते हैं।
इवान एक्स

21
सलाह दें: आपसे एक sudo पासवर्ड मांगा जाएगा। यदि आप इसे गलत पाते हैं, तो आपका टर्मिनल बंद हो जाएगा।
टायलर कोलियर

1
@ टायलर कोलियर इवान ने उल्लेख कियाNOPASSWD:
पेपोलुआन

32

1. नए समूह के साथ लॉग आउट किए बिना और फिर से एक शेल प्राप्त करना

यदि आप केवल एक समूह जोड़ रहे हैं, तो मैंने निम्नलिखित प्रयोग किया:

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

यह Legooolas की दो-परत newgrp चाल पर एक भिन्नता है, लेकिन यह एक पंक्ति में है और आपको अपने प्राथमिक समूह को मैन्युअल रूप से दर्ज करने की आवश्यकता नहीं है।

sgnewgrp है, लेकिन नए समूह ID के साथ निष्पादित करने के लिए एक आदेश को स्वीकार कर रहा है। इसका execमतलब है कि नया शेल मौजूदा शेल को बदल देता है, इसलिए आपको दो बार "लॉगआउट" करने की आवश्यकता नहीं है।

सु का उपयोग करने के विपरीत, आपको अपने पासवर्ड में टाइप करने की आवश्यकता नहीं है। यह आपके पर्यावरण (समूह को जोड़ने के अलावा) को ताज़ा नहीं करता है, इसलिए आप अपनी वर्तमान कार्यशील निर्देशिका को बनाए रखते हैं आदि।

2. एक सत्र में सभी स्क्रीन विंडो में कमांड को निष्पादित करना

atस्क्रीन में आदेश जो कुछ खिड़कियों आपके द्वारा निर्दिष्ट (ध्यान दें कि यह एक स्क्रीन आदेश है, न कि शेल कमांड है) में एक आदेश चलाता है।

आप सभी मौजूदा स्क्रीन सत्रों में कमांड भेजने के लिए निम्न कमांड का उपयोग कर सकते हैं:

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

idस्क्रीन सत्र में चलने के लिए बैकटिक्स से बचने की आवश्यकता पर ध्यान दें , और अपने आदेश के अंत में स्क्रीन को हिट करने के लिए ^ M को 'एंटर' करें।

यह भी ध्यान दें कि स्क्रीन का stuffकमांड आपकी ओर से केवल कमांड टेक्स्ट टाइप करता है। इसलिए कुछ अजीब हो सकता है यदि स्क्रीन विंडो में से एक में कमांड प्रॉम्प्ट पर आधा लिखित कमांड है या शेल (उदाहरण के लिए एमएसीएस, टॉप) के अलावा अन्य एप्लिकेशन चल रहा है। यदि यह एक मुद्दा है, तो मेरे पास कुछ विचार हैं:

  • किसी भी आधे-लिखित आदेश से छुटकारा पाने के लिए, आप कमांड की शुरुआत में "^ C" जोड़ सकते हैं।
  • Emacs विंडो आदि में कमांड चलाने से बचने के लिए, आप विंडो शीर्षक आदि पर फ़िल्टर करने के लिए 'at' पूछ सकते हैं (ऊपर दिए गए उदाहरण में, मैं "#" का उपयोग करता हूं, जो सभी विंडो से मेल खाता है, लेकिन आप विंडो शीर्षक, उपयोगकर्ता द्वारा फ़िल्टर कर सकते हैं) , आदि)।

एक विशिष्ट विंडो में कमांड को चलाने के लिए (विंडो नंबर द्वारा पहचाना गया), निम्नलिखित का उपयोग करें:

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

बहुत बढ़िया एक लाइनर, जो अन्य दुष्प्रभावों के लिए नहीं लगता है, धन्यवाद!
सिरिल डचोन-डोरिस


12

समूह आमतौर पर लॉगिन में एनुमरेट किए जाते हैं, कोई तरीका नहीं है कि मैं इसे फिर से लॉग इन और फिर से वापस किए बिना समूह गणना को फिर से करने के लिए मजबूर करने का कोई तरीका नहीं जानता।

यहाँ पर मतदान किए गए कई जवाब एक ऐसे समाधान का उपयोग करते प्रतीत होते हैं जो नए वातावरण के साथ एक नए शेल को आमंत्रित करता है (जैसा कि फिर से लॉगिंग के रूप में)। पैरेंट शेल और अन्य सभी लगातार चलने वाले प्रोग्राम आम तौर पर नए समूह की सदस्यता प्राप्त नहीं करेंगे, जब तक कि क्लीन लॉगआउट और लॉगिन के बाद एक नए शेल से फिर से इनवाइट नहीं किया जाता।


सच में, मुझे पूरा यकीन है कि यह सच नहीं है - मैंने इसे लिनक्स बॉक्स पर करने से पहले एक तरीका पाया। हालाँकि, मेरे जीवन के लिए, मुझे याद नहीं है कि कमान क्या थी। अगर मुझे यह मिल जाए, तो मैं इसे पोस्ट करूंगा। संपादित करें: बस मिल गया, मैं इसे उत्तर के रूप में पोस्ट कर रहा हूं।
लंचमीट 317

1
इसे इंगित करने के लिए धन्यवाद, यह भी मेरी समझ है। यहां हर दूसरा उत्तर बस एक नया खोल खोलता है, चाहे वह एक खुले शेल की जगह ले या फिर स्क्रीन या जो भी हो। कमांड या स्क्रिप्ट जारी करने के लिए कोई जादुई रामबाण नहीं है और आपके एक्स सेशन सहित हर रनिंग सेशन में नए ग्रुप मेंबरशिप को दर्शाते हैं।
scravy

12

तुम यह केर सकते हो।

जितने चाहें उतने समूह जोड़ें usermod -G। फिर, एक रनिंग सत्र वाले उपयोगकर्ता के रूप में, newgrp -केवल '-' तर्क के साथ चलाएँ ।

यह समूह आईडी को डिफॉल्ट में पुन: बनाता है, लेकिन यह द्वितीयक समूहों को भी सेट करेगा। आप चलाकर इस की पुष्टि कर सकते groupsसे पहले और बाद वर्तमान सत्र की, usermodऔर newgrp

इसे प्रत्येक खुले सत्र से चलाया जाना चाहिए - मुझे स्क्रीन के बारे में ज्यादा जानकारी नहीं है। हालाँकि, यदि सभी खुले सत्रों को पूरा करना और चलाना संभव है newgrp, तो आपको अच्छा होना चाहिए। आपको समूह या समूह आईडी जानने की चिंता नहीं करनी होगी।

तुम्हारे लिऐ शुभकामना।


11
एक एक्स सत्र के भीतर एक xterm पर कोशिश की, लेकिन यह काम नहीं किया
dwery

3
tmux में एक सत्र की कोशिश की और यह वहाँ भी काम नहीं किया
माइकल

2
अमेज़ॅन लिनक्स 2 पर कोशिश की, यह काम नहीं किया
सिरिल डचोन-डोरिस

1
newgrp -एक नई शेल प्रक्रिया शुरू करता है
पियोट फाइंडसेन

Mister_Tom द्वारा उत्तर पर आपकी टिप्पणी के आलोक में, यह अन्य सभी उत्तरों के रूप में एक वर्कअराउंड है। Mister_Tom का उत्तर अभी भी सही है।
मैला

4

संक्षेप में:

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

'एग्जीक्यूटिव' का अर्थ है मौजूदा शेल को न्यूग्रेप कमांड द्वारा शुरू किए गए नए शेल से बदलना (इसलिए नए शेल से बाहर निकलना आपके द्वारा लॉग किया गया)।

newgrp -आपके सामान्य प्राथमिक समूह को पुनर्स्थापित करने के लिए अंतिम की आवश्यकता होती है, इसलिए आपके द्वारा बाद में बनाई गई फ़ाइलों में उनके समूह के मालिक के रूप में होगा।

नोट: मूल पोस्टर का सवाल था कि मौजूदा प्रक्रियाओं में नए जोड़े गए समूहों को कैसे बनाया जाए। gpasswdऔर usermodआदेशों मौजूदा प्रक्रियाओं को प्रभावित नहीं करते; नए जोड़े गए (या हटाए गए) समूह आपके खाते में / से / आदि / समूह / और / / / gshadow फ़ाइलों में (से गायब) दिखाई देते हैं, लेकिन मौजूदा प्रक्रियाओं के लिए अनुमतियां नहीं बदली जाती हैं। करने के लिए हटाने अनुमतियाँ आप किसी भी चल रहे प्रक्रियाओं को बंद करने के लिए है; newgrp -पुन: पठन / आदि / समूह नहीं करेगा और समूह सूची रीसेट करेगा; इसके बजाय, यह सिर्फ प्रक्रिया से जुड़े समूहों का उपयोग करने के लिए लगता है।


वैसे, exec su - <username>समूह सेट के साथ एक नया लॉगिन शेल प्राप्त करने के लिए इस्तेमाल किया जा सकता है, लेकिन यह स्क्रिप्ट में काम नहीं करेगा क्योंकि एक नया शेल टर्मिनल से कमांड पढ़ेगा। आप su -c "command ..." <myusername>अपनी स्क्रिप्ट को पुनरारंभ करने के लिए उपयोग कर सकते हैं , लेकिन परिणामी प्रक्रिया में कोई नियंत्रण टर्मिनल नहीं है और इसलिए एक स्क्रीन संपादक या अन्य इंटरैक्टिव कमांड का प्रयास करने पर त्रुटि होगी।
jimav 23

इसे क्यों ठुकरा दिया गया? क्या कोई समझा सकता है कि इसके बारे में क्या बुरा है, क्योंकि यह मेरे साथ हुआ था और मुझे लगता है कि मुझे यह सबसे अच्छा लगता है?
jasonmp85

गह, मैंने परीक्षण से पहले इसे वोट दिया था। "प्राथमिक समूह" को प्रतिस्थापित नहींnewgrp - करता है । पैट्रिक कॉनहेडी का जवाब यहाँ सबसे अच्छा है, क्योंकि यह न तो कांटे और न ही प्राथमिक समूह को बदलता है।
jasonmp85

1

मेरे पास समान समस्या थी, लेकिन लॉग-इन उपयोगकर्ताओं के लिए भी नहीं। Nscd को पुनः आरंभ करने से कोई मदद नहीं मिली, लेकिन इस कमांड को निष्पादित करना nscd -i group:। समूह फाइल को पुनः लोड करने के लिए nscd (कैशिंग डेमॉन) को निर्देश देना चाहिए।


1

मुझे काम करने के लिए 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.