Os scripts podem ser executados mesmo quando não estão definidos como executáveis?

16

Eu posso executar scripts (.sh) com e sem que eles sejam definidos como executáveis. Então, onde exatamente isso importa?

    
por Ashfame 10.02.2011 / 19:27

4 respostas

16

Digamos que você tenha o arquivo myscript contendo o seguinte:

#!/bin/bash
echo "Hello, World!"

Se você tornar este arquivo executável e executá-lo com ./myscript , o kernel verá que os dois primeiros bytes são #! , o que significa que é um arquivo de script. O kernel usará o resto da linha como o interpretador e passará o arquivo como seu primeiro argumento. Então, é executado:

/bin/bash myscript

e o bash lê o arquivo e executa os comandos que ele contém.

Assim, para o bash (ou qualquer intérprete que seu script exija) para "executar" o script, ele só precisa ser capaz de ler o arquivo.

Assim, para scripts, o bit de execução apenas torna um pouco mais conveniente executá-lo. Enquanto o bash é executável, você sempre pode executar o bash com o arquivo de script como argumento, ou executar bash interativamente e copiar e colar o script linha por linha em seu terminal para que os comandos sejam executados.

    
por geirha 10.02.2011 / 20:03
12

Verifique se você não está confundindo "executando o script de shell" com "executar um script de shell usando sh".

Isso não será afetado pelas permissões de arquivo em file.sh :

sh file.sh

Você está executando sh (que resolve para o programa /bin/sh ), que lê file.sh e executa seu código.

Permissões de arquivo terão efeito se você realmente executar o próprio script :

./file.sh

Observe que as permissões de arquivo não são suportadas por sistemas de arquivos não-Linux, como o FAT. Portanto, mesmo que você execute chmod -x file.sh , o arquivo ainda terá suas permissões anteriores.

A permissão de execução é imposta pelo sistema de arquivos. Mas os programas podem "executar" o código também lendo o conteúdo do arquivo, o que ignora as permissões do sistema de arquivos em "executar".

    
por Lekensteyn 10.02.2011 / 20:01
1

Não pense nisso do jeito que Posso executar este arquivo? Pense nisso da seguinte forma: Quem pode executar este arquivo?

Se o computador é seu e o arquivo é seu, tenho certeza que você pode executá-lo. Você pode querer procurar mais em comandos como chmod e chown e permissões de arquivo.

Espero que ajude.

    
por myusuf3 10.02.2011 / 19:49
0

O exec syscall do kernel do Linux falha com EACCES se o arquivo não for executável

Enquanto você pode fazer sh myprog.sh , tentando executar o programa como ./myprog.sh não pode funcionar, desde quando você faz isso:

  • Bash usa a chamada do sistema exec em ./myprog.sh
  • os shebangs são interpretados diretamente pela chamada de sistema exec do kernel do Linux, conforme explicado em: link
  • o kernel do Linux se recusa a executar arquivos sem permissão executável

Isso pode ser verificado com main.c :

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

e myprog.sh :

#!/bin/sh
echo worked

Se myprog.sh não for executável, main falhará com:

execve: Permission denied
13
13

Testado no Ubuntu 17.10, gcc -std=c99 .

POSIX 7 menciona que em:

  

As funções exec, exceto fexecve (), falharão se:

     

[EACCES]   A permissão de pesquisa é negada para um diretório listado no prefixo de caminho do novo arquivo de imagem de processo ou o novo arquivo de imagem de processo nega a permissão de execução.

Outras razões podem ser encontradas em: link

    

Tags