題 無需註銷即可重新加載Linux用戶的組分配


使用以下方式分配用戶的輔助組列表時:

# usermod -G <grouplist> <user>

是否可以強制此組分配生效而不註銷所有正在運行的會話?

這在a的情況下非常有用 屏幕 session存在許多正在運行的shell,因為整個會話基本上都需要銷毀才能使組分配生效。

我想我可以使用。在運行的shell中更改用戶的主要組 newgrp 命令 - 是否有一些替代方案可用於輔助組?

理想情況下,我想要的東西會在每個shell中生效,而不是在每個shell中手動運行,但如果失敗,可能會強制Screen在每個shell中執行相同的命令。


266
2018-04-17 19:50


起源


我知道至少對於某些窗口/會話管理器來說,可以這樣做,以便會話獲取新組,並且它可用於從菜單,面板按鈕或其他任何東西開始的任何新進程。我剛才來到這裡尋找那個,所以不能說現在怎麼做,而且可能是窗口管理員特有的。 - mc0e


答案:


可怕的hacky,但你可以使用兩層 newgrp 為特定群體實現這一目標:

id -g

...將為您提供當前的主要組ID。我們稱之為 orig_group 出於這個例子的目的。 然後:

newgrp <new group name>

...會將您作為主要組切換到該組,並將其添加到返回的組列表中 groups 要么 id -G。 現在,進一步:

newgrp <orig_group>

...將為您提供一個shell,您可以在其中看到新組,而主要組件是原始組。

這很糟糕,只會讓你一次添加一個組,但它幫助我多次添加組而不退出/在我的整個X會話中(例如,將保險絲作為一組添加到用戶這樣sshfs就能工作了)。

編輯:這也不需要您輸入密碼 su 將。


164
2017-10-10 17:36



不錯的伎倆,我喜歡它 - Simon
在Fedora上,我必須這樣做 newgrp $USER 代替 newgrp <orig_group>。這意味著我不必找到我原來的主要組ID,因此它比這個解決方案更容易。 - Richard Turner
我覺得這樣做已經足夠了 newgrp <new group name>。這是Ubuntu 14.04 - Edward Falk
@EdwardFalk是對的,但是你沒有(可能不想)將該組留作主要... - mimoralea
請注意每個 newgrp 創建一個新的shell,所以當你需要完全退出你的會話時,你需要“退出退出”以完全退出(: - jwd


從shell內部,您可以發出以下命令

su - $USER

id現在將列出新組:

id

269
2017-11-06 15:28



在許多情況下,我認為這是最好的方法,但原始海報確實想要在屏幕會話中更新多個shell。這個解決方案可以從每個shell完成。 - Adrian Ratnapala
好戲,很棒! - genpfault
原始解決方案也只能在屏幕上修復單個shell會話。我剛剛測試過。此解決方案的工作原因是因為您正在生成一個完整的新會話而不是從原始環境繼承。 - Dror
這應該是公認的答案。好的伎倆,謝謝! - dotancohen
這需要您輸入密碼,如果您嘗試在大量會話中執行此操作,則可能會有尷尬/不需要的密碼。 - Legooolas


這個漂亮的伎倆來自 這個鏈接 效果很好!

exec su -l $USER

我想我會在這裡發布它,因為每次我忘記如何做到這一點,這是谷歌中出現的第一個鏈接。


124
2018-06-18 16:27



+1表示沒有將用戶放在子shell中;你可以像往常一樣註銷/退出。此外,如果NOPASSWD:在/ etc / sudoers中設置,則可以改為使用 exec sudo su -l $USER 避免被提示輸入密碼。 - Ivan X
建議:系統會要求您輸入sudo密碼。如果你弄錯了,你的終端就會關閉。 - Tyler Collier
@TylerCollier伊万 沒有 提到 NOPASSWD: - pepoluan


1.在沒有註銷的情況下獲取新組的shell

如果您只添加一個組,我使用以下內容:

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

這是Legooolas的兩層newgrp技巧的變體,但是它在一行中並且不需要您手動輸入您的主要組。

sg 是newgrp但接受使用新組ID執行的命令。該 exec 表示新shell替換現有的shell,因此您不需要“註銷”兩次。

與使用su不同,您無需輸入密碼。它也不會刷新您的環境(除了添加組),因此您保留當前的工作目錄等。

2.在會話中的所有屏幕窗口中執行命令

at 屏幕中的命令在您指定的任何窗口中運行命令(請注意,這是一個屏幕命令,而不是一個shell命令)。

您可以使用以下命令將命令發送到所有現有的Screen會話:

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

注意需要逃避反擊才能獲得 id 在屏幕會話中運行,然後使用^ M讓屏幕在命令結束時點擊“輸入”。

還要注意屏幕的 stuff 命令只需代表您鍵入命令文本。因此,如果其中一個屏幕窗口在命令提示符處具有半寫命令或正在運行除shell之外的應用程序(例如emacs,top),則可能會發生奇怪的事情。如果這是一個問題,我有一些想法:

  • 要刪除任何半寫命令,可以在命令的開頭添加“^ C”。
  • 為了避免在emacs窗口等中運行命令,你可以要求'at'過濾窗口標題等(在上面的例子中,我使用“#”,它匹配所有窗口,但你可以按窗口標題,用戶過濾等)。

要在特定窗口(由窗口編號標識)中運行該命令,請使用以下命令:

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

20
2017-12-17 21:33



令人敬畏的一個襯墊,似乎沒有其他副作用,謝謝! - Cyril Duchon-Doris


你可以這樣做。

根據需要添加任意數量的組 usermod -G。然後,作為運行會話的用戶,運行 newgrp - 只有' - '參數。

這會將組ID重新初始化為默認值,但它也會設置輔助組。您可以通過運行來驗證這一點 groups 從本屆會議開始,之前和之後 usermod 和 newgrp

這必須從每個開放會話運行 - 我不太了解屏幕。但是,如果可以迭代所有打開的會話並運行 newgrp你應該好。您不必擔心知道組或組ID。

祝你好運。


13
2018-01-30 16:17



嘗試在X會話中的xterm,但它沒有工作 - dwery
嘗試在tmux中的會話,它也沒有在那里工作 - Michael
試過亞馬遜linux 2,它沒有用 - Cyril Duchon-Doris
newgrp - 啟動一個新的shell進程 - Piotr Findeisen


通常在登錄時枚舉組,我無法強制它重新進行組枚舉而無需註銷並重新登錄。

在這裡投票的許多答案似乎都使​​用了一種解決方法,可以在新環境中調用新的shell(與再次登錄相同)。父shell和所有其他連續運行的程序通常不會收到新的組成員資格,直到通常在清理註銷和登錄後從新shell重新調用。


12
2018-04-25 17:56



說實話,我很確定這不是真的 - 我之前在Linux機器上找到了一種方法。但是,對於我的生活,我不記得命令是什麼。如果我發現它,我會發布它。編輯:剛剛找到它,我發布它作為答案。 - lunchmeat317


運用 newgrp 命令解決了我的問題:

newgrp <GroupName>

這篇博文 有詳細的解釋。


10
2017-10-07 04:53



歡迎來到超級用戶!在這個Q&A網站上,我們嘗試提供 好的答案 提問人們的帖子。其中一部分包括你帖子中的答案, 而不是簡單地提供可能回答問題的另一個頁面的鏈接。請編輯您的答案,將實際解決方案包含在已發布的問題中。 - cascer1
這是我認為最好的方式,應該標記為新接受的答案。 - Dakatine


總結一下:

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

使用'exec'意味著用newgrp命令啟動的新shell替換現有shell(因此退出新shell會將您註銷)。

決賽 newgrp - 需要恢復正常的主要群組,因此您稍後創建的文件會將其作為群組所有者。

注意:原始海報的問題是如何在現有流程中顯示新添加的組。該 gpasswd 和 usermod 命令不會影響現有進程;新添加(或刪除!)組出現在您的帳戶中(從中消失),即在/ etc / group和/ etc / gshadow文件中,但現有進程的權限不會更改。至 去掉 您必須殺死任何正在運行的進程的權限; newgrp - 不會重新讀取/ etc / group並重置組列表;相反,它似乎只是使用以前與該過程相關聯的組。


4
2018-02-10 23:21



順便說說, exec su - <username> 可用於獲取具有組設置的新登錄shell,但這在腳本中不起作用,因為新shell將從終端讀取命令。你可以用 su -c "command ..." <myusername> 重新啟動腳本,但生成的進程沒有控制終端,因此如果嘗試使用屏幕編輯器或其他交互式命令,則會發生錯誤。 - jimav
為什麼這會被貶低?有人可以解釋它有什麼不好,因為這是我發生的事情,我認為我最喜歡它? - jasonmp85
嗨,我在測試前投了票。 newgrp - 不 不 替換“主要組”。 Patrick Conheady的答案是最好的答案,因為它既不會分叉也不會改變主要組別。 - jasonmp85


我有類似的問題,但也沒有登錄用戶。重新啟動nscd沒有幫助,但執行此命令時: nscd -i group。這應該指示nscd(緩存守護進程)重新加載groups文件。


1
2017-11-13 16:07





如果你有這個訣竅 sudo 在某些情況下,它可以避免再次輸入密碼:

sudo su $USER

0
2017-08-06 14:03





派對有點晚了, gpasswd 應該做的工作,而不創建一個新的會話:

$ gpasswd -a user groupname

您可以一次修改單個組,但您可以設置其所有成員:

$ gpasswd -M user1,user2 groupname

0
2017-11-18 14:26



這不會改變當前的shell。 - kavadias
@kavadias不應該改變shell。只需將用戶添加到組,無需註銷和新登錄。 - Tombart
我沒有看到它是如何有用的,當在屏幕會話中運行和新啟動的進程時,將無法看到組的更改。 - kavadias