что zsh эквивалентен из экспорта удара-f

Я нахожусь в той же ситуации: Sony C1 MSX с tranmeta crusoe tm5800 800 МГц.

Я попробовал Windows XP SP1: Очень хороший, но sp2 и sp3 = игра закончена => не Может получить Firefox или другого навигатора, работающего хорошо. Я попробовал Lubuntu: Игра закончена (очень медленный) я попробовал Xubuntu: Невероятно медленный, должен был отключить машину для остановки его, я попробовал Щенка Linux Ясные 5.2.8: Тот запуск, чтобы быть тяжелым для этой машины, однако это довольно применимо. Opera и Midori работают невероятно хорошо над ним.

Затем ступите Щенок Linux Warry 5.2.2. Возможно, я сообщу (я не знаком с этим форумом),

Проблема с процессором Crusoe, то, что это не является реактивным. Когда это выполняет выполненный быстро, но это испытывает затруднения для запуска. Особенно при работе над батареей.

26
25.12.2012, 02:54
1 ответ

Переменные среды, содержащие функции, являются взломом удара. Zsh ничего не имеет подобным. Можно сделать что-то похожее с несколькими строками кода. Переменные среды содержат строки; более старые версии удара, прежде чем Контузия была обнаружена, сохранил код функции в переменной, имя которой является именем функции и чье значение () { сопровождаемый кодом функции, сопровождаемым }. Можно использовать следующий код, чтобы импортировать переменные с этим кодированием и попытаться выполнить их с подобными удару настройками. Обратите внимание, что zsh не может эмулировать все функции удара, все, что можно сделать, становятся немного ближе (например, сделать $foo разделите значение и разверните подстановочные знаки и сделайте массивы 0).

bash_function_preamble='
    emulate -LR ksh
'
for name in ${(k)parameters}; do
  [[ "-$parameters[name]-" = *-export-* ]] || continue
  [[ ${(P)name} = '() {'*'}' ]] || continue
  ((! $+builtins[$name])) || continue
  functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done

(Как Stéphane Chazelas, исходный исследователь Контузии, отметил, более ранняя версия этого ответа могла выполнить произвольный код в этой точке, если бы функциональное определение было уродливо. Эта версия не делает, но конечно как только Вы выполняете любую команду, это могла быть функция, импортированная из среды.)

Версии постконтузии удара кодируют функции в среде с помощью недопустимых имен переменной (например. BASH_FUNC_myfunc%%). Это делает их тяжелее для парсинга надежно, поскольку zsh не обеспечивает интерфейс для извлечения таких имен переменной из среды.

Я не рекомендую делать это. Доверие экспортируемым функциям в сценариях является плохой идеей: это создает невидимую зависимость в Вашем сценарии. Если Вы когда-нибудь будете запускать свой скрипт в среде, которая не имеет Вашей функции (на другой машине, в задании крона, после изменения Ваших файлов инициализации оболочки, …), то Ваш сценарий не будет больше работать. Вместо этого сохраните все свои функции в одном или нескольких отдельных файлах (что-то как ~/lib/shell/foo.sh) и запустите свои сценарии путем импорта функций, которые это использует (. ~/lib/shell/foo.sh). Таким образом, если Вы изменяете foo.sh, можно легко искать, какие сценарии полагаются на него. При копировании сценария можно легко узнать, в каких вспомогательных файлах он нуждается.

Zsh (и ksh перед ним) делает это более удобным, позволяя автоматически загружать функции в сценариях, где они используются. Ограничение состоит в том, что можно только поместить одну функцию на файл. Объявите функцию, как автоматически загружено и поместите функциональное определение в файл, имя которого является названием функции. Поместите этот файл в каталог, перечисленный в $fpath (который можно настроить через FPATH переменная среды). В Вашем сценарии объявите автоматически загруженные функции с autoload -U foo.

Кроме того, zsh может скомпилировать сценарии, для сохранения времени парсинга. Звонить zcompile скомпилировать сценарий. Это создает файл с .zwc расширение. Если этот файл присутствует затем autoload загрузит скомпилированный файл вместо исходного кода. Можно использовать zrecompile функционируйте к компиляции (ре) все функциональные определения в каталоге.

11
27.01.2020, 19:40
  • 1
    , Забавный, как Ваш код имеет ту же уязвимость контузии bash имел (не проверяет, что содержание переменной является только функциональным определением и обрабатывает любое имя переменной как HTTP_HOST или LC_X). Хороший ответ иначе. –  Stéphane Chazelas 04.06.2017, 00:30
  • 2
    @StéphaneChazelas, Если Вы идете в команды выполнения с функциями, импортированными из среды, Вы в значительной степени проиграли. Но я обновил код импорта для не выполнения произвольного кода. Это не очень полезно, хотя, так как удар постконтузии не кодирует свои экспортируемые функции таким же образом. –  Gilles 'SO- stop being evil' 04.06.2017, 01:03
  • 3
    , из которого Вы теперь зафиксировали эквивалент CVE-2014-6271, но все еще вероятно, подвергнуты многим уязвимостям типа CVE-2014-6277/6278..., поскольку Вы все еще выставляете zsh синтаксический анализатор для кодирования в любой переменной включая некоторых, которые потенциально находятся под контролем взломщиков в некоторых контекстах (как код в zsh -c 'functions[f]=$VAR' анализируется даже если f функция никогда не вызывается). Решение состоит в том, чтобы рассмотреть только переменные, имя которых следуют за зарезервированным шаблоном как те $BASH_FUNC_x%%, но как Вы говорите, zsh не имеет никакого API, чтобы перечислить или получить их. Необходимо было бы звонить perl например. –  Stéphane Chazelas 04.06.2017, 12:38

Теги

Похожие вопросы