LINUX: Avviare Shell Scripts al Boot

Vediamo un modo per eseguire degli script al boot di una macchina Linux. Il servizio che consente l’avvio e’ il systemctl

ad esempio creiamo uno script che all’avvio elimini tutte le regole di INPUT al firewall con il comando nano /root/regolafirewall.sh con il seguente contenuto :

#!/bin/bash

iptables -P INPUT DROP

ora con il comando chmod 777 /root/regolafirewall.sh concediamo i permessi di esecuzione allo script.

Ora creiamo il servizio che poi ci consentira’ di avviare all’avvio lo scritp portiamoci nella directory /etc/systemd/system e creiamo un file regolafirewall.service

all’interno di questo file scriviamo il seguente codice :

[Unit]
Description=Script per cancellazione regole input

[Service]
ExecStart=/root/regolafirewall.sh
ExecStop=/root/altro_script_da_eseguire_allo_stop.sh

[Install]
WantedBy=multi-user.terget

I vari parametri sono abbastanza chiari, i due ExecStart e ExecStop indicano i due script che devono essere richiamati al comando systemctl start <service> e systemctl stop <service>. Se lo script da lanciare e’ lo stesso, allora il parametro ExecStop non serve che sia specificato.

nella sezione Install il parametro WantedBy specifica che l’avvio del servizio vale per tutti gli utenti del sistema.

Ora per avviare il servizio/script possiamo lanciare il comando:
systemctl start regolafirewall.service

Mentre per farlo partire al boot possiamo lanciare il comando:
system enable regolafirewall.service

questo comando e’ permanente pertanto basta lanciarlo una volta e il servizio/script verrà eseguito ad ogni avvio .

PYTHON: Gestire i parametri a riga di comando

Gestione dei parametri a riga di comando.

Quando lanciamo uno script da consolle, potremmo avere la necessita’ di passare allo stesso dei parametri che possano modificarne il comportamento in avvio .

Di solito i parametri vengono definiti da un carattere che identifica il parametro preceduto dal segno ‘‘, ad esempio -d, seguito eventualmente da un <valore> del parametro ad esempio:
python mioscript.py -d <valore> -a

Vediamo come si gestiscono questi parametri.
A titolo di esempio creiamo uno script che come parametro di ingresso possa indicare se stampare a video il debug oppure no.

Per gestire i parametri in python si può usare una libreria chiamata sys, questo modulo mette a disposizione una lista,la sys.argv che contiene tutti i parametri specificati.

Creiamo un file script chiamato test.py e inseriamo queste righe:

import sys

print(sys.argv)

Ora da riga di comando digitiamo il comando python test.py -d True

a video comparirà il seguente risultato : [‘test.py’,’-d’,’True’]

Come possiamo vedere il contenuto della lista sys.argv contiene alla posizione 0 il nome dello script lanciato e di seguito tutti i parametri inseriti che ora dovremmo solo iterare e usare per dare istruzioni al nostro programma.

Altro metodo – Argparse

Un altro metodo usato quando il numero dei parametri o lo script sono piuttosto complicati, e’ l’uso della libreria ARGPARSE .

Questa libreria offre un metodo molto comodo di gestire i parametri e mette a disposizione la possibilita’ di creare un help. il classico -h / –help per ottenere delle informazioni sul programma e sul modo d’uso dello stesso.

Vediamo subito un esempio di codice :

                                                                                              
import argparse

# istanziamo un oggetto di tipo ArgumentParser
parser = argparse.ArgumentParser(description = "Semplice programma per dimostrare argparser", usage="main.py -d  -f [nomefile.txt]") 

#aggiungiamo gli argomenti
parser.add_argument("-d", "--debug" , default=False ,help="Abilita il debug default off", action="store_true")
parser.add_argument("-f", "--file", type=str,help="specifica il file di debug")
#assegnazione degli argomenti
args = parser.parse_args()

print(f"Debug: {args.debug}\nFile:{args.file}")

Spiegando il codice , tralasciando la prima riga di import, abbiamo il primo comando che crea l’oggetto “parser” di tipo ArgumentParser a cui passiamo i primi parametri che sono description e usage.

Questi due parametri servono per inserire del testo che verra’ stampato a video nel momento in cui chiameremo l’ help da riga di comando eseguendo ad esempio python script.py -h avendo come risultato

daniel@daniel-desktop:~/PYTHON/PARAMETRI$ python3 script.py -h
usage: main.py -d [True/False] -f [nomefile.txt]

Semplice programma per dimostrare argparser

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           Abilita il debug default off
  -f FILE, --file FILE  specifica il file di debug

Ci sono altri parametri che si possono aggiungere che li possiamo trovare sulla guida uffciale di python a questo link https://docs.python.org/3/library/argparse.html.


proseguendo nello script abbiamo il metodo add_argument, il quale si occupa di aggiungere tutti i parametri al,’oggetto parser . Per ogni parametro dobbiamo specificare il nome del parametro e poi il tipo (intero, float, bool….) , un valore di default nel caso il parametro non venga specificato e il parametro help serve a stampare qualcosa che spieghi cosa serva il parametro nel caso di richiesta di -h/–help.

Se il parametro non prevede specifiche , come ad esempio -d che deve solamente attivare il debug in caso venga richiamato, e’ necessario specificare il parametro action che può assumere i seguenti valori:

store_const : serve a memorizzare il valore costante del parametro, e’ necessario aggiungere anche il parametro const=<valore>. ad esempio :
parser.add_argument(“-n”,”–numero”,action=”store_const”, const=455)
questo memorizzerà il valore 455 nel parametro n anche se non specificato in chiamata

store_true: assegna il valore True all’argomento se richiamato

store_false: assegna il valore false all’argomento se richiamato

Altri valori si possono specificare ma vi rimando sempre alla guida ufficiale per approfondirli.

A questo punto con l’istruzione args = parser.parse_args() assegno i valori al namespace args al quale potremmo accedere con il metodo args.[nome parametro]

seguendo ad esempio il comando con i parametri seguenti python script.py -d -f prova.txt avremmo il seguente risultato

daniel@daniel-desktop:~/PYTHON/PARAMETRI$ python3 script.py -d -f prova.txt

Debug: True
File:prova.txt

daniel@daniel-desktop:~/PYTHON/PARAMETRI$