sue*_*uer 7 command-line ubuntu-touch
我的 buntu 手机是 nexus 4。下面的代码没有被执行。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Hello world!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
$ arm-linux-gnueabihf-g++ -static -o hello main.c
Run Code Online (Sandbox Code Playgroud)
/home/phablet/Downloads目录chmod a+x ./hello)./hello但是ubuntu手机提示出现以下错误
./hello permission denied
Run Code Online (Sandbox Code Playgroud)
为什么?
我想通了一些。您无法从主目录运行二进制文件的原因是终端的 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
Run Code Online (Sandbox Code Playgroud)
这只是告诉您 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
Run Code Online (Sandbox Code Playgroud)
应该有一个这样的部分:
# 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,
Run Code Online (Sandbox Code Playgroud)
如果我理解正确的话,这应该已经允许在 /home 下执行几乎所有内容。评论似乎暗示相同。尽管如此,由于我无法理解的原因,它不起作用。因此,要使其正常工作,您只需删除(或注释掉)整个部分并将其替换为:
/** pix,
Run Code Online (Sandbox Code Playgroud)
这应该允许终端应用程序始终从任何地方运行所有内容。然后重启apparmor:
sudo service apparmor restart
Run Code Online (Sandbox Code Playgroud)
你应该很高兴去。