我有一个桌面应用程序,它为用户提供一个 tarball (.tar.gz),他们可以解压该文件以查找可以使用可执行权限运行的二进制文件,从而启动整个程序。这适用于用户的主磁盘,但如果它位于可移动媒体(例如 USB 或外部 HD)上,则不起作用(对于 Windows,这适用)。每次我尝试更改权限时,都以“r”和“w”开头,使用chmod
权限恢复为排除可执行权限,即使是 root。
挂载点的当前挂载信息/dev/sda1 on /media/me/78E1-495A type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
关于这个问题还有其他帖子:相关询问 ubuntu 问题其中有一些有趣的解决方案,例如通过权限更改安装,但这是否不需要重新安装到另一个位置(答案不完整)?在这个问题中,答案提供了解决方案用 mount -o -exec 回答,它使用一个新的挂载点执行选项,但这不会更改默认的非执行选项。
是否有一个不涉及更改用户系统的任何配置文件的解决方案?
答案1
文件系统类型vfat
(对于 USB 记忆棒来说是典型的)不支持存储 chmod 尝试修改的权限。 vfat
是 Windows 派生的文件系统,因此它不完全支持 UNIX 文件语义也就不足为奇了。
此外,该showexec
选项会阻止执行位。根据 mount 的手册页,
如果设置,则仅当名称的扩展部分为 .EXE、.COM 或 .BAT 时才允许文件的执行权限位。默认情况下未设置。
如果没有 showexec 安装选项,可能所有文件都会被标记为可执行文件,并且该chmod -x
命令仍然不会执行任何操作。
答案2
文件系统UDF
您可以使用文件系统 UDF,在其中可以相当自由地管理所有权和权限,以便目录可写且程序可执行。
UDF 可能缺乏修复文件系统的工具,这是一个缺点,但有几个优点。
自由软件
也许可以通过以下链接在 Windows 中找到修复工具:UDF 的 fsck 工具,并且有一些工具可作为源代码
可以在Ubuntu中创建
兼容linux风格的链接。
与 Linux 风格的权限和所有权兼容。您可以创建和修改单个文件的所有权和权限(FAT 和 NTFS 无法做到这一点)。
UDF分区在Windows 10中不会提示格式化(而linux ext4文件系统会受到影响,并且可能会被误毁)。
如何创建和使用UDF:使用 UDF 作为 USB 记忆棒 FAT 的后继者
因此,要使用它,假设您的 USB 记忆棒是
/dev/sdx
:安装软件包
udftools
(在 Ubuntu 和 Debian 中)sudo apt-get install udftools
创建一个分区表和一个分区
gparted
或者gnome-disks
有风险地擦除目标分区的第一个 mibibyte
dd
(仔细检查命令行!)sudo dd if=/dev/zero of=/dev/sdx1 bs=1M count=1
跑步
mkudffs
,sudo mkudffs -b 512 --media-type=hd --lvid=my-label /dev/sdx1
擦除分区的第一个 MiB 字节以擦除以前的文件系统信息(或其他剩余数据),以防止您的 U 盘在使用 UDF 格式化后被检测为 FAT。
这
-b 512
是为了强制文件系统块大小等于 USB 记忆棒的物理块大小,按照 UDF 规范的要求。如果您有幸拥有具有更合适块大小的 USB 记忆棒,请调整它。之后,您的 USB 记忆棒将可用于 GNU/Linux 的读写,也可用于当前版本的 Windows(对于过时版本 XP 为只读)。不幸的是,在 Linux 中创建的这个版本的 UDF 无法由 MacOS 管理(2020 年 11 月在多个版本的 MacOS 中进行了测试)。
测试示例
我在 U 盘中制作了以下系统,
$ lsblk -o name,size,fstype,label,mountpoint /dev/sdc
NAME SIZE FSTYPE LABEL MOUNTPOINT
sdc 57,3G
└─sdc1 3,5G udf work-here /media/olle/work-here
带有 UDF 的分区会自动挂载在我的计算机中。
我在 UDF 文件系统的顶层创建了一个目录(使用 sudo),并修改了其所有权和权限,以便第一个普通用户获得所有权和完全权限。
sudodus@bionic64 /media/sudodus/work-here/cd-2-this-dir $ ls -l /media/sudodus/work-here
totalt 0
drwxr-xr-x 2 sudodus sudodus 196 aug 2 23:14 cd-2-this-dir
然后我创建了一个小的 bash shellscript 并赋予它执行权限
chmod +x run-this-file
sudodus@bionic64 /media/sudodus/work-here/cd-2-this-dir $ ls -l
totalt 0
-rwxrwxr-x 1 sudodus sudodus 49 aug 2 23:14 run-this-file
并且可以在该位置(在 USB 驱动器中)执行,
sudodus@bionic64 /media/sudodus/work-here/cd-2-this-dir $ ./run-this-file
Hello World, I am sudodus
在我的主计算机(Ubuntu 18.04.6 LTS)上进行此练习后,我在 Ubuntu 22.04 LTS 和 Windows 11 中进行了测试。我创建了一个bat
文件,并且可以通过以下方式执行
.\run.bat
最终评论
我认为这种使用 UDF 的方法可以使您的程序包在 Linux 和 Windows 中可用。
不幸的是,我没有适用于 MacOS 的流畅方法。如果您需要一种适用于MacOS的方法,我认为用户需要FAT32或exFAT,并且必须卸载并再次安装,这次根据exec
添加的安装选项这个链接. 向下滚动到“示例 2(具有文件的执行权限...)”。
可以做的[使其更加用户友好]是拥有一个小的 shell 脚本,可以从一个小分区运行这些命令并修改同一驱动器上较大分区的挂载选项,
sudo bash make-execution-possible
这无需可执行权限即可工作(但仅适用于 shellscript,我认为您有一些已编译的程序)。