私のbuntu電話はネクサス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
ディレクトリにコピーしますchmod a+x ./hello
)./hello
しかし、ubuntu phoneプロンプトは次のエラーを出します
./hello permission denied
どうして?
私は何かを考え出した。ホームディレクトリからバイナリを実行できない理由は、ターミナルの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の電話では常にそうではありません。特にクリックパッケージ(ターミナルの1つ)は独自の処理を行い、ファイルを別の場所に配置するようです。端末の装甲プロファイルの複数の場所を見つけましたが、編集する正しい場所は次のようです:
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
そしてあなたは行ってもいいはずです。