ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)
Понедельник, 31 марта, 2025
Сегодня у нас 1 праздник:
Международный День Резервного Копирования (World Backup Day). Пользователи сайта социальных новостей reddit предложили сделать дату 31.03 Международным днём резервного копирования, аргументируя это тем, что никогда заранее нельзя узнать, какие сюрпризы преподнесёт 1.04

Общие сведения о конфигурации оболочки Bash при запуске

Bash Heredoc

В течение многих лет оболочка Bash была неотъемлемой частью многих дистрибутивов Linux. Вначале Bash был выбран в качестве официальной оболочки GNU, потому что он был хорошо известен, достаточно стабилен и предлагал приличный набор функций.

Сегодня ситуация несколько иная — Bash по-прежнему присутствует повсюду как программный пакет, но его заменили альтернативы в стандартной установке. К ним относятся, например, оболочка Debian Almquist (Dash) (для Debian GNU/Linux) или Zsh (для GRML). В хорошо известных дистрибутивах Ubuntu, Fedora, Arch Linux и Linux Mint Bash до сих пор оставался стандартной оболочкой.

Очень полезно понимать запуск Bash и знать, как его правильно настроить. Это включает настройку среды оболочки, например, установку переменной $PATH, настройку внешнего вида приглашения оболочки и создание псевдонимов. Также мы рассмотрим два файла .bashrc и .bash_profile, которые читаются при запуске. Соответствующие знания проверяются на Экзамене 1 Сертификации профессионального института Linux.

 

Сравнение интерактивного входа в систему и неинтерактивной пакетной оболочки

Как правило, оболочка имеет два режима работы. Он может работать как интерактивная оболочка входа в систему и как неинтерактивная пакетная оболочка. Режим работы определяет запуск Bash и то, какие файлы конфигурации читаются. Режим работы можно различать следующим образом — интерактивная оболочка входа в систему, интерактивная оболочка без входа в систему, неинтерактивная оболочка входа в систему и неинтерактивная (пакетная) оболочка без входа в систему.

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

 

Интерактивная оболочка входа

Этот режим относится к входу в ваш компьютер на локальном компьютере с использованием терминала от tty1 до tty4 (в зависимости от вашей установки — терминалов может быть больше или меньше). Кроме того, этот режим охватывает удаленный вход в компьютер, например, через Secure Shell (ssh) следующим образом:

$ ssh user@remote-system

$ ssh user@remote-system remote-command

Первая команда подключается к удаленной системе и открывает только интерактивную оболочку. Напротив, вторая команда подключается к удаленной системе, выполняет данную команду в неинтерактивной оболочке входа в систему и завершает соединение ssh. Пример ниже показывает это более подробно:

$ ssh localhost uptime

user@localhost's password:

11:58:49 up 23 days, 11:41,  6 users,  load average: 0,10, 0,14, 0,20

$

Чтобы узнать, вошли ли вы в свой компьютер с помощью оболочки входа, введите следующую команду echo в своем терминале:

$ echo $0

-bash

$

Для оболочки входа в систему вывод начинается со знака «-», за которым следует имя оболочки, что в нашем случае дает «-bash». Для оболочки без входа в систему выводом является просто имя оболочки. В приведенном ниже примере это показано для двух команд echo $0, а время работы передается ssh в виде строкового параметра:

$ ssh localhost "echo $0; uptime"

user@localhost's password:

bash

11:58:49 up 23 days, 11:41,  6 users,  load average: 0,10, 0,14, 0,20

$

В качестве альтернативы используйте встроенную команду shopt следующим образом:

$ shopt login_shell

login_shell off

$

Для оболочки без входа в систему команда возвращает «off», а для оболочки входа — «on».

Что касается конфигурации для этого типа оболочки, учитываются три файла. Это /etc/profile, ~/.profile и ~/.bash_profile.

 

Интерактивная оболочка без входа в систему

Этот режим описывает открытие нового терминала, например xterm или Gnome Terminal, и выполнение в нем оболочки. В этом режиме читаются два файла /etc/bashrc и ~/.bashrc.

 

Неинтерактивная оболочка без входа в систему

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

. /local-script.sh

Неинтерактивная оболочка входа

Этот режим охватывает вход в компьютер с удаленного компьютера, например, через Secure Shell (ssh). Сценарий оболочки local-script.sh сначала запускается локально, а его выходные данные используются как входные данные для ssh.

./local-script.sh | ssh user@remote-system

Запуск ssh без дополнительных команд запускает оболочку входа в систему в удаленной системе. Если устройство ввода (stdin) ssh не является терминальным, ssh запускает неинтерактивную оболочку и интерпретирует вывод сценария как команды, которые должны выполняться в удаленной системе. В приведенном ниже примере выполняется команда uptime в удаленной системе:

$ echo "uptime" | ssh localhost

Pseudo-terminal will not be allocated because stdin is not a terminal.

frank@localhost's password:

The programs included with the Debian GNU/Linux system are free software;

the exact distribution terms for each program are described in the

individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent

permitted by applicable law.

You have new mail.

11:58:49 up 23 days, 11:41,  6 users,  load average: 0,10, 0,14, 0,20

$

Интересно, что ssh жалуется на то, что stdin не является терминалом, и показывает сообщение дня (motd), которое хранится в глобальном файле конфигурации /etc/motd. Чтобы сократить вывод терминала, добавьте параметр «sh» в качестве параметра команды ssh, как показано ниже. В результате сначала открывается оболочка, и сначала выполняются две команды без отображения motd.

$ echo "uptime" | ssh localhost sh

frank@localhost's password:

12:03:39 up 23 days, 11:46,  6 users,  load average: 0,07, 0,09, 0,16

$$

Далее мы рассмотрим различные файлы конфигурации для Bash.

 

Файлы запуска Bash

Различные режимы Bash определяют, какие файлы конфигурации читаются при запуске:

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

Общие сведения о конфигурации оболочки Bash при запуске

изображение : config-path.png
текст: Процесс оценки конфигурации Bash

 

Объяснение различных файлов конфигурации

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

 

/etc/profile

Этот файл используется оболочкой Bourne (sh), а также оболочками, совместимыми с Bourne, такими как Bash, Ash и Ksh. Он содержит записи по умолчанию для переменных среды для всех пользователей, которые входят в систему в интерактивном режиме. Например, это влияет на $PATH и дизайн приглашения для обычных пользователей, а также пользователя с именем «root». В приведенном ниже примере показана часть /etc/profile из Debian GNU/Linux.

setuserpath(){

# Общие каталоги для исполняемых файлов для всех пользователей

PATH="/usr/local/bin:/usr/bin:/bin"

# Тест для корневого пользователя для добавления в программы системного администрирования

if [ "`id -u`" -eq 0 ]; then

PATH="/usr/local/sbin:/usr/sbin:/sbin:$PATH"

else

PATH="/usr/local/games:/usr/games:$PATH"

fi

export PATH

}

setuserpath()

# PS1-это основная строка командной строки

if [ "$PS1" ]; then

if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then

# Файл bash.bashrc уже устанавливает PS1 по умолчанию.

# PS1='\h:\w\$ '

if [ -f /etc/bash.bashrc ]; then

. /etc/bash.bashrc

fi

else

if [ "`id -u`" -eq 0 ]; then

PS1='# '

else

PS1='$ '

fi

fi

fi

Другие файлы конфигурации можно сохранить в каталоге /etc/profile.d. Они загружаются в конфигурацию Bash, как только читается /etc/profile.

 

~/.bash_profile

Этот локальный файл конфигурации считывается и выполняется, когда Bash вызывается как интерактивная оболочка входа. Он содержит команды, которые следует запускать только один раз, например настройку переменной среды $PATH.

Очень часто ~/.bash_profile заполняют строками, как показано ниже, которые являются источником файла .bashrc. Это означает, что каждый раз, когда вы входите в терминал, читается содержимое вашей локальной конфигурации Bash.

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

Если файл ~/.bash_profile существует, то Bash пропустит чтение из ~/.bash_login (или ~/.profile).

~/.bash_login

 

Два файла ~/.bash_profile и ~/.bash_login аналогичны.

~/.profile

 

Большинство дистрибутивов Linux используют этот файл вместо ~/.bash_profile. Он используется для поиска локального файла .bashrc и расширения переменной $PATH.

# при запуске bash

if [ -n "$BASH_VERSION" ]; then

# include .bashrc, если он существует

if [ -f "$HOME/.bashrc" ]; then

. "$HOME/.bashrc"

fi

fi

# установить PATH, чтобы он включал личную корзину пользователя, если она существует

if [ -d "$HOME/bin" ] ; then

PATH="$HOME/bin:$PATH"

fi

Как правило, ~/.profile читается всеми оболочками. Если существует ~/.bash_profile или ~/.bash_login, Bash не будет читать этот файл.

 

/etc/bash.bashrc и ~/.bashrc

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

# не помещайте в историю повторяющиеся строки или строки, начинающиеся с пробела.

# Дополнительные параметры см. В bash (1)

HISTCONTROL=ignoreboth

# добавьте к файлу истории, не перезаписывайте его

shopt -s histappend

# для установки длины истории см. HISTSIZE и HISTFILESIZE в bash(1)

HISTSIZE=1000

HISTFILESIZE=2000

Что настраивать в каком файле

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

определить, какой файл предназначен для хранения определенной части настройки. Вот рекомендации, которые у нас есть для вас (на основе TLDP):

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

Exit mobile version