Учитывая, что Bash 3.2 (версия, поставляемая OS X) уязвима для эксплойта удаленного выполнения , известного как «Шок оболочки» ( CVE-2014-6271 и CVE-2014-7169 ), как мне перестроить Bash и защитить мою систему перед официальный патч Apple?
ОБНОВЛЕНИЕ: обратите внимание, что Apple выпустила официальный патч. Подробнее см. ниже .
Apple выпустила исправления безопасности Bash для Shellshock и связанных с ними уязвимостей как « OS X bash Update 1.0 ». Их можно установить через обычное системное обновление для пользователей OS X Mountain Lion v10.8.5 или OS X Mavericks v10.9.5 (они включены в обновление безопасности 2014-005 ), а также их можно установить вручную. Официальные исправления Apple также доступны для OS X Lion v10.7.5 и OS X Lion Server v10.7.5, но их можно загрузить только вручную. Исправления безопасности доступны по разным URL-адресам в зависимости от версии операционной системы:
(Если выпускаются новые исправления, разместите их здесь, но, пожалуйста, сохраните и существующие для справки.)
Патч Apple устраняет Shellshock и ряд других уязвимостей и подходит большинству пользователей. tl;dr люди могут перестать читать здесь.
ОДНАКО, внимание, привлеченное к bash ошибкой Shellshock, заставило многих исследователей внимательно изучить bash, и продолжает обнаруживаться все больше и больше (сложных для эксплуатации) уязвимостей. Если вы очень обеспокоены безопасностью (потому что, возможно, вы используете OS X Server для размещения общедоступного веб-сайта), то вы можете (попытаться) не отставать от уязвимостей и исправлений, поскольку они продолжают появляться, компилируя bash самостоятельно. В противном случае, не беспокойтесь об этом.
Ожидайте, что Apple выпустит еще одно обновление, чтобы расколоть его в будущем, когда уляжется пыль с поиском дополнительных уязвимостей.
Доступен официальный набор исправлений самого bash для bash 3.2, исправлений 52, 53 и 54 (соответствующих исправлениям 25, 26 и 27 Bash 4.3), которые исправляют как CVE-2014-6271, так и CVE-2014-7169, а также «Игра окончена», отображаемая ниже. Это было проверено мной ( @alblue ), и сообщение было соответствующим образом обновлено (а затем были сделаны дополнительные обновления: см. Ревизию 41 для сообщения, которое останавливается на патче 54).
Сообщалось о множестве дополнительных уязвимостей в bash. Согласно сообщению Михала Залевски, если у вас есть патч 54 (и, предположительно, официальный патч Apple) , «нет смысла зацикливаться на статусе этих отдельных ошибок, потому что они больше не должны представлять угрозу безопасности:»
CVE-2014-6271 — оригинальный RCE, найденный Стефаном. Исправлено bash43-025 и соответствующими записями от 24 сентября для других версий.
CVE-2014-7169 — ошибка создания файла/использования токена, обнаруженная Tavis. Исправлено bash43-026 & co (26 сентября)
CVE-2014-7186 — сбой 10+ здесь-документов, вероятно, не представляющий опасности для безопасности, обнаруженный Флорианом и Тоддом. Исправлено bash43-028 & co (1 октября).
CVE-2014-7187 — безотказная, вероятно, небезопасная ошибка, обнаруженная Флорианом. Исправлено bash43-028 & co (1 октября).
CVE-2014-6277 — проблема с неинициализированной памятью, почти наверняка RCE, обнаруженная Михалом Залевски. Конкретного патча пока нет.
CVE-2014-6278 — внедрение команды RCE, обнаруженное Михалом Залевски. Конкретного патча пока нет.
Это становится довольно запутанным. К счастью, Чет Рэми, официальный сопровождающий bash, опубликовал CVE для сопоставления патчей . Его пост относится к патчам для bash 4.3, я (@OldPro) перевел их на патчи для bash 3.2, что применимо к OS X. Кроме того, после этого поста он выпустил патч 57, поэтому я добавил это ниже:
bash32-052 CVE-2014-6271 2014-09-24
bash32-053 CVE-2014-7169 2014-09-26
bash32-054 exported function namespace change 2014-09-27 ("Game Over")
bash32-055 CVE-2014-7186/CVE-2014-7187 2014-10-01
bash32-056 CVE-2014-6277 2014-10-02
bash32-057 CVE-2014-6278 2014-10-05
См. сообщение Дэвида А. Уилера для временной шкалы и более подробной информации.
@alblue опубликовал инструкции по сборке через патч 55. Я (@OldPro) добавил патчи 56 и 57 в инструкции, но не тестировал их.
Вы можете определить, уязвимы ли вы к исходной проблеме CVE-2014-6271 , выполнив этот тест:
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
bash: warning: x: ignoring function definition attempt
bash: error importing function definition for `x'
hello
Приведенный выше вывод является примером неуязвимой bash
версии. Если вы видите слово vulnerable
в выводе этой команды, ваша система bash
уязвима, и вам следует обновить ее. Ниже представлена уязвимая версия OS X 10.8.5:
Исходное сообщение было обновлено, и Bash 3.2.52(1) по-прежнему уязвим для разновидности уязвимости, определенной в CVE-2014-7169.
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST
Приведенный выше вывод является примером уязвимой bash
версии. Если вы видите дату в выводе этой команды, вы bash
уязвимы.
Исследователи отметили, не классифицируя это как уязвимость, что скрипт может захватить функцию в подоболочке с помощью автоматически импортируемых функций:
$ env ls="() { echo 'Game Over'; }" bash -c ls
Game over
Приведенный выше код в уязвимой системе будет отображаться Game Over
вместо списка каталогов, который вы ожидаете от ls
. Очевидно, echo 'Game Over'
его можно заменить любым гнусным кодом, который вы хотите. Это стало известно как ошибка «Game Over».
До появления патча 54 как NetBSD , так и FreeBSD по умолчанию отключали автоматический импорт функций bash, отчасти для предотвращения «Game Over», но в основном для устранения любых дальнейших ошибок в синтаксическом анализаторе (таких как CVE-2014-7169 ), как они были . продолжает обнаруживаться, и добавлен новый флаг командной строки--import-functions
чтобы снова включить старое поведение по умолчанию. Я (@alblue) подготовил патч (против 3.2.53) для других, если они тоже хотят принять такое поведение, и включил его ниже. По умолчанию этот патч не включен в скрипте сборки ниже. Я (@OldPro) считаю, что этот патч больше не нужен или не является хорошей идеей, потому что он нарушает обратную совместимость, а уязвимости, от которых он защищает, очень хорошо устраняются патчем 54 и более ранними патчами, а включение этого неофициального патча предотвращает применение будущих патчей. .
(Примечание к редакторам вопросов; пожалуйста, не включайте это по умолчанию, так как это неофициальный патч.)
a0c5c4d66742fddd0a35001cb91798a5fbf8a2f5 import_functions.patch
Патч можно включить, запустив export ADD_IMPORT_FUNCTIONS_PATCH=YES
перед запуском сборки. Обратите внимание, что включение этого исправления приведет к отключению исправления 54 и любых будущих исправлений , поскольку нельзя гарантировать, что будущие исправления будут совместимы с неофициальным исправлением.
Как указал @ake_____ в Твиттере , официальный патч Apple по-прежнему уязвим для стирания исполняемых файлов средой:
$ env '__BASH_FUNC<ls>()'="() { echo Game Over; }" bash -c ls
Game Over
Пользователи должны решить для себя, насколько это важно. Я (@OldPro) думаю, что не о чем беспокоиться, потому что нет известного эксплойта для такого поведения (ему даже не был присвоен идентификатор CVE), потому что, как правило, непривилегированные удаленные злоумышленники не могут установить имя переменной среды, а злоумышленники с привилегиями не могут используйте это, чтобы получить привилегии, которых у них еще нет (по крайней мере, не без использования дополнительной уязвимости).
Чтобы предоставить небольшую информацию, bash позволяет вам определять функции и, кроме того, позволяет вам экспортировать эти функции в подоболочки с помощью export -f
команды. Раньше это реализовывалось путем создания переменной среды с тем же именем, что и у функции, со значением, установленным в определении функции. Так
$ ls () { echo 'Game Over'; }
$ export -f ls
$ echo $ls
Game Over
Это произошло потому, что export -f ls
была создана переменная среды с именем ls
. Уязвимость «Game Over» заключалась в том, что вы могли напрямую создать эту переменную среды без необходимости сначала определять функцию, а это означало, что если вы могли ввести правильное имя переменной, вы могли перехватить команду. Apple попыталась исправить это, затруднив создание переменной с правильным именем. Официальный патч bash 54 фактически делает невозможным создание переменной с правильным именем, используя имена переменных, которые включают %
в себя символ, не разрешенный в имени переменной, эффективно помещая экспортированные определения функций в другое зарезервированное пространство имен.
Если ничего из вышеперечисленного не имеет для вас смысла, не беспокойтесь об этом. У вас все в порядке с патчем Apple на данный момент.
OS X 10.9.5 (последняя стабильная версия на данный момент) поставляется с Bash v3.2.51:
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Вы можете получить и перекомпилировать Bash следующим образом , при условии, что у вас установлен Xcode (и вы запустили xcodebuild
хотя бы один раз перед тем, как принять лицензию):
$ # If you want to disable auto-imported functions, uncomment the following
$ # export ADD_IMPORT_FUNCTIONS_PATCH=YES
$ mkdir bash-fix
$ cd bash-fix
$ curl https://opensource.apple.com/tarballs/bash/bash-92.tar.gz | tar zxf -
$ cd bash-92/bash-3.2
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052 | patch -p0
$ curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-053 | patch -p0
$ # See note above about ADD_IMPORT_FUNCTIONS_PATCH
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] && curl http://alblue.bandlem.com/import_functions.patch | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-054 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-055 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-056 | patch -p0
$ [ "$ADD_IMPORT_FUNCTIONS_PATCH" == "YES" ] || curl https://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-057 | patch -p0
$ cd ..
$ # Note: DO NOT ADD SUDO TO XCODEBUILD HERE
$ xcodebuild
$ build/Release/bash --version # GNU bash, version 3.2.57-release
$ build/Release/sh --version # GNU bash, version 3.2.57-release
$ sudo cp /bin/bash /bin/bash.old
$ sudo cp /bin/sh /bin/sh.old
$ sudo cp build/Release/bash /bin
$ sudo cp build/Release/sh /bin
(Примечание: вы можете запустить это, скопировав и вставив приведенный выше блок кода, зайдя в Терминал и затем запустив pbpaste | cut -c 2- | sh
. Всегда будьте осторожны при запуске случайных скриптов из Интернета...)
После этого версия Bash должна быть v3.2.57:
$ bash --version
GNU bash, version 3.2.57-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
В целях безопасности и после тестирования я рекомендую вам chmod -x
использовать старые версии, чтобы убедиться, что они не используются повторно, или переместить их на резервный сайт.
$ sudo chmod a-x /bin/bash.old /bin/sh.old
В других ответах есть решения для тех, кто использует MacPorts или Homebrew; они не решают проблему, они просто устанавливают дополнительные версии Bash. Пожалуйста, ознакомьтесь с этими ответами, если вы хотите обновить их специально.
Спасибо Чету, который заботится о bash и делает эти патчи доступными. Спасибо всем, кто прокомментировал это и со временем улучшил.
Теперь Apple выпустила настоящее исправление, хотя оно все еще может быть полезным. Поскольку они выпустили исправление только для Lion и выше, а официальный патч содержит GNU bash, версия 3.2.53(1)-выпуск (x86_64-apple-darwin13), ошибка Game Over все еще несколько уязвима. На данный момент пересборка вашей собственной версии Bash против 3.2.57, вероятно, более безопасна, чем использование патча Apple, если только вы не сделаете это неправильно.
Это дает вам версию bash 4.3.28(1), в которой исправлены обе уязвимости (CVE-2014-6271 и CVE-2014-7169), а также некоторые обнаруженные впоследствии. Это полезно, если вы изменили оболочки, чтобы использовать Macports bash для получения функций версии 4.
Это не решит проблему стандартных скриптов ОС как первой #!/bin/sh
или #!/bin/bash
первой строки. Проблема такого рода заключается в том, что Macports старается не использовать версии программ, поставляемые Apple, поскольку Macports имеет тенденцию обновляться быстрее, например, у него более новая версия bash)
Вы можете заставить терминал использовать это, как в ответе Homebrew.
Чтобы установить macports, следуйте этим инструкциям :
1. Установите Xcode и инструменты командной строки Xcode
2. Согласитесь с лицензией Xcode в Терминале: sudo xcodebuild -license
3. Загрузите pkg MacPorts для вашей версии OS X: ссылки находятся на странице
4. Запустите пакет
Когда у вас установлены macports, вам нужны последние версии, это делается путем запуска
sudo port selfupdate
и перекомпилируйте или получите последние двоичные файлы,
sudo port upgrade outdated
bash
обычно появляются в OS X, — например, системное исправление, исправление Homebrew и MacPorts. Возможно, и Финк. Лично я бы предпочел, чтобы это было сделано как редактирование ответа @AlBlue. Так что это все один, самый правильный, ответ.sudo port selfupdate
без пробела между self и update...ПРИМЕЧАНИЕ относительно официального обновления Apple OS X bash Update 1.0: это обновление программного обеспечения только обновляет официальную версию Apple bash до версии 3.2.53. Версия патча 3.2.54 предлагает следующее изменение:
Этот патч изменяет кодировку, которую bash использует для экспортируемых функций, чтобы избежать конфликтов с переменными оболочки и избежать зависимости только от содержимого переменной среды, чтобы определить, следует ли интерпретировать ее как функцию оболочки.
Для пользователей, которые уже пропатчили систему бинарными файлами 3.2.54, вы можете либо заменить скомпилированные бинарные файлы патчем Apple, либо оставить все как есть, но это не рекомендуется. Хотя Apple оставила свою двоичную версию версии 3.2.53, патч Apple ДЕЙСТВИТЕЛЬНО содержит исправление для приведенного ниже теста эксплойта:
env X='() { (a)=>\' sh -c "echo date"; cat echo
Это означает, что официальный бинарный файл Apple 3.2.53 содержит эквивалентную безопасность бинарному файлу vanilla GNU 3.2.54. Неприятная путаница, но это то, что есть. Исправление Apple не наполовину готово. Похоже, это полное решение проблемы. Таким образом, приведенную ниже дорожную карту для компиляции vanilla bash
и sh
исходного кода GNU следует рассматривать как исторический артефакт и, возможно, использовать в качестве шаблона для того, как делать исправления в будущем, если они потребуются.
ПРИМЕЧАНИЕ. С исходным кодом vanilla GNU sh
возникают проблемы с повышением привилегий, которые вызывают сбои в различных программах установки, например, Adobe Flash. Я настоятельно рекомендую придерживаться исправленных Apple двоичных файлов. Считайте эту схему исправления устаревшей и опрометчивой.
Существует новый патч GNU bash 3.2.55, который описывает следующее исправление:
Описание ошибки:
В parse.y есть два локальных переполнения буфера, которые могут привести к тому, что оболочка сбрасывает ядро, когда к одной команде подключено много здесь-документов или много вложенных циклов.
Мы оставляем на усмотрение внимательного читателя решить, стоит ли сидеть с официальными исправленными Apple двоичными файлами или создавать свои собственные, чтобы справиться с новыми возможными эксплойтами. Лично я буду придерживаться двоичных файлов Apple.
В этом посте подробно описано, как скомпилировать и установить vanilla bash
и sh
OS X. Я выбрал этот маршрут, поскольку следующие примеры с подробным описанием использования исходного кода Apple не оставили меня с правильной версией патча. YMMV. Однако эта ванильная установка нацелена на замену двоичных файлов OS X, так что, когда Apple, наконец, выпустит обновление для системы безопасности, эти ванильные замены будут узурпированы их соответствующими аналогами Apple.
Моя базовая конфигурация:
OS X Lion 10.7.5 и Xcode 4.6.3 со всеми установленными утилитами командной строки.
Мои шаги, чтобы исправить это, были:
Загрузите базовый исходный код bash для 3.2.48 с:
https://ftp.gnu.org/gnu/bash/bash-3.2.48.tar.gz
Загрузите исправления bash3.2.49, .50, .51, .52, .53, .54 и .55 с:
https://ftp.gnu.org/gnu/bash/bash-3.2-patches/
Я сохранил их как $filename.patch, например, bash3.2.50.patch.
компакт-диск в каталог загрузки и…
Распакуйте основную исходную ветку:
tar xzvf bash-3.2.48.tar.gz
cd bash-3.2.48
Предполагая, что вы переименовали загруженные файлы исправлений, как описано ранее,
cp ../*.patch .
Затем …
for file in *.patch ; do
patch -p0 < $file
done
Это должно показать успешные исправления различных файлов. Если нет, будьте готовы провести некоторые исследования и расследования.
Следующий:
sudo cp /bin/bash /bin/bash_old
sudo cp /bin/sh /bin/sh_old
sudo chmod -x /bin/bash_old
sudo chmod -x /bin/sh_old
Это в основном создало резервную копию ваших старых, уязвимых оболочек bash и sh и удалило их исполняемые привилегии. Это дает вам возможность восстанавливать команды по мере необходимости, но в то же время устраняет их способность наносить ущерб.
Следующий:
./configure --prefix=/ ; make ; sudo make install
Это должно правильно настроить, скомпилировать и установить новый двоичный файл bash в /bin. После этого выйдите из Терминала и снова откройте.
Вы должны, все счастливы и улыбаются, быть в состоянии bash --version
и теперь видеть 3.2.55, например:
Gaia:Downloads trane$ bash --version
GNU bash, version 3.2.55(1)-release (i386-apple-darwin11.4.2)
Copyright (C) 2007 Free Software Foundation, Inc.
Точный вывод приведенной выше команды будет отличаться в зависимости от вашей версии OS X.
Вы также должны иметь возможность проверить свою уязвимость bash
и убедиться, что это нормально.
ПРИМЕЧАНИЕ. Пока мы исправили только bash, но /bin/sh
исполняемый файл все еще находится в уязвимом состоянии. Простое копирование bash
поверх sh
— это стиль Linux. Однако реализация OS X sh
имеет некоторые отличия от bash
, поэтому вам придется снова затянуть компилятор. Дополнительную информацию о том, как bash
и sh
чем отличается OS X, можно найти здесь:
https://apple.stackexchange.com/a/89327/91441
В вашем каталоге загрузки выполните:
make clean
В вашем любимом редакторе откройте файл Makefile.in
и прокрутите до строки 99. Мы собираемся изменить строку Program, чтобы выводимый нами двоичный файл был sh
не bash
таким:
Program = sh$(EXEEXT)
Сохраните его, а затем
./configure --prefix=/ --enable-xpg-echo-default --enable-strict-posix-default
make ; sudo make install
Теперь вы будете строить sh
почти так же, как Apple.
И последнее замечание: на некоторых (всех?) системах Apple обычно помещает bashbug
исполняемый файл в /usr/bin
. Наш компилятор поместит его в /bin
. Итак, последние шаги здесь:
sudo mv /usr/bin/bashbug /usr/bin/bashbug_old
sudo chmod -x /usr/bin/bashbug_old
sudo mv /bin/bashbug /usr/bin/bashbug
_rl_
символами.READLINE_LIB = /usr/local/lib/libreadline.a
и выполните чистую компиляцию. Затем разделите и скопируйте новый двоичный файл bash поверх /bin/bash
и/bin/sh
HISTORY_LIB = /usr/local/lib/libhistory.a
. В противном случае bash будет динамически связан с /usr/local версией libhistory.bash
каким-то образом не сможет себя вести только потому, что ядро другое. В любом случае я считаю свое решение временным; в конце концов, Apple исправит проблему, и мои скомпилированные двоичные файлы будут заменены (что является моей основной причиной для компиляции в /bin
первую очередь.internal_warning ("%s: ignoring function definition attempt", from_file);
strings
на только что созданном Bash проверяет наличие нового сообщения об ошибке ignoring function definition attempt
. Тем не менее, если я запускаю новый bash, а затем вхожу в проверку уязвимости, он все равно показывает уязвимость.bash --version
с echo $BASH_VERSION
. Если последняя является более ранней версией, перезапустите Терминал../bash
а затем провел в нем тест на уязвимость.~/bash/bash-2.05b$ ./bash --version
GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.11.0)
~/bash/bash-2.05b$ /bin/bash --version
GNU bash, version 2.05b.0(1)-release (powerpc-apple-darwin8.0)
~/bash/bash-2.05b$ strings ./bash | grep 'ignoring function definition attempt'%s: ignoring function definition attempt
В старом Bash нет:~/bash/bash-2.05b$ strings /bin/bash | fgrep 'ignoring function definition attempt'
https://
strings
проверяет наличие исправлений в двоичном файле.patch
команду для применения своих исправлений, как описано выше? Я помню, как вы в другом месте говорили, что исправляли ошибки «вручную».strings
в полученном двоичном файле показывает, что у него есть новое сообщение об ошибке ignoring function definition attempt
, добавленное патчем 008.$ ./bash
$ env x='() { :;}; echo vulnerable' bash -c 'echo hello'
vulnerable
hello
$ rm -f echo
$ env X='() { (a)=>\' sh -c "echo date"; cat echo sh: X: строка 2: синтаксическая ошибка рядом с неожиданным токеном =' sh: X: line 2:
'sh: ошибка при импорте определения функции для X' Tue Sep 30 17:35:25 PDT 2014
$ env ls="() { echo 'Игра окончена'; }" bash -c ls`Game over
/bin
, не так ли? Эксплойты проверяют вашу систему bash
, а не bash
скомпилированные, но еще не установленные двоичные файлы. Либо установите двоичные файлы, либо измените ВСЕ bash
экземпляры на ./bash
.bash
поэтому sh
мне нужно изменить тесты, чтобы ./bash
вместо этого вызывать локальный. Если я так сделаю, то все работает.authexec[460]: executing /bin/sh
. Но эта проблема не возникает в версии 10.6.8, для которой нет патча Apple. Так что, по крайней мере, кажется, что патчи Apple предпочтительнее на более поздних системах, но патчи GNU могут работать для 10.6.8.Для тех, кто борется с компиляцией из исходного кода, с 29 сентября Apple официально выпустила исправления для Mac OS X 10.9.5, 10.8.5, а также 10.7.5:
Во-первых, исправление bash и sh для этой уязвимости, скорее всего, сломает некоторые скрипты на вашем Mac. Вам действительно не нужно делать это, если вы не предлагаете веб-сервисы в общедоступном Интернете прямо с вашего Mac. Так что если это действительно не нужно, подождите, пока не выйдет официальное обновление безопасности от Apple.
Предупреждаем, вот несколько инструкций о том, как сделать это обновление с помощью Brew на Mavericks 10.9.
Сначала подтвердите, что вы используете устаревший bash:
$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
Самая последняя версия bash — 4.3.25.
Если у вас не установлен Xcode, вам понадобятся инструменты командной строки Xcode, которые можно установить с помощью
$ xcode-select --install
Или с портала разработчиков .
Чтобы установить Brew ( http://brew.sh ):
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Затем выполните:
$ brew doctor
Следуйте инструкциям, если есть проблемы. Здесь решаются многие распространенные проблемы .
Затем обновите brew до последнего списка пакетов:
$ brew update
Чтобы получить последнюю версию bash 4.3.25:
$ brew install bash
Это устанавливает bash в/usr/local/Cellar/bash/4.3.25/bin/bash
Старый bash
и sh
все еще существует по адресу /bin
, поэтому после установки вы переименуете старые исполняемые файлы в новый файл.
$ sudo mv /bin/bash /bin/bash_old
$ sudo mv /bin/sh /bin/sh_old
Если вы очень параноик, вы можете удалить права на выполнение наbash_old
$ sudo chmod a-x /bin/bash_old /bin/sh_old
Затем создайте символическую ссылку на новый bash 4.3.25, который установил brew.
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/bash
$ sudo ln -s /usr/local/Cellar/bash/4.3.25/bin/bash /bin/sh
Перезагружаемся и готово.
Предупреждение — это может привести к поломке некоторых существующих сценариев оболочки, которые могут полагаться на bash 3.2 или различия, которые Mac sh
имеет по сравнению с linux sh
. Существует гораздо более сложный ответ на замену bash и sh из исходников из ответа @TraneFranks в этой же теме.
/bin/bash
и /bin/sh
это, вероятно, вызовет меньше проблем, чем обновление до последней версии Brew bash.mv: cannot move '/bin/bash' to '/bin/bash_old': Operation not permitted
Пост @AlBlue очень полный. Однако на моем сервере OS X 10.6.8 его исправление не будет работать. У Apple нет исправления для 10.6.8, и шаги, описанные @AlBlue, не работают с Xcode 3.2.6 (последняя версия для Snow Leopard). Я получаю сообщение об ошибке:
** BUILD FAILED **
The following build commands failed:
sh:
CodeSign /Users/bas/bash-fix/bash-92/build/Release/sh
bash:
CodeSign /Users/bas/bash-fix/bash-92/build/Release/bash
(2 failures)
По этой причине я использую brew.sh. Пожалуйста, прокомментируйте свои мысли, если у вас есть лучшее решение для OS X 10.6.8 Snow Leopard. См. Также комментарий @Jerome, у него был успешный патч для OS X 10.6.8 Snow Leopard с использованием решения @AlBlue. Тем не мение:
Сначала установите brew с помощью следующего лайнера:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Обновлятьbrew
brew update
Теперь просто установите последнюю версию bash
и замените текущую:
brew install bash
sudo sh -c 'echo "/usr/local/bin/bash" >> /etc/shells'
chsh -s /usr/local/bin/bash
sudo mv /bin/bash /bin/bash-backup
sudo ln -s /usr/local/bin/bash /bin/bash
Вы можете установить оболочку входа по умолчанию ' Command (complete path)
' для Terminal.app в его настройках ( Command,)
примечание: в комментариях некоторые пользователи не считают этот метод подходящим. Но для меня это единственный понятный метод обновления BASH на OS X 10.6.8 Snow Leopard.
sh
— вам тоже нужно это делать. /bin/sh
!= /bin/bash
. Многие инструменты работают, /bin/sh
когда вы запускаете системные команды. Вызов Ruby system()
, например, используется, /bin/sh
когда у вас есть символ расширения оболочки, который необходимо расширить в строке. Вы играете в проигрышную игру, используя Homebrew для обновления двоичных файлов вашей системы IMO. Вы должны обновить Homebrew bash
в дополнение к правильному обновлению двоичных файлов системы.xcodebuild
шаге. Я запускаю xcode 3.2.6. Сначала кажется, что он собирается, но затем я получаю сообщение об ошибке: ** BUILD FAILED ** Не удалось выполнить следующие команды сборки: sh: CodeSign /Users/user/bash-fix/bash-92/build/Release/sh bash: CodeSign /Users/user/bash-fix/bash-92/build/Release/bash Это я застрял, есть идеи?xcodebuild
? Если да, то я такого не испытывал. У меня есть несколько веских предложений, чтобы дать вам в сторону: проверьте, есть ли у вас несколько сборок bash, рассмотрите возможность очистки (удаление brew) и, возможно, переустановите xcode... затем запустите процесс исправления заново.Вы можете следовать инструкциям здесь: https://github.com/tjluoma/bash-fix В основном, сделайте следующее в терминале:
curl -s https://raw.githubusercontent.com/tjluoma/bash-fix/master/bash-fix.sh | zsh -f
В
л'л'л
Альблю
днозай
Старый профессионал
днозай
Старый профессионал