โหลดการมอบหมายกลุ่มของผู้ใช้ Linux อีกครั้งโดยไม่ออกจากระบบ


348

เมื่อกำหนดรายชื่อกลุ่มรองของผู้ใช้โดยใช้:

# usermod -G <grouplist> <user>

เป็นไปได้ไหมที่จะบังคับให้การมอบหมายกลุ่มนี้มีผลโดยไม่ต้องออกจากเซสชันที่กำลังทำงานอยู่ทั้งหมด?

สิ่งนี้จะมีประโยชน์มากในสถานการณ์ที่มีเซสชันของหน้าจออยู่กับเชลล์ที่รันอยู่จำนวนมากเนื่องจากเซสชั่นทั้งหมดจะต้องถูกทำลายเพื่อให้การมอบหมายกลุ่มมีผล

ฉันคิดว่าฉันสามารถเปลี่ยนกลุ่มหลักของผู้ใช้ในเชลล์ที่กำลังทำงานโดยใช้newgrpคำสั่ง - มีทางเลือกอื่นที่จะใช้ได้กับกลุ่มรองหรือไม่?

ตามหลักแล้วฉันต้องการบางสิ่งที่จะมีผลในแต่ละเชลล์โดยไม่ต้องเรียกใช้ด้วยตนเองในทุก ๆ อัน แต่ก็ล้มเหลวซึ่งอาจเป็นวิธีบังคับให้ Screen สั่งรันคำสั่งเดียวกันในแต่ละเชลล์


ฉันรู้ว่าอย่างน้อยสำหรับบางผู้จัดการหน้าต่าง / เซสชั่นเป็นไปได้ที่จะทำเช่นนั้นเซสชั่นรับกลุ่มใหม่และมันสามารถใช้ได้กับกระบวนการใหม่ใด ๆ ที่เริ่มต้นจากเมนูปุ่มแผงหรืออะไรก็ตาม ฉันมาที่นี่เพื่อค้นหาอีกครั้งดังนั้นจึงไม่สามารถบอกได้ว่าจะทำอย่างไรและอาจเป็นเรื่องเฉพาะสำหรับโปรแกรมจัดการหน้าต่าง
mc0e

คำตอบ:


205

แฮ็คที่น่ากลัว แต่คุณสามารถใช้สองชั้นnewgrpเพื่อบรรลุเป้าหมายนี้สำหรับกลุ่มใดกลุ่มหนึ่ง:

id -g

... จะให้ ID กลุ่มหลักปัจจุบันแก่คุณ เราจะเรียกสิ่งนี้orig_groupเพื่อจุดประสงค์ของตัวอย่างนี้ แล้ว:

newgrp <new group name>

... จะเปลี่ยนไปยังกลุ่มที่เป็นหลักและเพิ่มเข้าไปในรายชื่อของกลุ่มที่ส่งกลับโดยหรือgroups id -Gตอนนี้เพิ่มเติม:

newgrp <orig_group>

... จะทำให้คุณได้รับเชลล์ซึ่งคุณสามารถเห็นกลุ่มใหม่และกลุ่มหลักคือกลุ่มแรก

นี่เป็นสิ่งที่น่ากลัวและจะให้คุณเพิ่มกลุ่มได้ครั้งละหนึ่งกลุ่มเท่านั้น แต่มันช่วยฉันสองสามครั้งในการเพิ่มกลุ่มโดยไม่ต้องออกจากระบบ / ในเซสชัน X ทั้งหมดของฉัน (เช่นเพื่อเพิ่มฟิวส์เป็นกลุ่มให้กับผู้ใช้ เพื่อให้ sshfs ทำงานได้)

แก้ไข: คุณไม่จำเป็นต้องพิมพ์รหัสผ่านเช่นsuกัน


6
เคล็ดลับดีฉันชอบมัน
Simon

1
บน Fedora ที่ผมต้องทำแทนnewgrp $USER newgrp <orig_group>นั่นหมายความว่าฉันไม่จำเป็นต้องค้นหา ID กลุ่มหลักดั้งเดิมของฉันดังนั้นจึงง่ายกว่าโซลูชันนี้
Richard Turner

2
newgrp <new group name>ผมพบว่ามันก็เพียงพอที่จะทำ นี่คือ Ubuntu 14.04
Edward Falk

4
@EdwardFalk ถูกต้อง แต่คุณไม่ต้องการที่จะออกจากกลุ่มนั้นเป็นกลุ่มหลักของคุณ ...
mimoralea

4
โปรดทราบว่าแต่ละnewgrpเชลล์สร้างเชลล์ใหม่ดังนั้นเมื่อคุณต้องการออกจากเซสชันของคุณอย่างเต็มที่คุณต้องทำ "exit exit exit" เพื่อออกไปจนสุดทาง (:
jwd

371

จากภายในเชลล์คุณสามารถออกคำสั่งต่อไปนี้

su - $USER

id จะแสดงรายการกลุ่มใหม่:

id

3
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในหลาย ๆ กรณี แต่ผู้โพสต์ดั้งเดิมต้องการอัปเดตเชลล์จำนวนมากภายในเซสชันหน้าจอ การแก้ปัญหานี้จะต้องทำจากแต่ละเปลือก
Adrian Ratnapala

3
เคล็ดลับดีใช้งานได้ดี!
genpfault

4
โซลูชันดั้งเดิมจะแก้ไขเชลล์เซสชันเดียวในหน้าจอเท่านั้น ฉันเพิ่งทดสอบสิ่งนั้น เหตุผลที่โซลูชันนี้ใช้งานได้เนื่องจากคุณวางไข่เซสชันใหม่ที่สมบูรณ์แทนที่จะได้รับมรดกจากสภาพแวดล้อมดั้งเดิม
Dror

4
นี่ควรเป็นคำตอบที่ยอมรับได้จริง ๆ เคล็ดลับดีขอบคุณ!
dotancohen

2
สิ่งนี้ต้องการให้คุณพิมพ์รหัสผ่านซึ่งอาจจะไม่สะดวก / ไม่น่าสนใจหากคุณพยายามทำในหลายครั้ง
Legooolas

156

เคล็ดลับที่ดีจากลิงค์นี้ใช้งานได้ดี!

exec su -l $USER

ฉันคิดว่าฉันโพสต์ไว้ที่นี่ทุกครั้งที่ฉันลืมวิธีการทำนี่คือลิงค์แรกที่มาใน google


14
+1 สำหรับการไม่ใส่ผู้ใช้ใน subshell; คุณสามารถออกจากระบบ / ออกตามปกติด้วยสิ่งนี้ นอกจากนี้หากตั้งค่า NOPASSWD: ใน / etc / sudoers คุณสามารถใช้exec sudo su -l $USERเพื่อหลีกเลี่ยงการขอรหัสผ่านได้
Ivan X

21
ได้รับคำแนะนำ: คุณจะถูกขอรหัสผ่าน sudo หากคุณทำผิดเครื่องของคุณจะปิด
Tyler Collier

1
@TylerCollier Ivan ได้พูดถึงNOPASSWD:
pepoluan

32

1. รับเชลล์กับกลุ่มใหม่โดยไม่ต้องออกจากระบบและเข้าใหม่อีกครั้ง

หากคุณเพิ่มเพียงหนึ่งกลุ่มฉันจะใช้สิ่งต่อไปนี้:

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

นี่คือรูปแบบที่หลากหลายของเล่ห์เหลี่ยมเลเยอร์ใหม่ของเลโก้คูลาส แต่มันอยู่ในบรรทัดเดียวและคุณไม่จำเป็นต้องป้อนกลุ่มหลักของคุณด้วยตนเอง

sgเป็น newgrp แต่การยอมรับคำสั่งให้ดำเนินการด้วย ID กลุ่มใหม่ execหมายความว่าเปลือกใหม่แทนที่เปลือกที่มีอยู่เพื่อให้คุณไม่จำเป็นต้อง "ออกจากระบบ" สองครั้ง

ซึ่งแตกต่างจากการใช้ su คุณไม่จำเป็นต้องพิมพ์รหัสผ่านของคุณ นอกจากนี้ยังไม่รีเฟรชสภาพแวดล้อมของคุณ (นอกเหนือจากการเพิ่มกลุ่ม) ดังนั้นคุณเก็บไดเรกทอรีการทำงานปัจจุบันของคุณ ฯลฯ

2. การดำเนินการคำสั่งในหน้าต่างหน้าจอทั้งหมดในเซสชัน

atคำสั่งในหน้าจอรันคำสั่งในหน้าต่างของสิ่งที่คุณระบุ (ทราบว่านี่เป็นคำสั่งที่หน้าจอไม่ได้เป็นคำสั่งของเชลล์บริการ)

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อส่งคำสั่งไปยังเซสชันหน้าจอที่มีอยู่ทั้งหมด:

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

สังเกตความจำเป็นที่จะต้องหนี backticks เพื่อidให้ทำงานในเซสชันของหน้าจอและ ^ M เพื่อให้หน้าจอกด 'Enter' ที่ท้ายคำสั่งของคุณ

โปรดทราบว่าstuffคำสั่งของหน้าจอเพียงพิมพ์ข้อความคำสั่งในนามของคุณ ดังนั้นสิ่งที่แปลกอาจเกิดขึ้นได้หากหน้าต่างหน้าจอใดหน้าจอหนึ่งมีคำสั่งแบบครึ่งคำสั่งที่พรอมต์คำสั่งหรือกำลังเรียกใช้แอปพลิเคชันอื่นที่ไม่ใช่เชลล์ (เช่น emacs, top) หากเป็นปัญหาฉันมีความคิด:

  • ในการกำจัดคำสั่งครึ่งตัวใด ๆ คุณสามารถเพิ่ม "^ C" ลงในจุดเริ่มต้นของคำสั่ง
  • เพื่อหลีกเลี่ยงการรันคำสั่งในหน้าต่าง emacs ฯลฯ คุณสามารถขอ `at 'เพื่อกรองชื่อหน้าต่าง ฯลฯ (ในตัวอย่างข้างต้นฉันใช้" # "ซึ่งตรงกับ windows ทั้งหมด แต่คุณสามารถกรองตามชื่อหน้าต่างผู้ใช้ ฯลฯ )

ในการรันคำสั่งในหน้าต่างที่ระบุ (ระบุด้วยหมายเลขหน้าต่าง) ให้ใช้คำสั่งต่อไปนี้:

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

Awesome one liner, ที่ไม่ได้มีผลข้างเคียงอื่น ๆ ขอบคุณ!
Cyril Duchon-Doris


12

กลุ่มมักจะแจกแจงเมื่อเข้าสู่ระบบไม่มีวิธีที่ฉันรู้ที่จะบังคับให้ทำการแจงนับกลุ่มอีกครั้งโดยไม่ต้องออกจากระบบและกลับมาใหม่อีกครั้ง

คำตอบมากมายที่ลงคะแนนที่นี่ดูเหมือนจะใช้วิธีแก้ไขปัญหาที่เรียกใช้เชลล์ใหม่ที่มีสภาพแวดล้อมใหม่ (เช่นเดียวกับการเข้าสู่ระบบอีกครั้ง) พาเรนต์เชลล์และโปรแกรมที่รันอยู่อย่างต่อเนื่องโดยทั่วไปจะไม่ได้รับการเป็นสมาชิกกลุ่มใหม่จนกว่าจะถูกเรียกใช้ใหม่จากเชลล์สดโดยปกติหลังจากออกจากระบบแล้ว


จริง ๆ แล้วฉันค่อนข้างแน่ใจว่านี่ไม่เป็นความจริง - ฉันพบวิธีที่จะทำก่อนหน้านี้ในกล่อง Linux อย่างไรก็ตามสำหรับชีวิตของฉันฉันจำไม่ได้ว่าอะไรคือคำสั่ง หากฉันพบฉันจะโพสต์ แก้ไข: เพิ่งพบว่าฉันโพสต์มันเป็นคำตอบ
lunchmeat317

1
ขอบคุณที่ชี้ให้เห็นว่านี่เป็นความเข้าใจของฉันเช่นกัน ทุกคำตอบอื่น ๆ ที่นี่เพียงเปิดเชลล์ใหม่ไม่ว่าจะแทนที่เชลล์ที่เปิดหนึ่งอันหรือรีสตาร์ทหน้าจอหรืออะไรก็ตาม ไม่มียาครอบจักรวาลที่วิเศษในการออกคำสั่งหรือสคริปต์และมีทุกเซสชั่นการทำงานรวมถึงเซสชั่น X ของคุณสะท้อนให้เห็นถึงการเป็นสมาชิกกลุ่มใหม่
scravy

12

คุณสามารถทำได้

usermod -Gเพิ่มกลุ่มมากเท่าที่คุณต้องการใช้ จากนั้นในฐานะผู้ใช้ที่มีเซสชันที่ทำงานอยู่ให้รันnewgrp -ด้วยอาร์กิวเมนต์ '-'

วิธีนี้จะกำหนดค่าเริ่มต้นให้กับ id กลุ่มอีกครั้ง แต่จะเป็นการตั้งค่ากลุ่มรองเช่นกัน คุณสามารถตรวจสอบโดยการเรียกใช้groupsจากเซสชันปัจจุบันก่อนและหลังและusermodnewgrp

สิ่งนี้จะต้องถูกเรียกใช้จากแต่ละเซสชันที่เปิดอยู่ - ฉันไม่รู้มากเกี่ยวกับหน้าจอ อย่างไรก็ตามหากเป็นไปได้ที่จะทำซ้ำในช่วงเปิดทั้งหมดและเรียกใช้newgrpคุณควรจะดี คุณไม่ต้องกังวลกับการรู้ว่ากลุ่มหรือรหัสกลุ่ม

ขอให้คุณโชคดี


11
พยายามใน xterm ภายในเซสชั่น X แต่มันไม่ได้ทำงาน
dwery

3
พยายามในเซสชั่นใน tmux และมันก็ไม่ได้ทำงานที่นั่นอย่างใดอย่างหนึ่ง
ไมเคิล

2
ลองใช้งาน Amazon linux 2 แล้วมันไม่ทำงาน
Cyril Duchon-Doris

1
newgrp -เริ่มกระบวนการเชลล์ใหม่
Piotr Findeisen

เนื่องจากความคิดเห็นของคุณเกี่ยวกับคำตอบโดย Mister_Tom นี่เป็นคำตอบอื่น ๆ ทั้งหมดซึ่งเป็นวิธีแก้ปัญหา คำตอบของ Mister_Tom ยังคงถูกต้อง
scravy

4

เพื่อสรุป:

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

การใช้ 'exec' หมายถึงแทนที่เชลล์ที่มีอยู่ด้วยเชลล์ใหม่ที่เริ่มต้นโดยคำสั่ง newgrp (ดังนั้นการออกจากเชลล์ใหม่จะนำคุณออกจากระบบ)

ขั้นตอนสุดท้ายnewgrp -จำเป็นในการกู้คืนกลุ่มหลักปกติของคุณดังนั้นไฟล์ที่คุณสร้างในภายหลังจะมีชื่อนั้นเป็นเจ้าของกลุ่ม

หมายเหตุ: คำถามดั้งเดิมของผู้โพสต์คือวิธีการทำให้กลุ่มที่เพิ่งเพิ่มเข้ามาปรากฏในกระบวนการที่มีอยู่เดิม gpasswdและusermodคำสั่งที่ไม่ส่งผลกระทบต่อกระบวนการที่มีอยู่; กลุ่มที่เพิ่มใหม่ (หรือลบ!) จะปรากฏใน (หายไปจาก) บัญชีของคุณเช่นในไฟล์ / etc / group และ / etc / gshadow แต่การอนุญาตสำหรับกระบวนการที่มีอยู่จะไม่เปลี่ยนแปลง ในการลบการอนุญาตคุณต้องฆ่ากระบวนการที่กำลังทำงานอยู่ newgrp -จะไม่อ่าน / etc / group อีกครั้งและรีเซ็ตรายชื่อกลุ่ม ดูเหมือนว่าจะใช้กลุ่มที่เกี่ยวข้องกับกระบวนการก่อนหน้านี้แทน


โดยวิธีการที่exec su - <username>สามารถใช้ในการรับเปลือกเข้าสู่ระบบใหม่กับชุดกลุ่ม แต่ที่ไม่ทำงานในสคริปต์เพราะเปลือกใหม่จะอ่านคำสั่งจาก terminal คุณสามารถใช้su -c "command ..." <myusername>เพื่อรีสตาร์ทสคริปต์ของคุณ แต่กระบวนการที่เกิดขึ้นไม่มีเทอร์มินัลการควบคุมดังนั้นข้อผิดพลาดจะเกิดขึ้นหากพยายามแก้ไขหน้าจอหรือคำสั่งแบบโต้ตอบอื่น ๆ
jimav

ทำไมเรื่องนี้จึงถูกลดระดับลง ใครสามารถอธิบายสิ่งที่ไม่ดีเกี่ยวกับเรื่องนี้เพราะมันเป็นสิ่งที่เกิดขึ้นกับฉันและฉันคิดว่าฉันชอบมากที่สุด?
jasonmp85

Gah ฉันลงคะแนนก่อนทดสอบ newgrp -ไม่ได้แทนที่ "กลุ่มหลัก" คำตอบของ Patrick Conheady เป็นคำตอบที่ดีที่สุดเพราะไม่มีการเปลี่ยนแปลงหรือเปลี่ยนแปลงกลุ่มหลัก
jasonmp85

1

ฉันมีปัญหาที่คล้ายกัน แต่สำหรับผู้ใช้ที่ไม่ได้เข้าสู่ระบบด้วย เริ่มต้นใหม่ของ NSCD ไม่ได้ช่วย nscd -i groupแต่รันคำสั่งนี้ได้: ที่ควรสั่ง nscd (แคช daemon) เพื่อโหลดไฟล์กลุ่ม


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.