Linux как обновить bash

Обновлено: 04.07.2024

Можно ли реально обновить bash до версии 4.0 в OSX Yosemite?

Эта статья и эта тема ссылаются на один и тот же вопрос, но они устанавливают новую оболочку рядом со старой. Есть ли способ напрямую обновить старую оболочку bash?

Там нет необходимости делать это. На самом деле, это всегда хорошая идея сохранить оригинал. Две или более версии bash могут быть установлены одновременно, и вы можете установить ту, которая вам нравится по умолчанию По сути, Apple Software Update будет отвечать за изменение версии BASH в системе, как это было с обновлением BASH для Shellshock. Так что, если Apple не предоставит обновление, то не будет прямого способа обновить его до последней версии GNU BASH, которая была установлена ​​как часть OS X. Косвенным способом было бы загрузить его самостоятельно, тем или иным способом, и установить его и затем установите его в качестве оболочки по умолчанию. Независимо от того, решите вы удалить удаленную версию или обновленную версию Apple, решать вам.

Apple не будет обновлять Bash, потому что последняя версия лицензирована под GPLv3, которую Apple не может использовать. Они обновили большинство своих других оболочек, хотя. ZSH, например, в основном в курсе.

После небольшого исследования это кажется основной проблемой:

Когда люди распространяют Пользовательские продукты, которые включают программное обеспечение в соответствии с GPLv3, раздел 6 требует, чтобы они предоставили вам информацию, необходимую для модификации этого программного обеспечения. Пользовательские продукты - это термин, специально определенный в лицензии; Примерами пользовательских продуктов являются портативные музыкальные проигрыватели, цифровые видеомагнитофоны и системы домашней безопасности.

Это потребовало бы, чтобы в противном случае для программного обеспечения с закрытым исходным кодом его части под GPL были сделаны доступными для модификации, что, очевидно, было бы проблемой для Apple.

Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат . Это объяснение не имеет смысла. Поставка двоичного файла GPL (v3 или иного) не означает, что остальная часть ОС должна быть выпущена. Остальная часть ОС не ссылается на bash . Предложение «Tivoization» может объяснить, почему bash его нельзя обновить, скажем, на Apple TV, но не на настольном Mac. Кроме того, «порции GPL» уже должны были бы быть модифицируемыми публикой; v3 не изменит это. Я полагаю, что пункт о патентах GPL v3 будет достаточным, чтобы удержать Apple от прикосновения к коду GPL v3. @ tjt263 Речь идет о различиях между GPLv3 и GPLv2, используемой версией Apple, по-прежнему лицензируемой. Да, Bash3.2 распространяется по лицензии GPLv2. Bash4.x распространяется по лицензии GPLv3. И что? Вы сказали: «Apple не будет обновлять Bash, потому что последняя версия лицензирована под GPLv3, которую Apple не может использовать ». Почему они не могут? «Это потребовало бы, чтобы в противном случае программное обеспечение с закрытым исходным кодом сделало, чтобы его части под GPL были доступны общественности для модификации , что, очевидно, станет проблемой для Apple » Почему это проблема? Они уже это делают. Это уже модифицируемо публикой. Все программное обеспечение есть. Особенно, когда это FOSS и они раздают исходный код на своем сайте всем, кто этого хочет.

Можно ли реально обновить bash до версии 4.0 в OSX Yosemite? Да.

Выйдите и снова откройте свой терминал. затем введите

Измените оболочку по умолчанию через графический интерфейс терминала с буквальным путем вашего нового bash (РЕДАКТИРОВАТЬ: я еще не нашел способ CLI, который работает)

введите описание изображения здесь

Можно ли реально обновить bash до версии 4.0 , предоставленной Apple, в OSX Yosemite?

РЕДАКТИРОВАТЬ: Нет. Не в том смысле, о котором просит опера. Например, обновите текущую установку путем замены. В других ответах было отмечено, что Apple не обновила bash из-за проблем с лицензированием. Однако загрузка обновленной и отдельной версии bash и использование ее в качестве оболочки по умолчанию является каноническим решением для большинства переводчиков. Взять, к примеру, питона. Вы не обновляете 2.7 до 3.5, вы загружаете отдельную версию и меняете настройки по умолчанию.

Вы можете установить по умолчанию с помощью CLI с: sudo chpass -s /usr/local/bin/bash . Примечание. Лучше всего указывать на символическую ссылку /usr/local/bin/ таким образом, чтобы Brew мог обрабатывать обновления без необходимости каждый раз менять среду. sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells' затем chsh -s /usr/local/bin/bash установит оболочку по умолчанию для терминала

Как сказал @William в своем ответе, Apple не предоставляет bash 4 из-за ограничений GPL. Однако вы можете установить bash 4+, а также сделать его оболочкой по умолчанию (в том числе для Terminal и iTerm2 ), выполнив следующие действия.

Установите Bash 4 через Homebrew

Сначала установите более новую версию bash. Есть разные способы сделать это, я предпочитаю Homebrew.

Bash 4 теперь доступен в вашей переменной PATH (при условии, что на вашем пути находится корзина с домашним пивом). Тем не менее, это еще не ваша оболочка по умолчанию. Вы можете найти, где он находится, запустив which bash . В моем случае это на /usr/local/bin/bash .

Использование Bash 4

Поскольку он находится в вашем PATH, вы можете начать сеанс Bash 4 с помощью just bash или его можно использовать в сценариях с помощью Shebang .

Например, это будет использовать конкретный экземпляр bash.

Это будет использовать первый удар по PATH.

Вы также можете установить путь bash для определенных профилей в Terminal / iTerm2, используя шаги, описанные в ответе @ user136952.

Делаем Bash 4 по умолчанию

Как уже упоминалось выше, после установки Bash 4 по-прежнему не является оболочкой по умолчанию. Чтобы сделать bash по умолчанию, вам нужно сделать еще два шага.

Сначала добавьте путь Bash 4 к своему /etc/shells файлу, чтобы он был разрешенной оболочкой для входа. Как описано в / etc / shells , этот файл содержит список допустимых оболочек для входа. После добавления нового пути bash мой /etc/shells выглядит следующим образом:

Далее мы используем chsh, чтобы сделать его оболочкой по умолчанию. Поэтому любые сессии для этого пользователя будут использовать эту оболочку. Вы можете прочитать больше об этом в разделе Изменение оболочки в Mac OS X Terminal , но фактическая команда очень проста.

Теперь новый bash является нашей оболочкой входа по умолчанию. Если вы откроете Terminal или iTerm2 и запустите, bash --version вы должны увидеть новую версию. Обратите внимание на «Лицензию GPLv3 +», поэтому Apple не связывает ее с MacOS.

т.е. я могу найти достаточно близко пакет в ближайшем дистрибутиве? Или это сложно, и компиляция из исходного кода лучше? Или я могу получить его из Debian?

(Этот вопрос касается, по крайней мере, Ubuntu 11.10 и 12.10; держу пари, что другие бьют по этому вопросу, поэтому, если совет отличается в зависимости от того, какой именно Ubuntu с истекшим сроком действия, это может помочь сказать, как!)

4 ответа

Краткий ответ для количественного анализа (Ubuntu 12.10): загрузите и установите пакет bash из точного хранилища.

Для количественного (Ubuntu 12.10) я искал пакеты bash из ближайших выпусков. Я скачал пакеты для быстрого и точного.

Прежде чем начать, я сделал резервную копию моего существующего пакета bash, поэтому я надеюсь, что смогу восстановить свою систему, если новая установка не удалась. (Требуется пакет dpkg-repack.)

Хотя, вероятно, мне следовало просто скопировать исполняемый файл /bin/bash в /root/bash.vulnerable , так как это будет легче восстановить в чрезвычайной ситуации.

рвения

Сначала я попробовал пакет raring

Но это было проверено как по-прежнему уязвимым !

Точные

Тогда я попробовал пакет из точного

Это было проверено как безопасная с использованием сценария bashcheck .

Но мне бы очень хотелось, чтобы я установил релиз LTS. Я все еще планирую сделать обновление, когда у меня есть время .

Сборка bash из исходного кода довольно проста, вам нужна жизнеспособная среда разработки C (gcc, binutils и т. д.) и библиотека termcap и заголовки (по умолчанию, но вы можете использовать вместо этого curses ).

Вы должны как минимум иметь резервную копию вашего текущего двоичного кода bash до его завершения, и в идеале полное резервное копирование или восстановление диска. В зависимости от вашей ОС bash может быть важной частью ваших загрузочных скриптов! Новые версии иногда содержат несовместимые изменения в поведении.

Одна и та же последовательность шагов должна работать для всех версий bash-2.05b до bash-4.3, просто замените «4.3» в зависимости от ситуации, чтобы при необходимости можно было использовать одну и ту же версию. Если вы не используете довольно старинную версию bash-2.05b, которая уязвима, но официальный патч недоступен, AFAICT Исправление также перенесено на 2.05b.

Вам следует дважды проверить на официальный сайт текущего патча. уровень, на случай, если вы нажмете на несвежее зеркало.

См. также bash сборка в Linux с нуля . Список OSS-SEC является хорошим местом для поиска исправлений и текущий статус.

Следующая команда находит сценарии bash в текущем каталоге и его подкаталогах:

Если какой-либо из этих сценариев выполняется из вектора атаки, вам необходимо обновить bash или изменить эти сценарии, чтобы они выполнялись под dash или ksh. Проверьте также учетные записи с ограниченным доступом, для которых оболочкой входа является bash, и для сценариев, которые явно вызывают bash ( bash -c '…' , bash /path/to/script ,…).

Если вы не можете найти двоичный файл для обновления bash в своей системе, вы можете загрузить исходный код, примените исправьте для своей версии и перекомпилируйте (установите пакет build-essential , а также зависимости для сборки bash - autoconf autotools-dev quilt bison libncurses5-dev texinfo debhelper texi2html locales gettext sharutils time xz-utils dpkg-dev начиная с Ubuntu 12.04).

Даже если вы не найдете какой-либо уязвимый сценарий, обновление - это хорошая идея. Вы не должны запускать систему, для которой обновления безопасности недоступны . Эта уязвимость находится в bash, что может повлиять или не повлиять на вас, но следующая уязвимость может быть в критическом компоненте вашей системы.

Переменные окружения в Linux - это специальные переменные, определенные оболочкой и используемые программами во время выполнения. Они могут определяться системой и пользователем. Системные переменные окружения Linux определяются системой и используются программами системного уровня.

Например, команда PWD использует системную переменную, чтобы сохранять прежнюю рабочую директорию. Пользовательские переменные окружения устанавливаются пользователем, для текущей оболочки, временно или постоянно. Вся концепция добавления и удаления переменных оболочки крутится вокруг нескольких файлов, команд и различных оболочек.

Виды переменных окружения

Если смотреть более широко, переменная окружения может быть трех типов:

1. Локальные переменные окружения

Эти переменные определены только для текущей сессии. Они будут безвозвратно стерты после завершения сессии, будь то удаленный доступ или эмулятор терминала. Они не хранятся ни в каких файлах, а создаются и удаляются с помощью специальных команд.

2. Пользовательские переменные оболочки

Эти переменные оболочки в Linux определяются для конкретного пользователя и загружаются каждый раз когда он входит в систему при помощи локального терминала, или же подключается удаленно. Такие переменные, как правило, хранятся в файлах конфигурации: .bashrc, .bash_profile, .bash_login, .profile или в других файлах, размещенных в директории пользователя.

3. Системные переменные окружения

Эти переменные доступны во всей системе, для всех пользователей. Они загружаются при старте системы из системных файлов конфигурации: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

Конфигурационные файлы переменных окружения Linux

Здесь мы кратко рассмотрим различные конфигурационные файлы, перечисленные выше, которые используются для настройки переменных окружения для всей системы или конкретного пользователя.

.bashrc

Это файл переменных конкретного пользователя. Загружается каждый раз, когда пользователь создает терминальный сеанс, то есть проще говоря, открывает новый терминал. Все переменные окружения, созданные в этом файле вступают в силу каждый раз когда началась новая терминальная сессия.

.bash_profile

Эти переменные вступают в силу каждый раз когда пользователь подключается удаленно по SSH. Если этот файл отсутствует система будет искать .bash_login или .profile.

/etc/environment

Этот файл для создания, редактирования и удаления каких-либо переменных окружения на системном уровне. Переменные окружения, созданные в этом файле доступны для всей системы, для каждого пользователя и даже при удаленном подключении.

/etc/bash.bashrc

Системный bashrc. Этот файл выполняется для каждого пользователя, каждый раз когда он создает новую терминальную сессию. Это работает только для локальных пользователей, при подключении через интернет, такие переменные не будут видны.

/etc/profile

Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал.

Все переменные окружения Linux созданные с помощью этих файлов, могут быть удаленны всего лишь удалением их оттуда. Только после каждого изменения, нужно либо выйти и зайти в систему, либо выполнить эту команду:

Добавление пользовательских и системных переменных окружения в Linux

Теперь, когда вы знаете немного теории, перейдем к практике. Локальные переменные окружения в Linux можно создавать следующими командами:

var=значение
export var=значение

Эти переменные будут доступны только для текущей терминальной сессии.

Для удаления переменных окружения можно использовать несколько команд:

1. Использование env

По умолчанию с помощью env можно посмотреть все установленные переменные среды. Но с опцией -i она позволяет временно удалить все переменные оболочки и выполнить команду без переменных.

$ env -i [переменная=значение] команда

Var - это любая переменная, которую вы хотите передать этой команде.

Такая команда запустит оболочку вообще без переменных окружения:

После запуска такого окружения, не будет доступно никаких переменных, но после выхода все вернется на свои места.

2. Использование unset

Это другой способ удаления переменных окружения Linux. Unset удаляет переменную по имени до конца текущей сессии:

3. Установить значение переменной в ''

Это самый простой способ удаления переменных окружения в Linux, устанавливая пустое значение переменной, вы удаляете ее до конца текущей сессии.

Замечание: С помощью таких способов вы можете изменять значения системных или пользовательских переменных, но они будут актуальны только для текущего сеанса.

Создание пользовательских и системных переменных окружения

В этом разделе рассмотрим как установить и удалить системные и пользовательские переменные не только для текущего сеанса, а так чтобы эффект сохранялся после перезагрузки.

1. Устанавливаем и удаляем локальные переменные в Linux

Давайте создадим локальную переменную VAR и установим ей любое значение, затем удалим ее с помощью unset и убедимся что она удалена:

VAR1='Losst'
echo $VAR1
unset VAR1
echo $VAR1

env2

Другой способ создать переменную - команда export. Удалим ее присвоив пустое значение:

export VAR='Losst'
echo $VAR
VAR=
echo $VAR

env1

Теперь создадим переменную VAR2 также зададим ей значение. А потом временно удалим все локальные переменные выполнив env -i. Она запустит оболочку без каких-либо переменных. После ввода exit все переменные будут восстановлены.

VAR2='Losst'
echo $VAR2
env -i bash
echo $VAR2

env4

Установка и удаление пользовательских переменных

Отредактируйте файл .bashrc, в вашей домашней директории, добавив команду export, для экспортирования нужной переменной. Затем выполните команду source для применения изменений. Создадим, например, переменную CD:

Добавьте такую строчку (o, затем вставить, затем Esc и :wq):

export CD='This is Losst Home'

Теперь осталось обновить конфигурацию:

source .bashrc
echo $CD

env5

Для удаления этой переменной просто удалите ее из .bashrc.

Теперь добавим переменную окружения с помощью .bash_profile. Эта переменная, как вы уже знаете будет доступна только при удаленном входе:

export VAR2='This is Losst Home'

И выполните эти команды, чтобы применить изменения и проверить добавление переменной:

source .bash_profile
echo $VAR2

Переменная недоступна, так как вы создали локальную терминальную сессию, теперь подключитесь по ssh:

ssh user@localhost
echo $VAR2

env7

Удалить эту переменную окружения можно так же как и в предыдущем случае, удалив ее из файла.

Замечание: Эти переменные доступны всегда, но не для всех пользователей.

Установка и удаление системных переменных окружения

Создадим переменную, доступную для всех пользователей, во всех терминальных сессиях, кроме удаленных, добавлением ее в /etc/bash.profile:

vi /etc/bash.profile
export VAR='This is system-wide variable'

Теперь эта переменная доступна для всех пользователей, во всех терминалах:

echo $VAR
sudo su
echo $VAR
su -
echo $VAR

env8

Если вы хотите сделать переменную окружения доступной для всех пользователей, которые подключаются к этой машине удаленно, отредактируйте файл /etc/profile:

export VAR1='This is system-wide variable for only remote sessions'

Обновите конфигурацию, и проверьте доступность переменной, она будет доступна только удаленно:

source /etc/profile
echo $VAR1

Если нужно добавить переменную окружения в Linux, так чтобы она была доступна и удаленно, и для локальных сессий, экспортируйте ее в /etc/environment:

export VAR12='I am available everywhere'

source /etc/environment
echo $VAR12
sudo su
echo $VAR12
exit
ssh localhost
echo $VAR12

env9

Как видите, переменная доступна и для локальных пользователей и удаленно.

Выводы

С помощью этих нескольких способов мы можем изменить переменные окружения. Если вы знаете другие интересные способы это сделать, поделитесь в комментариях!





Оцените статью:

(11 оценок, среднее: 4,00 из 5)

Об авторе

11 комментариев

/etc/profile
"Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. "
А что значит вошел удаленно? Через SSH?

Написанное справедливо для всех современных дистрибутивов?

Здравствуйте! Скажите можно ли запускать видео на 2-м мониторе добавив переменную в ./bashrc к примеру:
env DISPLAY=0:1 totem (ну или другой проигрыватель)?
или лучше использовать:
export DISPLAY=0:1 totem

Думаю: лучше env -i DISPLAY=0:1 totem в

/.xinputrc, только вот с totem'ом могут быть те ещё грабли - тут уже не подскажу. а вот если там же, в

/.xinputrc, будет export DISPLAY=0:1, то это подействует и на X-сервер. Ну, и ваше export DISPLAY=0:1 totem - это уже ошибка, тогда уж в две строки:
export DISPLAY=0:1
totem
Но, totem будет запускаться вместе с x-сервером. может проще создать alias с env в

/.bashrc? А может в totem есть ещё какие опции, как, например, в mplayer -display?

". добавлением ее в /etc/bash.profile
.
Затем обновляем:
source /etc/bash.bashrc"
я думал обновлять надо отредактированный файл, или это опечатка?

"Системный файл profile. Все переменные из этого файла, доступны любому пользователю в системе, только если он вошел удаленно. Но они не будут доступны, при создании локальной терминальной сессии, то есть если вы просто откроете терминал." – неверно. Переменная будет доступна везде: в терминале, GUI программах, не важно. Только что проверял локально.


Как я могу обновить один пакет, используя apt-get в Ubuntu ?, Есть ли способ обновить один пакет, используя apt-get в Debian ?

Наиболее распространенным способом обновления пакетов в Ubuntu / Debian является запуск команды sudo apt-get upgrade.

Проблема заключается в том, что все установленные пакеты будут обновлены до последних версий, доступных в настроенных репозиториях Ubuntu.

Что, если вы хотите обновить один пакет с помощью apt-get на машине с Ubuntu или Debian?

Это актуально, если вы боитесь испортить пакеты из-за обновления всего.

Обновите отдельный пакет в Ubuntu / Debian с помощью apt-get

Чтобы обновить отдельный пакет с помощью apt-get в любой системе на основе Ubuntu / Debian, используйте синтаксис:

Это будет работать для всех систем Ubuntu, Debian и Linux Mint.

Замените packagename на имя пакета, который вы хотите обновить.

Смотрите пример ниже, чтобы обновить Ubuntu-Keyring.

Обновите несколько пакетов в Ubuntu / Debian / Linux Mint

Чтобы обновить несколько пакетов, разделите их пробелом.

Если вы хотите обновить все установленные пакеты, используйте команду:

Обновите один пакет или несколько пакетов в Ubuntu с помощью скрипта

Мы можем создать простой скрипт, который будет передавать имена пакетов в качестве аргументов каждый раз, когда вы хотите обновить отдельный пакет с помощью apt-get в системе Ubuntu или Debian.

Создайте скрипт в /usr/local/bin/myupgrade с содержимым ниже.

Дайте скрипту бит выполнения.

Вы должны передать аргументы скрипту, чтобы обновить пакет.

Чтобы обновить один пакет, передайте один аргумент в конце

Для нескольких пакетов укажите имена через пробел.

Если пакет еще не установлен, скрипт спросит вас, хотите ли вы установить его. Подтвердите нажатием «Y» или «y».

Это конец нашего руководства о том, как обновить отдельный пакет с помощью apt-get в Ubuntu / Debian.

Читайте также: