系统添加了新的分区,但在运行程序时出现了“权限被拒绝”的错误提示。

可能是重复问题: Ubuntu夺走了我的数据分区的权限 我在系统上重新格式化了一个NTFS分区,改为ext4,因为我想在当前的Ubuntu安装中使用它,而不是在Windows上。我在/etc/fstab中添加了一个条目,以便在启动时挂载它。挂载点是/home/username/bin。我将/home/username/bin及其所有子目录的所有者更改为我的常规帐户和用户组。最后,我将所有权限设置为755。
我的/etc/fstab如下所示:
proc        /proc               proc    nodev,noexec,nosuid               0       0
UUID=[uuid] /                   ext4    errors=remount-ro                 0       1       
UUID=[uuid] /data               vfat    utf8,umask=007,gid=46             0       1
UUID=[uuid] /home               ext4    defaults                          0       2
UUID=[uuid] /home/username/bin  ext4    rw,suid,dev,exec,auto,user,async  0       2
UUID=[uuid] none                swap    sw                                0       0

我的问题是,尽管我能够在这个新分区上读写文件,但我无法运行存储在那里的应用程序。作为普通用户,我总是遇到"permission denied"错误。以root身份(使用sudo),什么都没有发生,这意味着立即回到了命令提示符。这些应用程序应该产生文本输出或打开窗口。其中一些应用程序是二进制文件,一些是脚本。我尝试使用"./program"来启动它们。如果将它们复制回我的主文件夹,我就可以顺利地运行它们。
实际上,我在我的主文件夹的另一个子目录"/home/username/apps"里保存了这些应用程序数月,并且从那里运行它们时没有任何问题。
我应该如何解决这个问题?我做错了什么? :)

1我相信我在答案末尾的编辑将解决你的问题。基本上,听起来bin目录的所有者是root,在第一次挂载后需要更改。 - Marty Fried
6个回答

你可以访问新创建的ext4分区上的文件,但无法运行程序。当你尝试运行时,会出现"Permission denied"错误。这表明有两种可能性,正如reverendj1所提出的suggested
文件可能没有执行权限。要从命令行给文件赋予执行权限,请运行:
chmod +x 文件名 如果您只想给文件的所有者赋予执行权限:
chmod u+x 文件名 要在Nautilus(文件浏览器)中给文件赋予执行权限,请右键单击文件,然后点击“属性”。点击“权限”选项卡。勾选“允许将文件作为程序执行”,然后点击“关闭”。
分区可能已经挂载为noexec。要检查这一点,请运行mount并查看相关条目旁边是否列出了noexec。由于您是从/etc/fstab挂载的,您可以在那里删除noexec
此外,请注意以下事项:
通常情况下,虽然不总是如此,可执行文件应该存储在正常的位置:/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin、/usr/local/sbin、/opt/bin、~/bin。你确定你真的想要在那个驱动器上放置可执行文件吗?你可能需要编辑你的问题,提供更多关于你想要实现的目标的信息。
要从命令行运行位于当前目录中的程序,需要在其相对路径之前加上./:
./program
如果你要启动的是一个.desktop文件而不是一个应用程序,则:
它不需要设置可执行位。
你不应该尝试将其作为脚本或程序来运行,而是像这样使用:
xdg-open application.desktop 如果这些是你使用Wine运行的Windows可执行文件,实际上它们不需要设置可执行位。如果没有设置,你可以右键单击它们并选择使用Wine Windows程序加载器打开,或者通过命令行这样启动它们:
wine program.exe

(我看到这提供了非常类似的建议,所以我决定将其设为社区百科。)


实际上,我想将那个新分区挂载在~/bin下面。:) 我已经相应地修改了我的初始帖子。 - Caspar
@Caspar:希望你的fstab条目不要使用波浪符号作为路径。你应该使用实际的完整路径/home/login-name/bin。 - Marty Fried
我在原帖中添加了我的/etc/fstab。请参见上方。 - Caspar

我解决了。问题出在/etc/fstab中的挂载选项。将它们更改为defaults(相当于将user更改为nouser)即可解决问题,现在一切都按预期工作。

1我正要建议这个;这就是我用来测试并验证我的建议的方法。实际上,我开始加入它了,但我想确保你的选择没有特定的原因。 - Marty Fried
嗯,不知怎么的,我以为让用户挂载那个新分区可能是必要的,因为我将其作为我的home的子文件夹进行挂载。结果证明,我错了。 - Caspar

忽略这个 - 原帖暗示了NTFS,但事实并非如此。
当你挂载一个NTFS分区时,与ext3或ext4不同,它的权限设置仅适用于用户,组和其他人没有任何权限(rwx------)。使用chmod设置权限或使用chown设置所有者只会更改目录的权限,而不会更改目录中的任何内容。
解决方法是在/etc/fstab/中指定正确的参数。我成功使用的参数是这样的(将0000000000000000更改为正确的UUID,并将LOGIN_NAME更改为您的登录名):
UUID=0000000000000000 /home/LOGIN_NAME/bin ntfs-3g auto,users,uid=LOGIN_NAME,gid=LOGIN_NAME,utf8,dmask=002,fmask=113 0 0
这应该全部放在fstab的一行上。
之所以这样做是因为NTFS权限与本机Linux权限不同,因此必须指定某些翻译供Linux使用。
编辑:
抱歉给你带来了困惑。
我相信你可以通过在第一次挂载后更改~/bin目录的所有者来解决这个问题。在bash shell中,输入命令sudo chown LOGIN_NAME:LOGIN_NAME /home/LOGIN_NAME/bin,将LOGIN_NAME更改为你的用户名。
我使用了一个USB驱动器进行了测试,在我的bin目录下成功挂载。唯一的区别是我在fstab中只使用了选项"auto"。

2NTFS确实有一个所有者的概念,而且这个概念和Unix风格文件权限中的所有者概念一样强大。此外,Ubuntu的NTFS驱动程序(ntfs-3g)对本机NTFS权限和所有权提供了完全支持。然而,这是复杂的,并且可能会令人困惑,而默认的挂载选项并没有启用它。你的回答是一个非常合理的方法,也是最常见的方法,但是NTFS权限和UNIX权限一样强大,如果你愿意,你可以在Ubuntu上充分使用它们。 - Eliah Kagan
@EliahKagan:谢谢您的纠正;我猜我记错了原因。我想我曾经读过的解释可能是说它使用ACL,并没有简单的所有者概念或类似的东西。我编辑了我的回答,但也许把它留出来可能也一样好。 - Marty Fried
3该分区是一个ext4分区。 - Caspar
@Caspar:抱歉,原帖让我以为是NTFS格式。我添加了一条编辑,可能会有所帮助。 - Marty Fried
我已经做了那个。 :) - Caspar

我之前也遇到了类似的问题,即使使用sudo命令,甚至在编辑了上述描述的fstab文件后,仍然无法执行存储在NTFS上的shell脚本。
事实证明,我从未创建过挂载点目录。我卸载了该分区,并为该分区创建了挂载点目录:
mkdir /media/Windoze7

然后再次安装上。
sudo mount -a

你需要设置执行权限。从Nautilus(文件浏览器)中,右键点击程序文件,然后选择“权限”选项卡。勾选“允许将文件作为程序执行”的复选框。从终端中,你也可以执行以下操作:
sudo chmod +x /path/to/myfile

另外,请确保在 fstab 中不要指定 noexec 参数,否则将禁用整个分区的执行功能。

执行权限已设置。抱歉,忘记添加这个。 :) - Caspar
2你有检查过在fstab中没有为该分区指定noexec吗? - reverendj1
查看我原始帖子中的 /etc/fstab - Caspar

你尝试过将这个ext4分区挂载到你的家目录之外吗?例如,在/etc/fstab中设置它的条目,类似于这样:
UUID=[uuid] /ext4bins  ext4    rw,suid,dev,exec,auto,user,async  0       2

如果您能够将其挂载到其他地方并执行文件和应用程序,那么您可以采取第二步来实现所需的行为,即通过创建符号链接来从~/bin执行应用程序,方法如下:

ln -s /ext4bins /home/[username]/bin

将[用户名]替换为您自己的用户名,显然。这将使在/ext4bins中挂载的分区看起来像是在/home/[用户名]/bin中挂载的,只要/ext4bins中的文件是可执行的,您也可以通过~/bin来执行它们。例如。
/ext4bins/myscript.sh

将运行与之前相同
~/bin/myscript.sh