Codifica di uno script di bash da utilizzare in Python

1

Sto scrivendo del codice in Python che controlla la validità di una chiave di licenza dopo aver interrogato un server. Se è valido, il programma Python a sua volta esegue alcuni script di bash.

Come creare un binario combinato dello script python (per controllare la licenza) e lo script bash (che esegue l'attività)?

Ecco quali potrebbero essere le soluzioni, ma non sono sicuro:

  1. Uso la funzione di codifica in python e codifico il file di script di bash una volta e aggiungo il file e il file license_checker.py in un singolo binario. Quando il binario viene eseguito, il codice python dovrebbe decodificare il file in un file temporaneo, eseguire lo script ed eliminare il file temporaneo.
  2. Trova un meccanismo che avvolge / incorpora il codice bash nello script python. Ho sentito parlare di decoratori ma non li ho usati e non so se servirebbero allo scopo.
posta rahuL 08.08.2013 - 09:52
fonte

1 risposta

5

Io userei la prima opzione; incorporare lo script bash in una stringa multilinea nello script Python, quindi scrivilo e usa il modulo subprocess per eseguire lo script:

import tempfile
import subprocess

script_one = '''\
echo "Hello world!"
echo "This is a bash script. :-)"
'''

def run_script(script):
    with tempfile.NamedTemporaryFile() as scriptfile:
        scriptfile.write(script)
        scriptfile.flush()
        subprocess.call(['/bin/bash', scriptfile.name])

run_script(script_one)

La funzione run_script() prende un'origine di script bash, la scrive in un file temporaneo, la esegue e pulisce automaticamente il file temporaneo una volta terminato.

Demo:

$ python /tmp/scripttest.py 
Hello world!
This is a bash script. :-)

I decoratori Python non sono di aiuto qui; non ha senso guardare quelli; i decoratori sono semplicemente funzioni Python che riescono a racchiudere altre funzioni Python.

Se lo script è grande, puoi provare a comprimerlo con zlib , base64 codificarlo, quindi incorporarlo nel file di script Python; utilizzando .decode('base64') e passando il risultato al modulo zlib si fornisce nuovamente una stringa decompressa. La compressione ZLIB riduce le dimensioni ma genera dati binari, sempre un po 'più difficile da incorporare senza dover gestire correttamente l'escape e le lunghezze delle linee. La codifica Base64 trasforma nuovamente i dati binari in dati ASCII multi-linea, anche se al prezzo del 25% in più di byte:

>>> import zlib
>>> zlib.compress(script_one).encode('base64')
'eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe\n'
>>> print """script_one = '''\\n{}'''""".format(_)
script_one = '''\
eJxLTc7IV1DySM3JyVcozy/KSVFU4koFi4VkZBYrAFGiQlJicYZCcXJRZkGJnoKVrqYSFwDnexDe
'''

Nota che per questo breve esempio di script, questa ha aumentato la dimensione, da 54 caratteri a 77, ma per gli script più lunghi dovresti vedere una riduzione decente delle dimensioni.

La decompressione è quindi semplice come zlib.decompress(script_one.decode('base64'))

    
risposta data 08.08.2013 - 11:13
fonte

Leggi altre domande sui tag