为什么 ubuntu touch 终端无法执行应用程序

为什么 ubuntu touch 终端无法执行应用程序

我的buntu手机是nexus 4。以下代码未被执行。

代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hello world!\n");
    return 0;
}

编译

$ arm-linux-gnueabihf-g++ -static -o hello main.c
  • 我将文件复制到/home/phablet/Downloads目录
  • 打开 ubuntu 手机终端,
  • 修改文件属性(chmod a+x ./hello
  • 执行./hello

但ubuntu手机提示如下错误

./hello permission denied

为什么?

答案1

我找到了解决办法。您无法从主目录运行二进制文件的原因是终端的 apparmor 配置文件阻止了它。如果您在尝试运行二进制文件后查看 dmesg 输出,您应该会看到类似以下内容:

[140792.471956] type=1400 audit(1431182253.050:175): apparmor="DENIED" operation="exec" profile="com.ubuntu.terminal_terminal_0.7.70" name="/home/phablet/apps/git/usr/bin/git" pid=28134 comm="bash" requested_mask="x" denied_mask="x" fsuid=32011 ouid=32011

它只是告诉你 apparmor 拒绝终端运行你的程序,除此之外,它还告诉你终端的 apparmor 配置文件名称 (com.ubuntu.terminal_terminal_0.7.70)。要允许运行任意二进制文件,我们需要更改该配置文件。

现在,您通常会在 /etc/apparmor.d 下找到 apparmor 配置文件,但在 ubuntu 手机上并非总是如此。似乎特别是点击包(终端是其中之一)会自行处理并将文件放在不同位置。我找到了终端 apparmor 配置文件的多个位置,正确的编辑位置似乎是:

sudo vi /var/lib/apparmor/profiles/click_com.ubuntu.terminal_terminal_0.7.70

应该有这样的部分:

# autopilot runs things in out of ~/autopilot/fakeenv, so lets allow running
# things pretty much everywhere but avoid exec conflicts with the autopilot
# include file which has this rule:
# owner @{HOMEDIRS}/autopilot/fakeenv/*/.local/share/@{APP_PKGNAME}/** mrwklix,
/[^h]** pix,
/[^h][^o][^m][^e]** pix,
@{HOMEDIRS}/*/autopilot/[^f][^a][^k][^e]*/** pix,

如果我理解正确的话,这应该已经允许在 /home 下执行几乎所有操作。注释似乎暗示了同样的意思。然而,由于我无法理解的原因,它不起作用。因此,要使其正常工作,您只需删除(或注释掉)整个部分并将其替换为:

/** pix,

这应该允许终端应用程序始终从任何地方运行所有内容。之后重新启动 apparmor:

sudo service apparmor restart

你就可以走了。

相关内容