C'è una domanda simile che si occupa dello scenario "wrapping", in cui si desidera sostituire, ad esempio, cd
un comando che chiama l'integrato cd
.
Tuttavia, alla luce di shellshock et al e sapendo che bash importa le funzioni dall'ambiente, ho fatto alcuni test e non riesco a trovare un modo per chiamare in modo sicuro l'integrato cd
dal mio script.
Considera questo
cd() { echo "muahaha"; }
export -f cd
Qualsiasi script chiamato in questo ambiente utilizzando cd
si interromperà (considerare gli effetti di qualcosa di simile cd dir && rm -rf .
).
Ci sono comandi per controllare il tipo di comando (chiamato convenientemente type
) e comandi per eseguire la versione integrata piuttosto che una funzione ( builtin
e command
). Ma ecco, questi possono essere ignorati anche usando le funzioni
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Produrrà quanto segue:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Esiste un modo per forzare in modo sicuro bash a utilizzare il comando incorporato o almeno rilevare che un comando non è un comando incorporato, senza cancellare l'intero ambiente?
Mi rendo conto che se qualcuno controlla il tuo ambiente probabilmente sei fregato comunque, ma almeno per gli alias hai la possibilità di non chiamare l'alias inserendo un \
prima.
env
non viene ridefinito anche come funzione. Questo è terrificante. Ho pensato per la prima volta che i caratteri speciali avrebbero aiutato: chiamare con un percorso completo che includesse /
, usando .
come sorgente e così via. Ma quelli possono anche essere usati per i nomi delle funzioni! È possibile ridefinire qualsiasi funzione desiderata, ma è difficile tornare a chiamare il comando originale.
#/bin/sh
se questa non è la shell interattiva predefinita.
env
comando prima, in questo modo:env -i <SCRIPT.sh>