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


128

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

我试图通过运行来修改权限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

如您所见,它保持不变。


可以在这里找到更好的解决方案这两个问题应该联系在一起!

Answers:


79

该模式由分区的安装选项确定(您不能通过chmod更改它)。

对于文件上的“ 755”和目录上的“ 777”,您将使用

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

好的,那也可以解释其他一些事情。
内森·奥斯曼

4
我应该代替什么,/dev/whatever以及/mnt/whatever是否必须更改名为/media/Prtn
pranphy的

3
以这种方式安装是否保留磁盘的原始设置?即安装Windows驱动器安全吗?
2014年

1
我将用户设置为“ andrew”,这是我的主要用户。通过ls进行ntfs分区显示,其中的所有文件/目录均由root拥有。
deathangel908 '16

真正的解决方案是ntfs-3g.usermap。见下文...
Eduardo Cuomo

86

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

要启用此功能,您需要一个“用户映射文件”或permissions在安装时仅提供选项(当不需要与Windows兼容时)。这将使用用户ID(例如NTFS / Windows)在系统上映射Linux用户,以在内部使用它们。

有关某些信息和示例,请参见ntfs-3g手册页。如果需要更多信息,请参阅ntfs-3g有关所有权和权限的高级文档

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

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


4
是很好的文档。简而言之:sudo ntfs-3g.usermap /dev/disk/by-label/MY-NTFS然后sudo mv UserMapping /media/MY-NTFS/.NTFS-3G/
飞羊

1
因此,这将允许您像chmod 655 /some/file在Linux中安装的NTFS分区上一样随意设置权限?我试图弄清楚如何将我的主分区从linux合并到c:\ Users中。使用usermap可以让我保留所有权限吗?我打算将c:\ Users目录安装到Linux中的/ home。
trusktr 2014年

7
让我再次强调您的意见:“何时不需要与Windows兼容”。参考:askubuntu.com/questions/92863/...
椭圆视图

1
ntfs-3g manpage链接断开
ctrl-alt-delor

Eduardo Cuomo在这里写下了制作“用户映射文件”所需的所有步骤的一个很好的例子:askubuntu.com/a/887502/327339
Gabriel Staples

38

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

首先卸载ntfs分区。

标识您的分区UUID blkid

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。


2
这些权限如何存储?在ADS中?其他元数据?
ζ--

那么fat32呢?我有一个受写保护的Micro SD卡,我无法对其进行格式化。
Waqas

@RanaMuhammadWaqas-这是一个老问题,但是您也可以使用其他选项来安装它。很难知道您的问题是什么,也许确定您的硬件并提出一个单独的问题。
Panther

@ bodhi.zazen users表示noexecnosuidnodev。不是吗 用户如何通过设置进行装载/卸载noexec
Khurshid Alam 2015年

1
@EduardoCuomo-在答案中发表评论说它不起作用可能不会帮助您。什么文件系统?我建议你提出一个问题。您需要标识文件系统并发布fstab条目
Panther

20

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

因此,示例为:

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

13

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

bash script.sh

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


+1-我从未想过以这种方式调用它。
内森·奥斯曼

8
要执行二进制文件,请使用/lib64/ld-linux-x86-64.so.2 ./program.bin64位程序和/lib/ld-linux.so.2 ./program.bin32 位程序。
Lekensteyn '04

8

根据NTFS-3G文档的“ 所有权和权限”部分,我们可以使用安装选项来控制文件的访问创建。组合非常复杂(请参见此处的两个表)。另外,我不阅读并获得全部内容。例如,我不知道是否在NTFS-3G二进制软件包的编译时选择了POSIX ACL。但是,我得出的最好结果是使用用户映射文件和一些挂载选项来近似估计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. 下载usermap工具,将其压缩到某个位置(在我的情况下为drive C:),最好在NTFS分区之外(在我的情况下为drive D:)进行共享。

  2. 打开Windows命令行。转到工具的提取目录tools(默认情况下)usermap。然后运行以下命令:

    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。您可以分别通过命令whoami /user和进行检查whoami /groups

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

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

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

第2部分

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

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

必不可少的是设置umaskdmask并且fmask可能也可以工作,但未经测试)。umask尽管我选择了,但还是选择一个适合您的值077。似乎,如果没有此设置,o则将为新创建的文件赋予完全权限。

保存文件。现在sudo mount或重新挂载(sudo umount然后挂载sudo mount)共享的NTFS分区(以我为例/data):

$ sudo mount /data

第三部分

现在(仍在Linux上)cd到安装点(在我的情况下为/data),ls -l那里的文件。检查是否他们的所有权和权限,分别匹配你在指定的UserMapping文件和umask你设置/etc/fstab(权限之间的匹配,并umask需要一些补充的计算,看看男人(1)的umask以获取更多信息)。如果他们这样做,那么恭喜您,目标就实现了一半。否则,可怜你。询问Ubuntu或Windows。

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

紧急行动


6

我知道,旧线程仍然有用,但是仍然缺少一个特殊的用例技巧,它由其他各种论坛/线程上的不同建议组成,并在Ubuntu GNOME 13.04上进行了测试,我希望外部驱动器可以保存Steam库...

例如,当NTFS分区位于外部USB驱动器上时-意味着该分区可在连接时即时挂载-然后,您可以使用以下方法使udev带有执行权限挂载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
太好了,这应该是公认的答案。
大约

4

所有步骤:

  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-3gdefault

    它看起来应该像这样:

    #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操作系统警告!

我使用Windows 7+进行了检查,权限影响Windows操作系统!我更改了Windows分区上主目录的权限,当我再次使用Windows时,我可以看到用户已损坏!


1

USB设备没有相关的问题。如果您想以执行权限自动安装每个USB设备,此答案将提供一个丑陋的技巧。


1

使用自定义权限和所有者将NTFS分区挂载到USB驱动器中

在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
    
  • 检查您的用户标识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

/media$ sudo mkdir -p sdb1 /media$ sudo mount -o rw,users,umask=000,exec /dev/sdb1 ./sdb1/ mount: block device /dev/sdb1 is write-protected, mounting read-only
alhelal

@alhelal,恐怕您的USB驱动器的硬件已变为只读或“网格锁定”。但是文件系统也可能存在一些问题,如果文件系统已损坏,您可以通过在Windows中使用GUI方法或命令行(chkdsk /f X:根据此链接)修复该文件系统来对其进行修复ubuntuforums.org /… -如果仍然不走运,请备份数据,然后根据askubuntu.com/questions/144852/…
sudodus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.