tornando um script bash executável programaticamente


12

Preciso criar um script bash para criar e montar uma unidade. Então, dois comandos simples. Ambos "funcionam" quando inseridos na linha de comando.

O script é criado e executado toda vez que um usuário normal efetua login, portanto, preciso de um método para tornar esse script executável naquele momento. Até agora, não consigo fazer isso funcionar. Por exemplo, a primeira parte mkdir /vvv/ggggnão prossegue porque o script não é executável (suponho).

Espero que isso faça sentido. Isso é possível? Quaisquer pensamentos sobre como fazer esse trabalho serão apreciados.

Atualização :

Obrigado por suas respostas. Provavelmente devo adicionar algumas informações adicionais, além de que sou novo no Linux.

Estou usando um aplicativo de desktop virtual de código aberto chamado Ulteo. Este aplicativo é executado em cima do Ubuntu e tem muito pouco suporte - é por isso que estou aqui. Basicamente, estou aprendendo pelo fogo.

Portanto, o aplicativo possui uma função de gerenciamento de script de login, na qual eu posso vincular um script a um usuário. Um script simples do Windows com net use funciona perfeitamente. No entanto, quando tento aplicar um script de bash do Linux, nada acontece.

Eu estou pensando que, porque eu preciso executar um chmod +xcontra o script primeiro para tornar o script executável, é por isso que está falhando. A propósito, Ulteo corre em uma prisão chroot. Eu criei um script, salvei e não consegui encontrar o script. Eu procurei dentro e fora da cadeia de chroot.

Eu gosto da abordagem do dan08 para que o script inicial faça referência a outro script que eu possa encontrar e tornar executável manualmente. Eu teria o mesmo problema?

Essas informações adicionais esclarecem a situação? Desde já, obrigado.

Fotos em anexo.

! [console de gerenciamento de scipt de login] [1]

! [scripts do Windows que funcionam] [2]

! [script linux simples que não funciona] [3]

Desculpe, ainda não posso postar imagens


Você vai escrever um trabalho cron para executar o script toda vez que um usuário estiver conectado? Este guia também deve ajudá-lo a torná-los executáveis .
Sleep Deprived Bulbasaur

1
"O script é criado e executado toda vez que um usuário normal registra" por quê? Eu consertaria isso, pois parece ilógico para mim. Eu alimentaria o script como usuário e deixaria o script intocado após a criação.
Rinzwind 9/09/14

1
Há uma estranha mistura de tempos na pergunta que me deixa confusa sobre o que atualmente acontece e o que você gostaria que fizesse. Ajudaria se você pudesse ser um pouco mais específico sobre qual é a situação atual.
Oli

Por favor edite sua pergunta e nos mostrar o script. Também nos mostra a saída de ls -l scriptname. Você também deve esclarecer como exatamente o script é criado e por que não o cria apenas uma vez e o deixa em paz. Por fim, seu usuário normal não deve ter acesso de gravação /vare, portanto, não pode criar diretórios lá.
terdon 9/09/14

1
Poste os links da imagem nos comentários. Nós os importaremos por meio de edições (sugeridas).
muru 9/09/14

Respostas:


19

Há duas coisas que você precisa fazer:

  1. Faça referência ao interpretador de script no início do script:

    #!/bin/bash
  2. Defina as permissões para torná-lo executável:

    chmod +x myscript.sh

3

Em vez de tornar seu script executável, você pode adotar uma abordagem diferente e alterar a maneira como chama o script.

script.sh é suficiente para executar um script executável.

Contudo

É possível executar um script não executável se você especificar o programa para executá-lo.

Portanto, /bin/bash script.shou bash script.shou python script.pytodos executarão scripts não executáveis.

Portanto, minha sugestão seria editar a maneira como o script é chamado e especificar o binário usado para executá-lo.


Do meu lado, costumo torná-los substituíveis, porque se você não fizer isso, não poderá reiniciar o arquivo por si mesmo. Como exemplo, o python os.execv(__file__, sys.argv)não funcionaria e, com certeza, há mais situações como essa. Se a segurança é um objetivo, use-o a partir do root / sudo, em vez disso, permita que os usuários executem binários. Além disso, se o objetivo é segurança, você não deseja que eles executem scripts, porque você pode prejudicar o sistema de qualquer maneira ... executável ou não. Portanto, não vejo por que é importante evitar torná-los executáveis.
M3nda

0

Crie um programa em C, C ++ ou Python etc. e use o comando do sistema para executar o script bash.

Por exemplo, um programa em C se pareceria com:

#include "stdio.h"
int main(int argc, char const *argv[])
{
    system('chmod +x path/yourbashscript.sh');
    system('path/yourbashscript.sh');
    return 0;
}

Para executar o programa na inicialização, adicione-o à lista de programas de inicialização. Abra Aplicativos de inicialização no seu painel e adicione o executável compilado à lista clicando no botão Adicionar.


2
-1: Esta não é realmente uma resposta. Por que python seria melhor do que um shell script? Muito menos C! De qualquer forma, você não está realmente mostrando como esse programa seria e não está explicando como adicionar um programa à lista de programas de inicialização.
terdon 9/09/14

A resposta à sua primeira pergunta pode ser dada por explicar como uma linguagem de programação é diferente de uma linguagem de script como para o resto Eu editei a minha resposta
akxer

Obrigado pela edição, -1 removida. No entanto, o uso de um programa C para iniciar um script de shell no Linux é completamente desnecessário e adiciona sobrecarga desnecessária. Por que não adicionar o próprio script aos aplicativos de inicialização? Ou, se você realmente deseja usar C, por que não implementá-lo diretamente? Criar um wrapper em C que chame um shell script no Linux não faz sentido, a menos que você precise que o script seja executado com o conjunto de bits SUID. Mesmo nesse caso, geralmente existem soluções mais simples.
terdon 9/09/14

1
-1: isso ainda falharia se o script não tivesse permissões de execução. Você teria que ligar bash path/yourbashscript.sh.
muru 9/09/14

1
O que levanta a questão: por que não executar bash path/yourbashscript.shdiretamente em vez de compilar e executar este programa em C?
muru 9/09/14

0

Você pode tornar seu script bash executando o seguinte na linha de comando.

cd ~/path/to/file
chmod +x nameoffile.sh

Em seguida, executá-lo na inicialização pode ser feito adicionando-o à sua lista de programas de inicialização, como @akabhirav disse.


Parece-me que a pergunta (de certa forma) mostra que ele está familiarizado com o chmod. Mas ele está pedindo um método para torná-lo executável a partir do próprio script (para que ele não precise fazer isso manualmente). Embora eu ainda questione o método: recriar um script rapidamente não é a maneira de fazer isso.
Rinzwind 9/09/14

0

SHC é um compilador de script de shell genérico. É necessário um script, que é especificado na linha de comando e produz código-fonte C. O código fonte gerado é então compilado e vinculado para produzir um binário separado.

O binário compilado ainda será dependente do shell especificado na primeira linha do código do shell (o shebang: #!/bin/shou tal), portanto, o SHC não cria binários completamente independentes.

O próprio SHC não é um compilador como cc. Em vez disso, codifica e criptografa um script de shell e gera código-fonte C com o recurso de expiração adicionado. Em seguida, ele usa o compilador do sistema para compilar um binário separado que se comporta exatamente como o script original. Após a execução, o binário compilado descriptografará e executará o código com a -copção do shell .


Qual o sentido disso se o executável ainda exigir o ambiente de shell original? Como isso é melhor do que apenas adicionar um #!e chmod +x?
Xiota
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.