Tải lại bài tập nhóm của người dùng Linux mà không cần đăng xuất


348

Khi chỉ định danh sách nhóm phụ của người dùng bằng cách sử dụng:

# usermod -G <grouplist> <user>

có thể buộc bài tập nhóm này có hiệu lực mà không cần đăng xuất tất cả các phiên đang chạy không?

Điều này sẽ rất hữu ích trong trường hợp có một phiên Screen tồn tại với nhiều shell đang chạy, vì toàn bộ phiên cần phải bị hủy để thực hiện việc gán nhóm có hiệu lực.

Tôi nghĩ rằng tôi có thể thay đổi nhóm chính của người dùng trong một vỏ đang chạy bằng newgrplệnh - có cách nào khác có thể hoạt động cho các nhóm thứ cấp không?

Lý tưởng nhất là tôi muốn thứ gì đó có hiệu lực trong mỗi shell mà không được chạy thủ công trong mỗi shell, nhưng không thành công, có thể một số cách buộc Screen phải thực thi cùng một lệnh trong mỗi shell.


Tôi biết rằng ít nhất là đối với một số người quản lý cửa sổ / phiên có thể làm điều này sao cho phiên chọn nhóm mới và nó có sẵn cho bất kỳ quy trình mới nào bắt đầu từ menu, nút bảng điều khiển hoặc bất cứ điều gì. Tôi vừa mới đến đây để tìm lại lần nữa, vì vậy không thể nói ngay bây giờ cách thực hiện và có lẽ nó dành riêng cho người quản lý cửa sổ.
mc0e

Câu trả lời:


205

Thật khủng khiếp, nhưng bạn có thể sử dụng hai lớp newgrpđể đạt được điều này cho một nhóm cụ thể:

id -g

... sẽ cung cấp cho bạn ID nhóm chính hiện tại. Chúng tôi sẽ gọi đây orig_grouplà mục đích của ví dụ này. Sau đó:

newgrp <new group name>

... sẽ chuyển bạn vào nhóm đó làm nhóm chính và thêm nó vào danh sách các nhóm được trả về bởi groupshoặc id -G. Bây giờ, một thêm:

newgrp <orig_group>

... sẽ giúp bạn có một lớp vỏ trong đó bạn có thể thấy nhóm mới và nhóm chính là nhóm ban đầu.

Điều này thật kinh khủng và sẽ chỉ giúp bạn thêm một nhóm vào một lúc, nhưng nó đã giúp tôi một vài lần để thêm các nhóm mà không cần đăng xuất / trong toàn bộ phiên X của tôi (ví dụ: để thêm cầu chì dưới dạng nhóm vào người dùng để sshfs sẽ hoạt động).

Chỉnh sửa: Điều này không yêu cầu bạn nhập mật khẩu của bạn su.


6
Thủ thuật hay, tôi thích nó
Simon

1
Trên Fedora tôi phải làm newgrp $USERthay vì newgrp <orig_group>. Điều đó có nghĩa là tôi đã không phải tìm ID nhóm chính ban đầu của mình, vì vậy nó thậm chí còn dễ dàng hơn giải pháp này.
Richard Turner

2
Tôi thấy nó là đủ để làm newgrp <new group name>. Đây là Ubuntu 14.04
Edward Falk

4
@EdwardFalk đúng, nhưng bạn không (có thể không) muốn rời nhóm đó làm chính ...
mimoralea

4
Lưu ý rằng mỗi cái newgrptạo ra một shell mới, vì vậy khi bạn cần thoát hoàn toàn khỏi phiên của mình, bạn cần thực hiện "exit exit exit" để thoát khỏi tất cả (:
jwd

371

Từ bên trong một shell, bạn có thể đưa ra lệnh sau

su - $USER

Bây giờ id sẽ liệt kê nhóm mới:

id

3
Tôi nghĩ rằng đây là cách tiếp cận tốt nhất trong nhiều trường hợp, nhưng người đăng ban đầu đã muốn cập nhật nhiều shell trong một phiên màn hình. Giải pháp này sẽ được thực hiện từ mỗi vỏ.
Adrian Ratnapala

3
Thủ thuật hay, hoạt động tuyệt vời!
genpfault

4
Giải pháp ban đầu cũng sẽ chỉ sửa một phiên shell duy nhất trong màn hình. Tôi chỉ thử nghiệm điều đó. Lý do giải pháp này hoạt động là vì bạn đang sinh ra một phiên hoàn toàn mới thay vì kế thừa từ môi trường ban đầu.
Dror

4
Đây thực sự nên là câu trả lời được chấp nhận. Thủ thuật hay, cảm ơn!
dotancohen

2
Điều này đòi hỏi bạn phải nhập mật khẩu, điều này có thể gây khó xử / không mong muốn nếu bạn đang cố gắng thực hiện nó trong nhiều phiên.
Legooolas

156

Thủ thuật tiện lợi này từ liên kết này hoạt động rất tốt!

exec su -l $USER

Tôi hình dung tôi sẽ đăng nó ở đây vì mỗi lần tôi quên cách làm điều này, đây là liên kết đầu tiên xuất hiện trong google.


14
+1 vì không đưa người dùng vào một mạng con; bạn có thể đăng xuất / thoát như bình thường với điều này. Ngoài ra, nếu NOPASSWD: được đặt trong / etc / sudoers, thay vào đó bạn có thể sử dụng exec sudo su -l $USERđể tránh bị nhắc nhập mật khẩu.
Ivan X

21
Được thông báo: bạn sẽ được yêu cầu nhập mật khẩu sudo. Nếu bạn hiểu sai, thiết bị đầu cuối của bạn sẽ đóng lại.
Tyler Collier

1
@TylerCollier Ivan đã đề cậpNOPASSWD:
pepoluan

32

1. Nhận shell với nhóm mới mà không cần đăng xuất và đăng nhập lại

Nếu bạn chỉ thêm một nhóm, tôi đã sử dụng như sau:

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

Đây là một biến thể của thủ thuật newgrp hai lớp của Legooolas, nhưng nó nằm trong một dòng và không yêu cầu bạn phải nhập thủ công nhóm chính của mình.

sglà newgrp nhưng chấp nhận lệnh để thực thi với ID nhóm mới. Có execnghĩa là lớp vỏ mới thay thế lớp vỏ hiện có, vì vậy bạn không cần phải "đăng xuất" hai lần.

Không giống như sử dụng su, bạn không cần nhập mật khẩu của mình. Nó cũng không làm mới môi trường của bạn (ngoài việc thêm nhóm), vì vậy bạn giữ lại thư mục làm việc hiện tại của mình, v.v.

2. Thực hiện lệnh trong tất cả các cửa sổ Màn hình trong một phiên

Các atlệnh trong màn hình chạy một lệnh trong bất cứ cửa sổ bạn chỉ định (lưu ý đây là một lệnh màn hình, không phải là một lệnh shell).

Bạn có thể sử dụng lệnh sau để gửi lệnh tới tất cả các phiên Màn hình hiện có:

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

Lưu ý rằng cần phải thoát các backticks để idchạy trong phiên Màn hình và ^ M để có được Màn hình để nhấn 'enter' ở cuối lệnh của bạn.

Cũng lưu ý rằng stufflệnh của màn hình chỉ cần nhập văn bản lệnh thay mặt bạn. Do đó, điều gì đó kỳ lạ có thể xảy ra nếu một trong các cửa sổ màn hình có lệnh được viết một nửa tại dấu nhắc lệnh hoặc đang chạy một ứng dụng không phải là trình bao (ví dụ: emacs, trên cùng). Nếu đây là một vấn đề, tôi có một số ý tưởng:

  • Để loại bỏ bất kỳ lệnh nửa viết nào, bạn có thể thêm "^ C" vào đầu lệnh.
  • Để tránh chạy lệnh trong cửa sổ emacs, v.v., bạn có thể yêu cầu 'at' để lọc tiêu đề cửa sổ, v.v. , Vân vân).

Để chạy lệnh trong một cửa sổ cụ thể (được xác định bởi số cửa sổ), sử dụng như sau:

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

Tuyệt vời một lớp lót, dường như không có tác dụng phụ khác, cảm ơn!
Cyril Duchon-Doris


12

Các nhóm thường được liệt kê khi đăng nhập, không có cách nào tôi biết để buộc nó thực hiện lại việc liệt kê nhóm mà không đăng xuất và đăng nhập lại.

Nhiều câu trả lời được bình chọn ở đây dường như sử dụng một cách giải quyết gọi ra một lớp vỏ mới với môi trường trong lành (giống như đăng nhập lại). shell cha và tất cả các chương trình đang chạy liên tục khác thường sẽ không nhận được tư cách thành viên nhóm mới cho đến khi được gọi lại từ shell mới thường sau khi đăng xuất và đăng nhập sạch.


Thật ra, tôi khá chắc chắn rằng điều này không đúng - tôi đã tìm ra cách để làm điều đó trước đây trên một hộp Linux. Tuy nhiên, đối với cuộc sống của tôi, tôi không thể nhớ lệnh đó là gì. Nếu tôi tìm thấy nó, tôi sẽ đăng nó. Chỉnh sửa: Chỉ cần tìm thấy nó, tôi đang đăng nó như một câu trả lời.
bữa ăn trưa317

1
Cảm ơn bạn đã chỉ ra điều này, đây cũng là sự hiểu biết của tôi. Mọi câu trả lời khác ở đây chỉ đơn giản là mở một vỏ mới, bất kể nó thay thế một vỏ mở hay màn hình khởi động lại hay bất cứ thứ gì. Không có thuốc chữa bách bệnh kỳ diệu để ban hành lệnh hoặc tập lệnh và có mọi phiên chạy, bao gồm cả phiên X của bạn, phản ánh tư cách thành viên nhóm mới.
cào

12

Bạn có thể làm được việc này.

Thêm nhiều nhóm như bạn muốn sử dụng usermod -G. Sau đó, với tư cách là người dùng có phiên chạy, chỉ chạy newgrp -với đối số '-'.

Điều này xác định lại id nhóm thành mặc định, nhưng nó cũng sẽ đặt các nhóm thứ cấp là tốt. Bạn có thể xác minh điều này bằng cách chạy groupstừ phiên hiện tại, trước và sau usermodnewgrp.

Điều này phải được chạy từ mỗi phiên mở - tôi không biết nhiều về màn hình. Tuy nhiên, nếu có thể lặp lại tất cả các phiên mở và chạy newgrp, bạn sẽ ổn. Bạn sẽ không phải lo lắng về việc biết các nhóm hoặc ID nhóm.

Nhưng điêu tôt đẹp nhât se đên vơi bạn.


11
đã thử trên một xterm trong một phiên X nhưng nó không hoạt động
lùn

3
đã thử vào một phiên trong tmux và nó cũng không hoạt động ở đó
Michael

2
Đã thử trên Amazon linux 2, nó không hoạt động
Cyril Duchon-Doris 28/03 '

1
newgrp -bắt đầu một quy trình vỏ mới
Piotr Findeisen

Theo nhận xét của bạn về câu trả lời của Mister_Tom, đây là, như tất cả các câu trả lời khác, một cách giải quyết. Câu trả lời của Mister_Tom vẫn đúng.
scravy

4

Để tóm tắt:

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

Sử dụng 'exec' có nghĩa là thay thế shell hiện tại bằng shell mới được bắt đầu bằng lệnh newgrp (vì vậy thoát khỏi shell mới sẽ thoát bạn ra).

Cuối cùng newgrp -là cần thiết để khôi phục nhóm chính thông thường của bạn, vì vậy các tệp bạn tạo sau này sẽ có chủ sở hữu nhóm đó.

Lưu ý: Câu hỏi của người đăng ban đầu là làm thế nào để hiển thị các nhóm mới được thêm vào trong các quy trình hiện có. Các lệnh gpasswdusermodkhông ảnh hưởng đến các quy trình hiện có; các nhóm mới được thêm (hoặc đã xóa!) xuất hiện trong (biến mất khỏi) tài khoản của bạn, tức là trong các tệp / etc / group và / etc / gshadow, nhưng quyền cho các quy trình hiện tại không bị thay đổi. Để xóa quyền, bạn phải hủy mọi tiến trình đang chạy; newgrp -sẽ không đọc lại / etc / group và thiết lập lại danh sách nhóm; thay vào đó, nó dường như chỉ sử dụng các nhóm được liên kết trước đó với quy trình.


Nhân tiện, exec su - <username>có thể được sử dụng để có được một vỏ đăng nhập mới với các nhóm được đặt, nhưng nó sẽ không hoạt động trong các tập lệnh vì một vỏ mới sẽ đọc các lệnh từ thiết bị đầu cuối. Bạn có thể sử dụng su -c "command ..." <myusername>để khởi động lại tập lệnh của mình, nhưng quá trình kết quả không có thiết bị đầu cuối kiểm soát và do đó sẽ xảy ra lỗi nếu trình chỉnh sửa màn hình hoặc lệnh tương tác khác được thử.
jimav

Tại sao điều này bị hạ cấp? Ai đó có thể giải thích những gì xấu về nó, bởi vì đó là những gì xảy ra với tôi và tôi nghĩ rằng tôi thích nó nhất?
jasonmp85

Gah, tôi đã bỏ phiếu trước khi thử nghiệm. newgrp -không không thay thế các "nhóm chính". Câu trả lời của Patrick Conheady là câu trả lời hay nhất ở đây, vì nó không làm thay đổi hay thay đổi nhóm chính.
jasonmp85

1

Tôi gặp vấn đề tương tự nhưng cũng không cho người dùng đăng nhập. Khởi động lại nscd không giúp được gì, nhưng thực hiện lệnh này đã làm : nscd -i group. Điều đó sẽ hướng dẫn nscd (bộ nhớ đệm) để tải lại tập tin nhóm.


1

Tôi không thể nhận lệnh newgrp để làm việc. Tôi không chắc chắn nếu điều này phụ thuộc vào / etc / sudoers, nhưng tôi thường phải nhập mật khẩu cho sudo và điều này hoạt động mà không yêu cầu mật khẩu của tôi:

[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

Đây là mẹo nếu bạn có sudovà nó có thể giúp bạn tiết kiệm mật khẩu một lần nữa trong một số trường hợp:

sudo su $USER
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.