porque o terminal ubuntu touch não pode executar o aplicativo

6

meu telefone buntu é nexus 4. O seguinte código não está sendo executado.

Código

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

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

Compile

$ arm-linux-gnueabihf-g++ -static -o hello main.c
  • copio arquivos para o diretório /home/phablet/Downloads
  • Terminal de telefone do ubuntu aberto,
  • Modificar atributos de arquivo ( chmod a+x ./hello )
  • execute ./hello

mas o prompt do telefone do Ubuntu dá o seguinte erro

./hello permission denied

por quê?

    
por suer 03.12.2014 / 03:56

1 resposta

6

Eu percebi algo. O motivo pelo qual você não pode executar binários a partir do seu diretório pessoal é que o perfil apparmor do terminal o impede. Se você olhar a saída do dmesg depois de tentar rodar um binário, você verá algo como isto:

[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

O que apenas lhe diz que o apparmor negou ao terminal para rodar o seu programa, e entre outras coisas ele lhe diz o nome do perfil do apparmor (com.ubuntu.terminal_terminal_0.7.70) do terminal. Para permitir a execução de binários arbitrários, precisamos alterar esse perfil.

Agora, normalmente você encontraria perfis apparmor em /etc/apparmor.d mas isso nem sempre é o caso do telefone ubuntu. Parece que especialmente pacotes de cliques (dos quais o terminal é um deles) fazem suas próprias coisas e colocam arquivos em lugares diferentes. Eu encontrei vários locais para o perfil do terminal apparmor e o correto para editar parece ser:

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

Deve haver uma seção como esta:

# 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,

Que já deve permitir que praticamente tudo seja executado em / home, se eu entendi corretamente. O comentário parece implicar o mesmo. Ainda assim, por razões que me escapam, não funciona. Então, para que isso funcione, basta remover (ou comentar) toda esta seção e substituí-la por:

/** pix,

Isso deve permitir que o aplicativo terminal execute sempre tudo, de qualquer lugar. Depois reinicie o apparmor:

sudo service apparmor restart

e você deve ser bom para ir.

    
por rakete 09.05.2015 / 17:18