faire un script bash exécutable par programmation

12

J'ai besoin de créer un script bash pour créer et monter un lecteur. Donc, deux commandes simples. Les deux "fonctionnent" lorsqu'ils sont entrés sur la ligne de commande.

Le script est créé et exécuté chaque fois qu'un utilisateur normal se connecte, j'ai donc besoin d'une méthode pour rendre ce script exécutable à ce moment-là. Jusqu'à présent, je ne peux pas faire fonctionner cela. Par exemple, la première partie mkdir /vvv/ggggne se déroule pas car le script n'est pas exécutable (je suppose).

J'espère que cela a du sens. Est-ce possible? Toute réflexion sur la façon de faire ce travail sera appréciée.

Mise à jour :

Merci pour vos réponses. Je devrais probablement ajouter des informations supplémentaires à part le fait que je suis nouveau sous Linux.

J'utilise une application de bureau virtuel open source appelée Ulteo. Cette application fonctionne sur Ubuntu et a très peu de support - c'est pourquoi je suis ici. En gros, j'apprends par le feu.

Ainsi, l'application a une fonction de gestion de script de connexion où je peux lier un script à un utilisateur. Un simple script Windows avec une utilisation nette fonctionne parfaitement. Cependant, lorsque j'essaie d'appliquer un script bash Linux, rien ne se passe.

Je pense que parce que je dois d'abord effectuer une chmod +xcontre le script pour rendre le script exécutable, c'est pourquoi son échec. Soit dit en passant, Ulteo s'exécute dans une prison chroot. J'ai créé un script, je l'ai enregistré et je n'ai pas pu trouver le script. J'ai fouillé à l'intérieur et à l'extérieur de la prison chroot.

J'aime l'approche de dan08 pour que le script initial fasse référence à un autre script que je peux trouver et rendre exécutable manuellement. Serais-je confronté au même problème?

Ces informations supplémentaires clarifient-elles la situation? Merci d'avance.

Photos jointes.

! [console de gestion de scipt de connexion] [1]

! [scripts Windows qui fonctionnent] [2]

! [script linux simple qui ne fonctionne pas] [3]

Désolé, je ne peux pas encore publier d'images

HIlton Dynamics
la source
Allez-vous écrire un travail cron pour exécuter le script chaque fois qu'un utilisateur est connecté? Ce guide devrait également vous aider à les rendre exécutables .
Bulbasaur privé de sommeil le
1
"Le script est créé et exécuté à chaque fois qu'un utilisateur normal se connecte" pourquoi? Je réglerais cela car cela me semble contraire à la logique. Je voudrais alimenter le script en tant qu'utilisateur et laisser le script intact après sa création.
Rinzwind
1
Il y a un étrange mélange de temps dans la question qui me laisse perplexe sur ce qui se passe actuellement et ce que vous aimeriez qu'il fasse. Il serait utile que vous soyez un peu plus précis sur la situation actuelle.
Oli
Veuillez modifier votre question et nous montrer le script. Montrez-nous également la sortie de ls -l scriptname. Vous devez également clarifier comment exactement le script est créé et pourquoi vous ne le créez pas une seule fois et ne le laissez pas. Enfin, votre utilisateur normal ne devrait pas avoir accès en écriture à /varet ne devrait donc pas pouvoir y créer de répertoires.
terdon
1
Postez les liens de l'image dans les commentaires. Nous les importons via des modifications (suggérées).
muru

Réponses:

19

Il y a deux choses que vous devez faire:

  1. Référencez l'interpréteur de script au début du script:

    #!/bin/bash
  2. Définissez les autorisations pour le rendre exécutable:

    chmod +x myscript.sh
Ed Manet
la source
3

Plutôt que de rendre votre script exécutable, vous pouvez adopter une approche différente et changer la façon dont vous appelez le script.

script.sh est suffisant pour exécuter un script exécutable.

pourtant

Il est possible d'exécuter un script non exécutable si vous spécifiez le programme pour l'exécuter.

Donc, /bin/bash script.shou bash script.shou python script.pyexécuteront tous des scripts non exécutables.

Donc, ma suggestion serait de modifier la façon dont le script est appelé et de spécifier le binaire utilisé pour l'exécuter.

Dan
la source
De mon côté, je les rend généralement excutables, car si vous ne le faites pas, vous ne pouvez pas relancer le fichier à partir de lui-même. Par exemple, python os.execv(__file__, sys.argv)ne fonctionnerait pas, et c'est sûr qu'il y a plus de situations comme ça. Si la sécurité est un objectif, utilisez-la simplement à partir de root / sudo et laissez plutôt les utilisateurs exécuter des binaires. De plus, si l'objectif est la sécurité, vous ne voulez pas qu'ils puissent exécuter des scripts, car vous pouvez de toute façon endommager le système ... exécutable ou non. Je ne vois donc pas pourquoi il est important d'éviter d'en faire des exécutables.
m3nda
0

Créez un programme en C, C ++ ou Python etc. et utilisez la commande système pour exécuter le script bash.

Par exemple, un programme C ressemblerait à:

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

Pour exécuter le programme au démarrage, ajoutez-le à la liste des programmes de démarrage. Ouvrez les applications de démarrage à partir de votre tableau de bord et ajoutez l'exécutable compilé à la liste en cliquant sur le bouton Ajouter.

akxer
la source
2
-1: Ce n'est pas vraiment une réponse. Pourquoi python serait-il meilleur qu'un script shell? Encore moins C! Dans tous les cas, vous ne montrez pas à quoi ressemblerait ce programme et vous n'expliquez pas comment ajouter un programme à la liste des programmes de démarrage.
terdon
La réponse à votre première question peut être donnée en expliquant en quoi un langage de programmation est différent d'un langage de script comme pour le reste j'ai édité ma réponse
akxer
Merci pour la modification, -1 supprimé. Cependant, l'utilisation d'un programme C pour lancer un script shell sur Linux est complètement inutile et ajoute une surcharge inutile. Pourquoi ne pas simplement ajouter le script lui-même aux applications de démarrage? Ou, si vous voulez vraiment utiliser C, pourquoi ne pas l'implémenter directement? La création d'un wrapper en C qui appelle un script shell sous Linux n'a aucun sens, sauf si vous avez besoin que le script soit exécuté avec le jeu de bits SUID. Même dans ce cas, il existe généralement des solutions plus simples.
terdon
1
-1: Cela échouerait toujours si le script n'avait pas les autorisations d'exécution. Il faudrait que tu appelles bash path/yourbashscript.sh.
muru
1
Ce qui pose la question, pourquoi ne pas s'exécuter bash path/yourbashscript.shdirectement au lieu de compiler et d'exécuter ce programme C?
muru
0

Vous pouvez rendre votre script bash exécutable en exécutant ce qui suit dans la ligne de commande.

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

Ensuite, le faire exécuter au démarrage peut être fait en l'ajoutant à votre liste de programmes de démarrage comme l'a dit @akabhirav.

LanceLafontaine
la source
Il me semble que la question (quelque peu) montre qu'il est familier avec la façon de chmod. Mais il demande une méthode pour le rendre exécutable à partir du script lui-même (il n'a donc pas à le faire manuellement). Bien que je remette toujours en question la méthode: recréer un script à la volée n'est pas le moyen de le faire.
Rinzwind
0

SHC est un compilateur de script shell générique. Il prend un script, qui est spécifié sur la ligne de commande et produit du code source C. Le code source généré est ensuite compilé et lié pour produire un binaire supprimé.

Le binaire compilé dépendra toujours du shell spécifié dans la première ligne du code shell (le shebang: #!/bin/shou tel), donc SHC ne crée pas de binaires complètement indépendants.

SHC lui-même n'est pas un compilateur tel que cc. Encode et chiffre plutôt un script shell et génère du code source C avec la capacité d'expiration supplémentaire. Il utilise ensuite le compilateur système pour compiler un binaire dépouillé qui se comporte exactement comme le script d'origine. Lors de l'exécution, le binaire compilé décryptera et exécutera le code avec l' -coption du shell .

Jhosman
la source
À quoi cela sert-il si l'exécutable nécessite toujours l'environnement shell d'origine? Comment est-ce mieux que d'ajouter simplement un #!et chmod +x?
xiota