Il y a une question similaire qui traite du scénario de «wrapping», où vous souhaitez remplacer par exemple cd
une commande qui appelle la fonction intégrée cd
.
Cependant, à la lumière de shellshock et al et sachant que bash importe des fonctions de l'environnement, j'ai fait quelques tests et je ne peux pas trouver un moyen d'appeler le builtin en toute sécurité à cd
partir de mon script.
Considère ceci
cd() { echo "muahaha"; }
export -f cd
Tous les scripts appelés dans cet environnement à l'aide de cd
se briser (considérer les effets de quelque chose comme cd dir && rm -rf .
).
Il existe des commandes pour vérifier le type d'une commande (appelée commodément type
) et des commandes pour exécuter la version intégrée plutôt qu'une fonction ( builtin
et command
). Mais, voilà, ceux-ci peuvent également être remplacés à l'aide de fonctions
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Donnera ce qui suit:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Existe-t-il un moyen de forcer en toute sécurité bash à utiliser la commande intégrée, ou au moins détecter qu'une commande n'est pas une commande intégrée, sans effacer tout l'environnement?
Je me rends compte que si quelqu'un contrôle votre environnement, vous êtes probablement foutu de toute façon, mais au moins pour les alias, vous avez la possibilité de ne pas appeler l'alias en insérant un \
avant.
env
n'est pas redéfini en tant que fonction également. C'est terrifiant. J'ai d'abord pensé que les caractères spéciaux aideraient - appeler avec un chemin complet qui inclut /
, utiliser .
pour source, et ainsi de suite. Mais ceux-ci peuvent également être utilisés pour les noms de fonction! Vous pouvez redéfinir n'importe quelle fonction que vous souhaitez, mais il est difficile de revenir à l'appel de la commande d'origine.
#/bin/sh
s'il ne s'agit pas d'un shell interactif par défaut.
env
commande avant, comme ceci:env -i <SCRIPT.sh>