Есть похожий вопрос, который касается сценария «обтекания», где вы хотите заменить, например, cd
команду, которая вызывает встроенную функцию cd
.
Тем не менее, в свете shellshock и др. И зная, что bash импортирует функции из среды, я провел несколько тестов и не могу найти способ безопасного вызова встроенной функции cd
из моего скрипта.
Учти это
cd() { echo "muahaha"; }
export -f cd
Любые скрипты, вызываемые в этой среде, cd
будут ломаться (учитывайте эффекты чего-то вроде cd dir && rm -rf .
).
Существуют команды для проверки типа команды (удобно называются type
) и команды для выполнения встроенной версии, а не функции ( builtin
и command
). Но, о чудо, они также могут быть переопределены с помощью функций
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Даст следующее:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command cd x
muahaha
Есть ли способ безопасно заставить bash использовать встроенную команду или, по крайней мере, обнаружить, что команда не является встроенной, без очистки всей среды?
Я понимаю, что если кто-то контролирует вашу среду, вы, вероятно, все равно испорчены, но, по крайней мере, для псевдонимов у вас есть возможность не вызывать псевдоним, вставив \
перед ним.
env
не переопределено как функция. Это ужасно Сначала я подумал, что помогут специальные символы - вызов с указанием полного пути /
, использование .
источника и т. Д. Но они также могут быть использованы для имен функций! Вы можете переопределить любую функцию, которую хотите, но трудно вернуться к вызову исходной команды.
#/bin/sh
если это не интерактивная оболочка по умолчанию.
env
команды раньше, например так:env -i <SCRIPT.sh>