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

25

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

Ashfame
fonte

Respostas:

24

Digamos que você tenha o arquivo que myscriptcontém o seguinte:

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

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

/bin/bash myscript

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

Portanto, para que o bash (ou qualquer outro interpretador que seu script exija) "execute" o script, ele precisa apenas ler o arquivo.

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

Geirha
fonte
Obrigado por explicar em detalhes. :) Se eu entendi direito, qualquer acesso de usuário ao bash só precisa de acesso de leitura ao script para executá-lo, porque o bash tomará o script como entrada e precisará apenas lê-lo. Eu posso interromper esse comportamento, obtendo a permissão de leitura do script para esse usuário. Direita? Então, quando essa permissão executável é usada e exatamente importa?
Ashfame
Sim, se você usar "bash myscript", o usuário precisará apenas de acesso de leitura para "myscript" (e, é claro, executável para / bin / bash se o bash estiver no caminho). No entanto, se você tornar seu script executável, as coisas serão um pouco diferentes. É verdade que, do ponto de vista do kernel, será "/ bin / bash myscript" novamente se a primeira linha for #! / Bin / bash, mas para atingir esse ponto, primeiro você precisa apresentar o script como executável para o usuário ou grupo. No entanto, isso é verdade, se por algum usuário do script não é executável, mas legível, ele (a) ainda pode "correr" o script com "myscript bash" ....
LGB
@LGB Então isso é praticamente inútil. O bom é cortar a permissão de leitura de um usuário para esse script. Direita?
Ashfame
@ Ashfame: eu diria útil em vez de inútil. O bit de execução em arquivos regulares não é (e nunca foi destinado a ser) para limitar o acesso. Parece que você está esperando isso. Se você tem um executável binário, deve ter permissão de execução para executá-lo. No entanto, se você tiver acesso de leitura, sempre poderá copiar o arquivo para o seu próprio diretório pessoal; nesse caso, a cópia pertencerá a você, para que você possa adicionar permissão de execução a ele ... e executá-lo. Para diretórios, porém, ele tem um propósito um pouco diferente. Veja mywiki.wooledge.org/Permissions
geirha
1
O que devo usar em vez de / bin / bash se não souber o intérprete correto? Existe um comando que executa o script de acordo com a linha shebang?
Aivar
16

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

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

sh file.sh

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

As 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 se você executar 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 também podem "executar" o código lendo o conteúdo do arquivo, o que ignora as permissões do sistema de arquivos em "execute".

Lekensteyn
fonte
Eu entendo o seu ponto. Mas então é para grupo ou mundo ou ambos?
Ashfame 10/02
@Ashfame Se você definir a permissão executável, o script poderá ser executado diretamente por usuários que tenham essa permissão - independentemente de eles terem um grupo, mundo ou proprietário. Mas mesmo as pessoas sem permissão de execução podem executá-lo chamando um programa diferente (como bash) para executar a execução - para bloquear que você também teria que tirar a readpermissão deles .
Jg-faustus
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisMas como a permissão é concedida a diferentes usuários, verificando a permissão executável? E eu entendi o seu segundo ponto. Você quer dizer retirar a permissão de leitura do script para que eles nem sequer possam processá-lo através do bash. Direita?
Ashfame 10/02
@ Ashshame No ponto de permissão de leitura, sim. Em como, você chamaria algo como sudo chmod g+x myfile.shno terminal para adicionar permissões de execução ao grupo do arquivo. Consulte o tutorial de permissões de arquivo . Para gerenciar permissões para vários usuários simultaneamente, você usaria grupos, consulte, por exemplo, Gerenciando grupos .
jg-Fausto
o que eu quis dizer foi quando adicionamos a permissão executável na GUI, então é para quem? proprietário / grupo / mundo?
Ashfame 10/02
1

Não pense nisso dessa maneira. Posso executar este arquivo? Pense nisso da seguinte maneira: 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.

myusuf3
fonte
Sim, eu sei sobre eles. Isso significa que eu (proprietário) sempre posso executá-lo. Direita? Em seguida, definir um arquivo como executável é para o grupo ou mundo ou ambos?
Ashfame
1

O execsyscall do kernel do Linux falha EACCESse o arquivo não for executável

Enquanto você pode fazer sh myprog.sh(que apenas lê os arquivos e interpreta), tentar executar o programa como ./myprog.shnão pode funcionar, desde quando você faz isso:

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.shnão for executável,main falha com:

execve: Permission denied
13
13

Testado no Ubuntu 17.10 gcc -std=c99,.

O 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 do caminho do novo arquivo de imagem de processo ou o novo arquivo de imagem de processo nega a permissão de execução.

Uma justificativa adicional pode ser encontrada em: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Ciro Santilli adicionou uma nova foto
fonte