Bash脚本 - 如何设置新文件所属的组?

99

我正在编写一个bash shell脚本,想要更改新文件所创建的默认组。我知道可以使用 umask 来更改权限。但是,有没有类似的方法可以更改文件所属的组?

2个回答

229
有几种方法可以做到这一点:
  1. 您可以通过在目录上设置setgid标志(chmod g+s <dir>)来更改特定目录中创建的所有文件的默认组。然后,目录中的新文件将使用目录的组进行创建(使用chgrp <group> <dir>设置)。这适用于在该目录中创建文件的任何程序。
  2. 请注意,对于新的子目录来说,此功能是自动继承的(Linux 3.10起)。但是,如果子目录已经存在,则此更改不会应用于它们。假设子目录已经具有正确的组,请使用以下命令向它们添加setgid标志:find . -type d -exec chmod g+s {} \;(建议由Maciej Krawczyk在评论中提供)。

  3. 如果未设置setgid标志,则默认组将设置为创建进程的当前组ID。虽然可以使用newgrp命令进行设置,但这将创建一个在shell脚本中难以使用的新shell。如果您想要使用更改后的组执行特定命令(或一组命令),请使用命令sg <group> <command>
  4. sg不是POSIX标准命令,但在Linux上可用。


13
小提示:如果您尝试在具有组y的目录上以用户x身份运行chmod g+s _dir_命令,并且用户x不是组y的成员,则该命令将无法工作。 您需要以root身份运行该命令。 - LEDfan
@LEDfan 啊!太好了,非常有用的提示/建议!过去我一直无法让它正常工作的原因就是最后这个部分(用户必须是该组的成员)。谢谢! - Jonathan Crooke
3
不要使用chmod -R命令,否则会在文件上应用setgid,从而创建安全问题(可执行文件将始终作为组所有者运行,无论谁运行它)。相反,请使用以下命令仅对目录应用:find . -type d -exec chmod g+s {} \; - Maciej Krawczyk

18

newgrp 命令用于在登录会话期间更改当前组 ID。

在该会话期间创建的新目录将使用该命令设置的组 ID。

newgrp(1)


我是该组的成员,为什么它要求我输入密码?它不接受我的密码! - Michael
如果我以root身份运行“newgrp <group>”(例如使用sudo运行包含newgrp的脚本),它会将我转移到一个root shell中。 - Michael
这不是 newgrp 应该使用的方式。如果你忘记在脚本外使用 newgrp,会发生什么?脚本如何处理 newgrp 创建的新 shell。@mark40 的答案更好。 - noel
17
这真的被认为是回答吗?这只是一个链接。 - mcont
不能不点赞,因为那是有趣的信息。我仍然认为@mark4o的答案应该是正确的。 - Teekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接