Por que quando eu faço o download de um binário da web ele não tem permissões executáveis definidas, mas quando eu uso o gcc para construir um binário ele faz?

5

Por exemplo, se eu tiver o arquivo ola.c que contém apenas:

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

e eu construí no gcc com gcc hello.c -o hello Eu posso então rodar ./hello e ele roda.

No entanto, se eu tentar fazer o download de um binário da Web com, por exemplo, curl , primeiro tenho que definir as permissões com chmod antes de poder executá-lo. Existe uma razão pela qual? O gcc e / ou o curl definem algumas permissões padrão nos arquivos?

    
por user1516425 11.07.2013 / 03:35

4 respostas

9

Como o curl poderia saber que o arquivo é executável? Bem, tecnicamente, ele poderia examinar seu conteúdo, mas está muito além do que o curl deveria fazer.

As permissões padrão são determinadas por umask ( link ) e por cima das permissões derivadas de umask o programa pode adicionar o bit executável (ou usar permissões diferentes). Por exemplo, gcc sabe que está criando arquivos executáveis e, portanto, define o bit exec. Por outro lado, curl não é destinado a criar arquivos executáveis e, portanto, usa apenas os perms padrão.

    
por 11.07.2013 / 03:41
2

Quando você faz o download de um arquivo via HTTP, você recebe apenas o conteúdo do arquivo, não seus metadados, como data de criação, permissões, etc.

Use um protocolo diferente que inclua essa metainformação ou, se você tiver acesso ao servidor, veicule o arquivo em um contêiner que inclua as informações de metadados, como um arquivo tar.

Se essa for uma frustração recorrente, você também pode escrever um wrapper para curl , que tenta adivinhar as permissões corretas e defini-las quando o download terminar (dica: file adivinha os tipos de arquivo).

    
por 11.07.2013 / 07:24
1

Em sistemas unix, se um arquivo é executável ou não depende somente de suas permissões, não de seu nome ou de seu conteúdo. (Se o formato do arquivo não for um executável válido, o sistema tentará executá-lo e tratá-lo como um dos possíveis erros ao executar um programa, juntamente com recursos insuficientes, bibliotecas ausentes, etc.)

A maioria dos arquivos baixados da Web não deve ser executável, portanto, o curl não tenta tornar o arquivo executável. Mesmo que o arquivo tenha sido executado, talvez você não queira executá-lo agora; por exemplo, você pode querer revisá-lo e tornar o arquivo executável apenas se ele passar no seu comentário.

Por outro lado, o gcc ou qualquer outro compilador pretende produzir um programa executável, portanto, não é de surpreender que ele execute as etapas necessárias. Com o gcc, este é um dos últimos estágios do processo de compilação. Você pode observá-lo com strace :

$ strace -f gcc a.c
…
23429 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_i386", "--hash-style=both", "-dynamic-linker", "/lib/ld-linux.so.2", "-z", "relro", "/usr/lib/gcc/i486-linux-gnu/4.3."..., "/usr/lib/gcc/i486-linux-gnu/4.3."..., "/usr/lib/gcc/i486-linux-gnu/4.3."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/usr/lib/gcc/i486-linux-gnu/4."..., "-L/lib/../lib", ...], [/* 82 vars */]) = 0
…
23429 chmod("a.out", 0755)              = 0
23429 exit_group(0)                     = ?
…

Em outras palavras, o linker , que é o último estágio da compilação e produz o executável , altera as permissões no arquivo de saída para que seja executável como sua última etapa.

    
por 12.07.2013 / 00:07
0
  1. "Binário" não é o mesmo que "executável". Designar um arquivo como "binário" é simplesmente uma heurística, o que significa que o conteúdo do arquivo geralmente não será legível por humanos. Designar um arquivo como "executável" significa que ele contém um programa de algum tipo (mesmo em forma não-binária, como um script de shell) que pode ser "executado". Inúmeros formatos binários são simplesmente contêineres de dados.
  2. O arquivo binário produzido pelo seu comando gcc é sempre um arquivo usado principalmente como executável.
  3. Você não pode confiar em arquivos da Internet. Em vez de tentar adivinhar se um arquivo deve ser executável, o que é impossível, já que até mesmo a prosa pode ser usada como shell scripts, curl e outros programas basta aplicar o umask e deixar qualquer gun.shoot(self.foot) para o usuário.
por 12.07.2013 / 00:14