如何在NTFS(或FAT32)分区上使用“chmod”?

我有一个脚本,我需要在NTFS分区上执行。 该脚本的权限设置为600。

我尝试通过运行chmod 755 script.sh来修改权限,该chmod 755 script.sh不会报告失败或任何内容 – 但它也不会更改文件的权限:

 $ stat script.sh File: `script.sh' Size: 297070 Blocks: 584 IO Block: 4096 regular file Device: 811h/2065d Inode: 35515 Links: 1 Access: (0600/-rw-------) Uid: ( 1000/ xxxxxx) Gid: ( 1000/ xxxxxx) Access: 2010-09-30 14:05:16.041621000 -0700 Modify: 2010-09-30 14:05:05.070157000 -0700 Change: 2010-09-30 14:05:05.070475000 -0700 $ chmod 755 script.sh $ stat script.sh File: `script.sh' Size: 297070 Blocks: 584 IO Block: 4096 regular file Device: 811h/2065d Inode: 35515 Links: 1 Access: (0600/-rw-------) Uid: ( 1000/ xxxxxx) Gid: ( 1000/ xxxxxx) Access: 2010-09-30 14:05:16.041621000 -0700 Modify: 2010-09-30 14:05:05.070157000 -0700 Change: 2010-09-30 14:05:05.070475000 -0700 

如您所见,它保持不变。

该模式由分区的挂载选项决定(您无法通过chmod更改它)。

对于’755’文件和’777’目录,你会使用类似的东西

 sudo mount -t ntfs -o rw,auto,user,fmask=0022,dmask=0000 /dev/whatever /mnt/whatever 

与大多数人认为的相反,NTFS是POSIX兼容的¹文件系统, 可以在NTFS上使用权限

要启用此function,您需要“用户映射文件”或在安装时仅提供permissions选项(当不需要与Windows兼容时)。 这会映射系统上的linux用户,如NTFS / Windows之类的用户ID在内部使用它们。

有关一些信息和一些示例,请参见ntfs-3g联机帮助页 。 如果您需要更多信息,请参阅有关所有权和权限的ntfs-3g高级文档 。

(请注意,这不适用于FAT文件系统。)

¹是的,它还可以存储在linux / unix中有效但不在Windows下有效的文件名,支持符号链接和硬链接等。

对于NTFS分区,请使用fstab中的permissions选项。

首先卸载ntfs分区。

使用blkid识别分区UUID

 sudo blkid 

然后编辑/etc/fstab

 # Graphical gksu gedit /etc/fstab # Command line sudo -e /etc/fstab 

并为ntfs分区添加或编辑一行

 # change the "UUID" to your partition UUID UUID=12102C02102CEB83 /media/windows ntfs-3g auto,users,permissions 0 0 

制作挂载点(如果需要)

 sudo mkdir /media/windows 

现在挂载分区

 mount /media/windows 

我给你的选项auto ,将在你启动时自动挂载分区, users允许用户挂载和卸载。

然后,您可以在ntfs分区上使用chown和chmod。

除了在上面的htorque的答案中设置fmask和/或dmask之外,如果你想在驱动器上执行脚本,我还必须设置“exec”挂载选项。

所以例子是:

 sudo mount -t ntfs -o rw,auto,user,fmask=0022,dmask=0000,exec /dev/whatever /mnt/whatever 

您始终可以显式调用脚本解释器,在这种情况下不需要执行权限。 如果脚本使用bash ,可以通过查看脚本的第一行来validation,只需运行即可

 bash script.sh 

请注意,该脚本会调用同一分区上的其他脚本或二进制文件,但这不起作用。 另请注意,该策略不适用于二进制文件,而不是使用Bash Script,Perl,Python等编写的文本脚本文件。

根据NTFS-3G文档的Ownership and Permissions部分,我们可以使用mount选项来控制文件访问创建 。 组合非常复杂(参见那里的两个表)。 我也不读并得到所有这些。 例如,我不知道是否在编译时选择了POSIX ACL,而不是NTFS-3G二进制包。 但我发现的最好的方法是使用一个用户映射文件和一些挂载选项来估算Windows和Linux之间文件所有权和权限的合理映射。


警告 :这仅适用于在双启动Windows 8和Kubuntu 14.04之间共享NTFS 数据分区 (驱动器D:在Windows上)。 说明书经过仔细的回顾记录,但未经过全面测试。 再次重复整个过程太累人又乏味了。 因此,请自行承担风险。 但如果你这样做,请分享你的经验。 如果您决定按照说明进行操作,请在实际操作之前完整阅读。 祝好运!


好的,你走吧! 详细说明由三部分组成。 第1部分应在Windows上执行,而第2部分在Linux上执行。 第3部分用于测试。

第1部分

NTFS-3G文档的“ 用户映射”部分指定了两个版本来设置Windows和Linux之间的用户映射,一个Windows版本和一个Linux版本。 我的经验是Linux版本最终失败了 。 Linux帐户映射到我的Windows帐户,但在SID下出现了一些未知帐户。 结果很乱,因为这个未知帐户取得了我的Windows帐户的所有文件的所有权。 在这种情况下,除非您拥有恢复所有权的管理权限,否则Windows帐户下的文件将无法访问。 但即使你管理,它仍然是一个错误的映射。 这意味着,以后您在Linux上创建的任何文件都会被分配到Windows上的未知帐户,而Windows上的那些文件将被分配给Linux上的root(如果我没记错的话)。 因此,在Windows上,您需要重新获得所有权,并在Linux上更改所有权。 这不是我们所期望的。 在几次无望的尝试解决问题后,我放弃了并转向Windows版本。 那个工作了。 从NTFS-3G文档的相关部分中提取的详细说明如下:

  1. 下载用户地图工具,将其解压缩到某处(在我的情况下,驱动器C: :) ,更好地在NTFS分区之外(在我的情况下驱动器D: :)中进行共享。

  2. 打开Windows命令行。 更改为用户地图tools的解压缩目录tools (默认情况下)。 然后运行以下命令:

     C:\tools> mapuser > UserMapping 

    这会生成一个模板并将其重定向到名为UserMapping的文件。 用文本编辑器打开文件,比如记事本,你应该看到以下几行:

     # Generated by usermap for Windows, v 1.1.5 # For Windows account "Account" in domain "Domain" # Replace "user" and "group" hereafter by matching Linux login user::SID :group:SID 

    据推测,第一个SID应该是您的用户SID,而第二个SID应该是您的组SID。 您可以通过命令whoami /userwhoami /groups分别检查它们。

  3. 确保SID正确后,请按照注释中的说明进行操作,即将user::SID行中的user::SID更改为您的用户名和group :group:SID行中的主要组名。 在Ubuntu上,它们是一样的。 此外,在user::SID行的第一个冒号后也添加您的Linux组名。 所以该行看起来应该像user:group:SID 。 似乎如果不这样做,在Windows上创建的文件将被分配给user:root Linux上的user:root

  4. 保存文件。 将其移动到要共享的NTFS分区上名为.NTFS-3G的目录(如果不存在则创建它)(在我的情况下,驱动器D: .NTFS-3G

  5. 此步骤用于第3部分中的测试。在共享NTFS分区上,创建新目录和新文件。

第2部分

现在启动进入Linux。 sudo编辑文件/etc/fstab 。 将共享NTFS分区的行添加或修改为以下内容:

 UUID=... /data ntfs defaults,umask=077,utf8 0 0 

必要的是设置umaskdmaskfmask也可以工作但不测试)。 选择你喜欢的umask值,虽然我选择了077 。 似乎没有此设置,将为新创建的文件提供完全权限。

保存文件。 现在sudo mount或remount( sudo umount然后sudo mount )共享的NTFS分区(在我的case /data ):

 $ sudo mount /data 

第3部分

现在(仍然在Linux上) cd到挂载点(在我的情况下, /data ), ls -l那里的文件。 检查它们的所有权和权限是否分别与您在UserMapping文件中指定的以及您在/etc/fstab设置的umask匹配(权限和umask之间的匹配需要一些补充计算,有关详细信息,请参阅man(1)umask )。 如果他们这样做,祝贺,实现了半个目标。 否则,你很穷。 问Ubuntu或Windows。

然后创建一个新目录和一个新文件。 ls -l检查他们的所有权和权限。 所有权应该像往常一样是您的用户名和主要组。 权限应与umask匹配。 现在重新启动计算机并启动进入Windows。 在共享NTFS分区上找到刚刚在Linux上创建的目录和文件。 检查其属性以查看它们是否已分配给您的Windows帐户。 如果他们是,祝贺你,你们都完成了。 否则,运气不好。 问Windows或Ubuntu。

EOF

旧线程,我知道,但仍然相关并缺少一个特定的用例提示,由各种其他论坛/线程上的不同建议组成,并在Ubuntu GNOME 13.04上测试,我想要一个外置驱动器来存放Steam库…

例如,当NTFS分区位于外部USB驱动器上时 – 这意味着分区在连接时即时安装 – 然后您可以使用以下方法使udev mount ntfs分区具有执行权限。

打开终端窗口并执行:

 $ sudo nano /etc/udev/rules.d/90-usb-disks.rules 

然后将此行粘贴到应该是空白/新文件的位置(如果没有,则退出nano并重新发出该命令,但使用更高的数字启动文件名,如91 -…):

 ENV{ID_FS_TYPE}=="ntfs", ENV{ID_FS_TYPE}="ntfs-3g" 

然后保存并关闭。 拔下驱动器,然后在终端中执行:

 $ sudo service udev restart 

接下来,将驱动器重新插入并享受:)

所有步骤:

  1. 安装ntfs-3g

     sudo apt-get install -y ntfs-3g 
  2. 卸载NTFS分区:

     sudo umount /mnt/windows 
  3. 使用ntfs-3g.usermap生成UserMapping文件:

     sudo ntfs-3g.usermap /dev/disk/by-label/MY-NTFS 

    要么

     sudo ntfs-3g.usermap /dev/sdb1 
  4. 重新安装NTFS分区以添加UserMapping文件:

     mount -a sudo mkdir /mnt/windows/.NTFS-3G sudo mv UserMapping /mnt/windows/.NTFS-3G/ 
  5. 更新您的fstab文件:

     sudo vim /etc/fstab 

    更新挂载行:

    1. 备份您当前的安装线! 复制该行并通过在开头添加#对其进行注释。
    2. 接下来更改: UUID=34A0456DA04536A0 /mnt/windows ntfs defaults,uid=1000,gid=1000 0 0
    3. 下一个: UUID=34A0456DA04536A0 /mnt/windows ntfs-3g defaults 0 0 (使用ntfs-3g并且只有default选项)

    它应该看起来像这样:

    #UUID=34A0456DA04536A0 /mnt/windows ntfs defaults,uid=1000,gid=1000 0 0 UUID=34A0456DA04536A0 /mnt/windows ntfs-3g defaults 0 0

  6. 最后,使用你的fstab重新安装:

     sudo umount /mnt/windows sudo mount -a 

为您拥有的每个NTFS分区执行一次此操作!

使用WINDOWS OS警告!

我用Windows 7+检查它,权限会影响Windows操作系统! 我在Windows分区上更改了我的主目录的权限,当我再次使用Windows时,我发现用户已经坏了!

有关USB设备的相关问题。 如果您想要使用执行权限自动挂载每个USB设备, 这个答案提供了一个丑陋的黑客攻击。

在具有自定义权限和所有者的USB驱动器中安装NTFS分区

在Linux中,NTFS(和FAT32)的模式由分区的挂载选项决定 。 你不能通过chmod改变它。

假设:USB驱动器被视为 sdb1修改以匹配您的机箱中的驱动器号和分区号 。 一般语法是sdxn ,其中x是驱动器号, n是分区号,例如sudo lsblk -f

准备

  • 卸载NTFS分区。

     sudo umount /dev/sdxn # general syntax sudo umount /dev/sdb1 # modify to match your case 
  • 创建自定义安装点(仅当您需要新的安装点时),例如使用

     sudo mkdir -p /mnt/sd1 
  • 检查你的userID的uid号码(通常为1000,有时是1001或1002 ……)

     grep ^"$USER" /etc/group 

    如果你想获取所有权(默认为root ),请使用该号码。

挂载NTFS分区

示例1 (没有文件的执行权限,没有’他人’的访问权限),

 sudo mount -o rw,user,uid=1000,dmask=007,fmask=117 /dev/sdxn /mnt/sd1 # general syntax sudo mount -o rw,user,uid=1000,dmask=007,fmask=117 /dev/sdb1 /mnt/sd1 # modify to match your case 
  • 在这种情况下,您可以使用脚本运行this-script

     bash /mnt/sd1/this-script 

示例2 (具有文件的执行权限,不能访问“其他人”),

 sudo mount -o rw,user,uid=1000,umask=007,exec /dev/sdxn /mnt/sd1 # general syntax sudo mount -o rw,user,uid=1000,umask=007,exec /dev/sdb1 /mnt/sd1 # modify to match your case 
  • 在这种情况下,您可以使用脚本运行this-script

     /mnt/sd1/this-script 

    并且您也可以从此位置运行可执行程序(不建议这样做)。

示例3 (每个人的完全权限,当有多个用户时,这是方便但不安全的),

 sudo mount -o rw,users,umask=000,exec /dev/sdxn /mnt/sd1 # general sudo mount -o rw,users,umask=000,exec /dev/sdb1 /mnt/sd1 # modify to match your case