// 2 月 8 日更新 - 突出问题简要:
- 如何以不同于文件的方式对目录进行 umask?
- 如何在 Nautilus 复制/粘贴时设置 umask?
- 如何为 SSHFS 设置 umask?
我们的情况
我们公司的几个人登录服务器并上传文件。他们都需要能够上传和覆盖相同的文件。他们有不同的用户名,但都属于同一组。但是,这是一个互联网服务器,因此“其他”用户(通常)应该只具有只读访问权限。所以我想要的是这些标准权限:
文件:664
目录:771
我的目标是让所有用户都无需担心权限问题。服务器应配置为这些权限适用于所有文件和目录,无论是新建的、复制的还是覆盖的。只有当我们需要某些特殊权限时,我们才会手动更改这一点。
我们通过在 Nautilus 中使用 SFTP 将文件上传到服务器,通过使用 sshfs 安装服务器并在 Nautilus 中像访问本地文件夹一样访问它,以及通过在命令行中使用 SCP 将文件上传到服务器。这基本上涵盖了我们的情况和我们想要做的事情。
现在,我已经阅读了很多关于漂亮的 umask 功能的文章。据我了解,umask(与 PAM 一起)应该允许我做我想做的事:为新文件和目录设置标准权限。然而,经过许多小时的阅读和反复试验,我仍然无法做到这一点。我得到了许多意想不到的结果。我真的很想牢牢掌握 umask,但有很多问题没有得到解答。我将在下面发布这些问题,以及我的发现和导致这些问题的试验的解释。鉴于许多事情似乎出了问题,我认为我做错了几件事。因此,有很多问题。
注意:我使用的是 Ubuntu 9.10,因此无法更改 sshd_config设置 SFTP 服务器的 umask。已安装 SSH OpenSSH_5.1p1 Debian-6ubuntu2 < 需要 OpenSSH 5.4p1。因此,问题来了。
1. 我是否需要重新启动才能使 PAM 更改生效?
让我们从这个开始。涉及的文件太多了,我无法弄清楚什么会影响什么不会影响,也因为我不知道是否必须重新启动整个系统才能使 PAM 更改生效。在没有看到预期结果后我确实这样做了,但这真的有必要吗?或者我可以从服务器注销并重新登录,新的 PAM 策略应该生效吗?或者是否有一些“PAM”程序需要重新加载?
2. 是否有一个文件的更改会影响所有会话的所有用户?
因此,我最终修改了许多文件,因为我读到了许多不同的东西。我最终在以下文件中设置了 umask:
~/.profile -> umask=0002
~/.bashrc -> umask=0002
/etc/profile -> umask=0002
/etc/pam.d/common-session -> umask=0002
/etc/pam.d/sshd -> umask=0002
/etc/pam.d/login -> umask=0002
我希望此更改适用于所有用户,因此最好进行某种系统范围的更改。这能实现吗?
3. 毕竟,这个 UMASK 东西有用吗?
因此,在所有可能的地方将 umask 更改为 0002 后,我运行了测试。
------------SCP---------------
测试 1:
scp testfile (which has 777 permissions for testing purposes) server:/home/
testfile 100% 4 0.0KB/s 00:00
让我们检查权限:
user@server:/home$ ls -l
total 4
-rwx--x--x 1 user uploaders 4 2011-02-05 17:59 testfile (711)
更新:仅通过在 pam.d/common-sessions 中设置 umask 即可修复(参见评论)
---------SSH------------
测试2:
ssh server
user@server:/home$ touch anotherfile
user@server:/home$ ls -l
total 4
-rw-rw-r-- 1 user uploaders 0 2011-02-05 18:03 anotherfile (664)
--------SFTP-----------
Nautilus: sftp://server/home/
将新文件从客户端复制并粘贴到服务器(客户端为 777)
测试 3:
user@server:/home$ ls -l
total 4
-rwxrwxrwx 1 user uploaders 3 2011-02-05 18:05 newfile (777)
通过 Nautilus 创建一个新文件。在终端中检查文件权限:
测试4:
user@server:/home$ ls -l
total 4
-rw------- 1 user uploaders 0 2011-02-05 18:06 newfile (600)
我的意思是...这里刚刚发生了什么?!我们应该每次都得到 644。而我得到的是 711、777、600,然后是一次 644。而且只有通过 SSH 创建新的空白文件时才会得到 644,这是最不可能的情况。
所以我想问一下,umask/pam 到底能不能用?
更新:通过仅在 pam.d/common-sessions 中设置 umask 来修复测试 4(参见评论)
4.那么 UMASK SSHFS 意味着什么?
有时我们会使用 sshfs 在本地安装服务器。非常有用。但我们又遇到了权限问题。
以下是我们的安装方式:
sshfs -o idmap=user -o umask=0113 user@server:/home/ /mnt
注意:我们使用 umask = 113,因为显然 sshfs 从 777 而不是 666 开始,因此使用 113 我们得到 664,这是所需的文件权限。
但现在的情况是,我们看所有文件和目录都视为 664。我们在 Nautilus 中浏览到 /mnt 并:
- 右键->新建文件(newfile)---测试 5
- 右键->新建文件夹(newfolder)---测试 6
- 从我们本地客户端复制并粘贴 777 文件 ---测试 7
因此让我们检查一下命令行:
user@client:/mnt$ ls -l
total 8
-rw-rw-r-- 1 user 1007 3 Feb 5 18:05 copyfile (664)
-rw-rw-r-- 1 user 1007 0 Feb 5 18:15 newfile (664)
drw-rw-r-- 1 user 1007 4096 Feb 5 18:15 newfolder (664)
但是嘿,让我们检查一下服务器端的同一个文件夹:
user@server:/home$ ls -l
total 8
-rwxrwxrwx 1 user uploaders 3 2011-02-05 18:05 copyfile (777)
-rw------- 1 user uploaders 0 2011-02-05 18:15 newfile (600)
drwx--x--x 2 user uploaders 4096 2011-02-05 18:15 newfolder (711)
什么?!真正的文件权限与我们在 Nautilus 中看到的权限非常不同。那么 sshfs 上的这个 umask 是否只是创建了一个显示虚假文件权限的“过滤器”?我尝试打开来自同一组的另一个用户的文件,该文件具有真正的 600 个权限,但“假”权限为 644 个,但我仍然无法读取它,那么这个过滤器有什么用呢??
5. UMASK 只与文件有关。那么目录呢?
从我的测试中我可以看到,所应用的 umask 也会以某种方式影响目录权限。但是,我希望我的文件为 664 (002),目录为 771 (006)。那么目录是否可以有不同的 umask?
6. 也许 UMASK/PAM 确实很酷,但 UBUNTU 有缺陷?
一方面,我读过成功使用 PAM/UMASK 和 Ubuntu 的人们发表的主题。另一方面,我发现了许多有关 Ubuntu 上的 umask/PAM/fuse 的旧错误和新错误:
- https://bugs.launchpad.net/ubuntu/+source/gdm/+bug/241198
- https://bugs.launchpad.net/ubuntu/+source/fuse/+bug/239792
- https://bugs.launchpad.net/ubuntu/+source/pam/+bug/253096
- https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/549172
- http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=314796
所以我不知道该相信什么了。我是不是应该放弃?访问控制列表解决了我所有的问题吗?还是我使用 Ubuntu 时又遇到了问题?
使用 tar 进行备份时需要注意一点。Red Hat/Centos 发行版在 tar 程序中支持 acl,但 Ubuntu 在备份时不支持 acl。这意味着创建备份时所有 acl 都将丢失。
如果这也能解决我的问题,我非常愿意升级到 Ubuntu 10.04,但首先我想了解发生了什么。
答案1
这里可能发生很多事情。
首先想到的是:
- 是的,pam.d 更改立即生效
/etc/pam.d/common-session
是设置默认值的最佳位置umask
- 任何 pam.d umask 都会被 中的任何条目覆盖
.bashrc
,
但.bashrc
只能在特定情况下读取(交互式、非登录 shell) testfile (711)
很奇怪- 如何
/home
安装,您是否使用 ACL?
(例如执行什么操作ls -ld /home
并getfacl /home
打印?) testfile
在复制之前已经存在,因为不会scp
更改已存在的文件的权限(除非您使用该-p
标志)
- 如何
- 众所周知,Nautilus 以不同的方式创建文件,不知道为什么,或者规则是什么
umask=0113
可能会引起问题- 服务器和客户端是否运行相同的操作系统?
例如,如果客户端启用了 ACL,或者是 Cygwin,则行为可能会有所不同 - 强制合理权限的最佳方式是使用默认 ACL,正如您所发现的,这是因为
umask
用户可以在.bashrc
和中覆盖它.bash_profile
。
更新:
umask=0113
对于 sshfs 来说是错误的。- 尝试在不指定
umask
- 使用 在挂载点内创建一个新文件
touch
。 - 您应该看到它只获取例如
-rw-r--r--
,没有x
位 - 通过屏蔽
x
位,你可能会破坏目录
,并且编译器可能无法正确创建可执行文件
- 尝试在不指定
解决方法:
如果我们想不出更好的办法,您可以使用fam
或gamin
来监视正在创建的新文件并修复它们的权限,甚至只是定期运行并设置所有文件的权限的脚本。
答案2
ACL 应该可以正常工作。
为组的所有文件夹设置一个默认 ACL,然后所有未来的文件和目录都将继承该默认 ACL。
类似的东西setfacl -m d:g:uploaders:rwx
应该可以工作。
要修复您现有的权限:
find /shared/folder -type d -exec setfacl -m d:g:uploaders:rwx {} \;
find /shared/folder -type f -exec setfacl -m g:uploaders:rw {} \;
看起来,如果在复制文件时设置了“preserve”,则默认 ACL 不起作用。在这种情况下,我只能建议在 cron 中运行 find 命令或监视文件系统的更改。
答案3
这与 PAM/umask 无关,但可能对您有用。
如果你设置组ID目录,则其中创建的所有文件和目录都将自动分配到其组。
root@ricarda ~ # mkdir hello
root@ricarda ~ # chown :users hello
root@ricarda ~ # chmod g+s hello
root@ricarda ~ # ls -l |grep hello
drwxr-sr-x. 2 root users 4096 Feb 7 04:05 hello
root@ricarda ~ # touch hello/some_file
root@ricarda ~ # mkdir hello/some_dir
root@ricarda ~ # ls -l hello/
total 4
drwxr-sr-x. 2 root users 4096 Feb 7 04:16 some_dir
-rw-r--r--. 1 root users 0 Feb 7 04:06 some_file