rendere programmabile uno script bash


12

Ho bisogno di creare uno script bash per creare e montare un'unità. Quindi, due semplici comandi. Entrambi "funzionano" quando inseriti nella riga di comando.

Lo script viene creato ed eseguito ogni volta che un utente normale accede, quindi ho bisogno di un metodo per renderlo eseguibile in quel momento. Finora, non riesco a farlo funzionare. Ad esempio, la prima parte mkdir /vvv/ggggnon procede perché lo script non è eseguibile (immagino).

Spero che abbia senso. È possibile? Qualsiasi pensiero su come realizzare questo lavoro sarà apprezzato.

Aggiornamento :

Grazie per le tue risposte Probabilmente dovrei aggiungere alcune informazioni aggiuntive oltre a ciò che sono nuovo su Linux.

Sto usando un'applicazione desktop virtuale open source chiamata Ulteo. Questa App funziona su Ubuntu e ha pochissimo supporto - ecco perché sono qui. Fondamentalmente, sto imparando col fuoco.

Quindi, l'applicazione ha una funzione di gestione degli script di accesso in cui posso legare uno script a un utente. Un semplice script di Windows con utilizzo della rete funziona perfettamente. Tuttavia, quando provo ad applicare uno script bash Linux non succede nulla.

Sto pensando che, poiché ho bisogno di eseguire prima uno chmod +xscript per renderlo eseguibile, è per questo che non riesce. A proposito, Ulteo corre in una prigione chroot. Ho creato uno script, l'ho salvato e non sono riuscito a trovare lo script. Ho cercato sia all'interno che all'esterno della prigione chroot.

Mi piace l'approccio di dan08 per fare in modo che lo script iniziale faccia riferimento a un altro script che posso trovare e rendere eseguibile manualmente. Incontrerei lo stesso problema?

Queste informazioni aggiuntive chiariscono la situazione? Grazie in anticipo.

Foto allegate.

! [login scipt management console] [1]

! [script di Windows che funzionano] [2]

! [semplice script Linux che non funziona] [3]

Spiacenti, non riesco ancora a pubblicare immagini


Scriverai un lavoro cron per eseguire lo script ogni volta che un utente accede? Questa guida dovrebbe aiutarti anche a renderli eseguibili .
Sonno depresso Bulbasaur

1
"Lo script viene creato ed eseguito ogni volta che un normale utente registra" perché? Vorrei risolvere il problema poiché non mi sembra logico. Vorrei alimentare l'utente come parametro e lasciare lo script intatto dopo la creazione.
Rinzwind,

1
C'è uno strano mix di tempi nella domanda che mi lascia confuso su ciò che accade attualmente e cosa ti piacerebbe che facesse. Sarebbe utile se potessi essere un po 'più specifico su quale sia la situazione attuale.
Oli

Si prega di modificare la tua domanda e ci mostrano lo script. Mostraci anche l'output di ls -l scriptname. Dovresti anche chiarire come viene creato esattamente lo script e perché non lo crei solo una volta e lo lasci in pace. Infine, l'utente normale non dovrebbe avere accesso in scrittura /vare quindi non dovrebbe essere in grado di creare directory lì.
terdon,

1
Pubblica i link immagine nei commenti. Li importeremo tramite modifiche (suggerite).
muru,

Risposte:


19

Ci sono due cose che devi fare:

  1. Fai riferimento all'interprete di script all'inizio dello script:

    #!/bin/bash
  2. Imposta le autorizzazioni per renderlo eseguibile:

    chmod +x myscript.sh

3

Invece di rendere eseguibile lo script, è possibile adottare un approccio diverso e modificare il modo in cui lo si chiama.

script.sh è sufficiente per eseguire uno script eseguibile.

tuttavia

È possibile eseguire uno script non discutibile se si specifica il programma per eseguirlo.

Così /bin/bash script.sho bash script.sho python script.pyeseguiranno tutti script non eseguibili.

Quindi il mio suggerimento sarebbe di modificare il modo in cui viene chiamato lo script e specificare il binario utilizzato per eseguirlo.


Da parte mia di solito li rendo stimabili, perché se non lo fai non puoi riavviare il file da solo. Ad esempio, Python os.execv(__file__, sys.argv)non funzionerebbe e sicuramente ci sono più situazioni del genere. Se la sicurezza è un obiettivo, basta usarlo da root / sudo invece consentire agli utenti di eseguire binari. Inoltre, se l'obiettivo è la sicurezza, non vuoi che siano in grado di eseguire script, perché puoi comunque danneggiare il sistema ... eseguibile o no. Quindi non vedo perché è importante evitare di renderli eseguibili.
m3nda,

0

Crea un programma in C, C ++ o Python ecc. E usa il comando di sistema per eseguire lo script bash.

Ad esempio, un programma C sarebbe simile a:

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

Per eseguire il programma all'avvio aggiungerlo all'elenco dei programmi di avvio. Apri Startup Applications dal tuo trattino e aggiungi l'eseguibile compilato all'elenco facendo clic sul pulsante Aggiungi.


2
-1: questa non è davvero una risposta. Perché Python sarebbe meglio di uno script di shell? Figuriamoci C! In ogni caso, non stai effettivamente mostrando come sarebbe questo programma e non stai spiegando come aggiungere un programma all'elenco dei programmi di avvio.
terdon,

La risposta alla tua prima domanda può essere data spiegando in che modo un linguaggio di programmazione è diverso da un linguaggio di scripting come per il resto ho modificato la mia risposta
akxer

Grazie per la modifica, -1 rimosso. Tuttavia, l'utilizzo di un programma C per avviare uno script di shell su Linux è completamente inutile e aggiunge inutili spese generali. Perché non aggiungere semplicemente lo script stesso alle applicazioni di avvio? Oppure, se vuoi davvero usare C perché non implementarlo direttamente? La creazione di un wrapper in C che chiama uno script di shell in Linux non ha alcun senso a meno che non sia necessario eseguire lo script con il set di bit SUID. Anche in quel caso, di solito ci sono soluzioni più semplici.
terdon,

1
-1: Ciò non riuscirebbe comunque se lo script non avesse le autorizzazioni di esecuzione. Dovresti chiamare bash path/yourbashscript.sh.
muru,

1
Il che solleva la domanda, perché non eseguire bash path/yourbashscript.shdirettamente invece di compilare ed eseguire questo programma C?
muru,

0

Puoi rendere eseguibile il tuo script bash eseguendo quanto segue nella riga di comando.

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

Quindi, eseguirlo all'avvio può essere fatto aggiungendolo al tuo elenco di programmi di avvio come ha detto @akabhirav.


Mi sembra che la domanda (in qualche modo) mostri che ha familiarità con il modo di chmod. Ma sta chiedendo un metodo per renderlo eseguibile all'interno dello script stesso (quindi non deve farlo manualmente). Anche se continuo a mettere in discussione il metodo: ricreare una sceneggiatura al volo non è il modo per farlo.
Rinzwind,

0

SHC è un compilatore di script shell generico. Prende uno script, che è specificato nella riga di comando e produce il codice sorgente C. Il codice sorgente generato viene quindi compilato e collegato per produrre un file binario rimosso.

Il binario compilato dipenderà comunque dalla shell specificata nella prima riga del codice della shell (lo shebang: #!/bin/sho simile), quindi SHC non crea binari completamente indipendenti.

SHC stesso non è un compilatore come cc. Piuttosto codifica e crittografa uno script di shell e genera codice sorgente C con la possibilità di scadenza aggiunta. Quindi utilizza il compilatore di sistema per compilare un binario messo a nudo che si comporta esattamente come lo script originale. Al momento dell'esecuzione, il file binario compilato decodificherà ed eseguirà il codice con l' -copzione della shell .


Qual è il punto di ciò se l'eseguibile richiede ancora l'ambiente shell originale? In che modo è meglio che aggiungere semplicemente un #!e chmod +x?
xiota,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.