Esportando una funzione, che non è supportata da tutte le shell, inserisce il codice nel blocco ambiente . Questo è un blocco neutro rispetto alla lingua del testo , che viene copiato da padre a figlio quando viene creato un nuovo processo.
Questa era la base di ShellShock.
Il problema è che i due linguaggi Bash e Python sono completamente diversi, quindi una funzione scritta in uno non sarà direttamente eseguibile dall'altro senza traduzione. Il processo figlio potrebbe eseguire la scansione del blocco di ambiente cercando la funzione, quindi tradurlo e compilarlo nella propria lingua. Un sacco di lavoro e potrebbe facilmente essere un problema di sicurezza.
Se vuoi solo andare Bash-> Python-> Bash, l'esportazione della funzione dal primo script Bash dovrebbe farlo, perché verrà copiata in ogni blocco di ambiente. Tuttavia, in un commento si specifica anche che non si desidera che il primo script lo esporti.
Ebbene si poteva leggere il codice funzione che utilizza Python in una stringa di testo, quindi metterlo nell'ambiente bloccare da soli (questo è ciò che fa export
nella shell). Utilizzare il dizionario os.environ
.
Il nome effettivo utilizzato dipende dalla versione di Bash. La vulnerabilità di ShellShock ha comportato numerose modifiche. Meglio creare una funzione di test, esportarla, quindi usare per trovare il suo nome completo. Ad esempio sulla mia versione una funzione semplice denominata gash
viene visualizzata nel blocco di ambiente come BASH_FUNC_gash%%
.
BASH_FUNC_gash%%=() { echo 'Hollow world'
}
Ad esempio:
import os
import subprocess
fun_body="""() { echo 'Hollow world'
}
"""
os.environ['BASH_FUNC_gash%%'] = fun_body
p1 = subprocess.Popen('./myscript.sh')
p1.wait()
Lo script (myscript.sh
) contiene:
#!/bin/bash
gash
In alternativa si poteva guardare il vostro disegno di nuovo. Mescolare i linguaggi è sempre problematico, perché non scrivere tutto in Python?
Perché non salvare la funzione 'my_test' in un file di shell separato ed eseguire' python -c' con quella chiamata di script di shell da un altro? – vrs
'/ bin/sh' non supporta la parola chiave' function'. Usa '#!/Bin/bash' (o qualche altra shell) per il tuo shebang. – chepner
Posso chiederti perché dovresti chiamare una funzione definita solo in quella shell? – nacho4d