newgrp 命令通过启动新子 shell 临时切换当前会话的主组,要求用户必须是目标组成员;若组设密码且用户非管理员,则需输入组密码;退出子 shell(exit 或 ctrl+d)即可恢复原组环境。

newgrp 命令用于临时切换当前 shell 会话的**主组(primary group)**,而不是简单地“加入”一个组。它会启动一个新子 shell,该 shell 的有效组 ID(EGID)变为指定的组,从而影响后续创建文件的默认所属组(由 umask 和组写权限共同决定)。
基本用法:切换到已有组
运行 newgrp groupname 后,系统会尝试启动一个新的 shell,并将该 shell 的主组设为 groupname。前提是当前用户必须是该组的成员(在 /etc/group 中列出),否则会提示 Permission denied。
- 查看当前用户所属的组:groups 或 id -nG
- 切换到名为 developers 的组:newgrp developers
- 验证是否成功:id -gn(显示当前主组名)或 id -g(显示 GID)
需要密码的情况
如果目标组在 /etc/gshadow 中设置了密码(即组密码不为空),且当前用户不是该组的“密码免检成员”(如未在 /etc/gshadow 的组条目中列为管理员),则执行 newgrp 时会提示输入该组的密码(不是用户密码)。
- 设置组密码(需 root 权限):sudo gpasswd developers
- 移除组密码:sudo gpasswd -r developers
退出临时组环境
newgrp 启动的是一个新 shell(通常是当前用户的默认 shell,如 bash)。要回到原来的组环境,只需退出这个 shell:exit 或按 Ctrl+D。原 shell 的组信息不受影响。
- 注意:newgrp 不修改当前 shell 的组,只新建子 shell
- 无法用 newgrp 切换到不存在的组或非成员组
- 脚本中慎用,因为会阻塞并等待子 shell 退出
替代方案与注意事项
若只想让某条命令以特定组身份运行(不启动新 shell),可用 sg 命令:
- sg developers -c "touch testfile":以 developers 组身份执行命令,创建的文件属组为 developers
- sg 不改变当前 shell 的主组,更轻量、适合脚本
- 两者都不影响已存在的进程或父 shell,仅作用于新启动的上下文











