我和一个同事共享一个git仓库,而且由于git并没有传播Unix文件的全部权限,所以我们有一个“钩子”运行在更新中,它们需要设置“其他”权限。问题?钩子使用chmod,事实证明,当我的同事提交文件时,他拥有它,所以我不能运行chmod,反之亦然。目录都是可写的,粘性的,所以我相信我们中的任何一个都有权删除任何文件,并用相同的名称,相同的内容,但不同的所有权替换它们。大概那么我们可以chmod它。但这似乎是一个非常大的锤子,我有点麻烦了。所以,两个问题:
有人会想到另外一种办法吗?
>如果没有,那么实现“使这个文件属于我”的防弹shell脚本的最佳设计是什么?没有跨文件系统移动等等…
对于那些可能没有实现的人,写权限不允许chmod:
% ls -l value.c -rw-rw---- 1 agallant ta105 133 Feb 10 13:37 value.c % [ -w value.c ] && echo writeable writeable % chmod o+r value.c chmod: changing permissions of `value.c': Operation not permitted
我们都在ta105组。
笔记:
>我们使用git不仅可以协调更改,还可以将repo作为课程网站发布。发布网站是回购的主要目的。权限脚本使用git钩子在每次更新时运行,并确保学生无权读取尚未公开的解决方案。
>请不要建议我有错误的umask。并不是repo中的所有文件都应具有相同的权限,无论选择umask,某些文件的权限都需要更改。更不要说对我的同事强加我的umask偏好是不客气的。
>更新:我刚刚了解到,在我们的环境中,root在我们可以访问的所有机器上都被撤销给任何人,因此依赖于root权限的解决方案将无法正常工作。
至少有一个Unix,我已经看到一种方式给某人chmod并且对特定组所拥有的所有文件选择权限。这有时被称为“组超级用户”或类似的东西。
我唯一看到这个Unix的Unix是Encore Multimax的Unix版本。
我搜索了一下,虽然我记得在Linux中有一些模糊的这种能力的引用,但我一直无法找到它们。所以这可能不是一个选择。幸运的是,它可以被模拟,尽管模拟有点危险。
模拟这个的方法是制作一个非常具体的suid程序,将在检查您是拥有该文件的同一个组的成员后,以root身份执行chmod,并且您的用户名被列为在特殊/ etc中具有该权限/ chmod_group文件,必须由root拥有,并且只能由root使用可读写。