Termux шаг за шагом (часть 1)

Stellt die bashrc eine Gefahr dar?¶

Die Datei ~/.bashrc kann mit normalen Benutzer-Rechten geändert und manipuliert werden. Malware, ein Virus oder ein Hacker kann ein alias definieren, welches sudo oder su abfängt und so das User-Passwort stehlen kann, um Root-Access auf dem System zu bekommen.

Die Meinungen über die davon ausgehende Gefahr gehen auseinander. Die überwiegende Mehrheit denkt, ein einmal kompromittiertes System sei ohnehin nicht mehr zu retten und ein User solle potentiell gefährliche Skripte oder Programme gar nicht erst ausführen, nicht einmal nur mit normalen Benutzer-Rechten.

Der Mindermeinung zufolge bestehe darin jedoch eine große Gefahr. So sei der Unterschied zwischen Linux und Windows aus sicherheitstechnischer Sicht vor allem wegen der starken Abstraktion zwischen User und Root gegeben. Durch die bashrc und deren Manipulation könne sich jedoch jedes x-beliebige Programm Root-Rechte erschleichen.

Ein mögliches Workaround dazu ist es, die Datei ~/.bashrc (und natürlich auch die ~/.bash_aliases, …, wenn man sie angelegt hat) unveränderlich zu machen, zum Beispiel mit diesem Befehl:

sudo chattr +i ~/.bashrc  

Will man danach eine Änderung an der Datei vornehmen, muss man zuvor erst wieder das -Flag entfernen mit:

sudo chattr -i ~/.bashrc  

Nachdem man die gewünschten Änderungen vorgenommen hat, sollte man die Flag wieder setzen. Oder man arbeitet generell nur mit einem unprivilegierten Benutzer-Account, der nicht Mitglied der Gruppe ist und somit niemals sudo oder su ausführen darf.

Настройка цвета

Bash позволяет добавлять цвета в командную строку при помощи специальных кодов.

Чтобы определить цвет, код нужно поместить в скобки \. Если код цвета не будет заключен в такие скобки, оболочка прочитает его буквально и просто выведет на экран.

Затем цвет нужно задать внутри последовательности скобок \[, например:

или

Перед последовательностью \] нужно добавить m, чтобы указать, что ы задаёте код цвета.

В целом синтаксис настройки цвета выглядит так:

Конечно, такой код выглядит достаточно сложно.

Коды цветов:

  • 30: черный
  • 31: красный
  • 32: зелёный
  • 33: жёлтый
  • 34: синий
  • 35: фиолетовый
  • 36: бирюзовый
  • 37: белый

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

Это поведение отличается зависимости от используемого терминала. Общие атрибуты:

  • 0: обычный текст
  • 1: жирный (зависит от терминала)
  • 4: подчёркивание

К примеру, чтобы получить подчёркнутый зелёный текст, нужно ввести последовательность:

Чтобы сбросить настройки цвета, используйте такую последовательность:

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

Также можно настраивать цвет фона.

  • 40: черный фон
  • 41: красный фон
  • 42: зелёный фон
  • 43: жёлтый фон
  • 44: синий фон
  • 45: фиолетовый фон
  • 46: Cyan фон
  • 47: белый фон

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

Как правило, информацию о фоне лучше отделять от остальных настроек:

Иногда при использовании обычного текста (0) в некоторых терминалах не работают настройки цвета текста. Чтобы обойти эту проблему, нужно просто не вводить настройки нормального текста, так как они используются по умолчанию.

Великий и могучий shell

Мы уже изучили много способов настройки окружения оболочки:

  • Можно выбрать ту командную оболочку UNIX, которая больше нравится. Bourne shell (bash) обладает мощью; другие, такие как Z shell, предлагают новинки и удобные улучшения, которые некоторые пользователи сочтут крайне полезными.

    Чтобы узнать, какие командные оболочки установлены на компьютере, надо запустить команду . Чтобы изменить текущую командную оболочку на любую из списка, следует вызвать команду . Вот пример изменения командной оболочки на /bin/zsh — Z shell. (Пользователь вводил текст, выделенный полужирным шрифтом.)

    $ cat /etc/shells
    /bin/bash
    /bin/csh
    /bin/ksh
    /bin/sh
    /bin/tcsh
    /bin/zsh
    $ chsh -s /bin/zsh
  • Можно создать короткие псевдонимы для часто используемых длинных команд.
  • Переменные окружения, такие как PATH (содержащая пути, по которым ищутся программы) и TZ (которая определяет часовой пояс) сохраняют настройки и влияют на все запускаемые процессы.

    Переменная PATH особенно полезна. Например, если необходимо запустить локальную версию Perl, можно изменить значение PATH так, чтобы запускалась Perl из /usr/local/bin/perl вместо обычно находящейся в /usr/bin/perl стандартной версии Perl.

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

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

    $ ls -l heroes.txt
    -rw-r--r--   1 strike  strike  174 Mar  1 11:25 heroes.txt
    $ ^heroes^villains
    ls -l villians.txt 
    villians.txt

    Здесь команда заменяет слово heroes на villians в непосредственно предшествующей команде (по умолчанию, если номер команды не задан) и в результате запускается команда . Из документации командной оболочки можно узнать подробнее о синтаксисе изменения команд.

  • Можно написать сценарии командной оболочки для выполнения сложных операций, если существующие утилиты UNIX и встроенные команды оболочки не справляются с задачами, которые приходится выполнять регулярно.

Как будет показано в следующих статьях из серии «Использование UNIX», можно также загрузить и скомпилировать невероятное количество дополнительных UNIX-утилит, обычно распространяемых в открытых исходных кодах. Используя Google и Yahoo! в течение нескольких минут, как правило, можно найти и скачать готовое подходящее решение для задачи.

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

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

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

Как изменить цвета в строке приглашения

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

Чтобы задавать цвета для элементов строки приглашения нужно части строки приглашения заключать в специальные символы.

Используется следующий синтаксис:\e[X;YmРАСКРАШИВАЕМАЯ_СТРОКА\e[m

\e[ — начало цветовой схемы.X;Ym — цветовая пара (X;Y). Именно значения X и Y определяют цвет.\e[m — окончание цветовой схемы.

Небольшой пример, чтобы вы понимали о чем идет речь. Раскрасим всю строку целиком цветом с обозначением 0;36.

Цвета задаются числами. Можно задавать парой X;Y или просто Y. Например, красный это — 0;31 или просто 31. Есть и другие способы задания цветов, но в данной статье мы их не рассматриваем.

Список цифровых обозначений для цветов (Y):

Цвет Числовоеобозначение
Black 30
Red 31
Green 32
Brown 33
Blue 34
Purple 35
Cyan 36
Light gray 37
Dark gray 90
Light red 91
Light green 92
Light yellow 93
Light blue 94
Light magenta 95
Light cyan 96
White 97

При задании цвета двумя числами X;Y, первое число X принимает следующие значения:0 — обычный цвет;1 — будет использоваться более яркий цвет;2 — более темный цвет;3 — курсив;4 — подчеркивание;5 — моргание.

Советы по созданию файлов автозагрузки

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

  • Если необходимо использовать какие-то настройки (например, PATH) в каждом экземпляре командной оболочки (независимо от режима), производите эти настройки в ~/.bashrc и используйте , чтобы запускать сценарии из ~/.bash_profile.
  • Если имеются учетные записи на нескольких компьютерах (и домашний каталог копируется через Network File System ), то используйте rsync, чтобы сохранять файлы автозагрузки используемой командной оболочки по сети на все компьютеры.
  • «Если настройки командной оболочки должны зависеть от компьютера, скажем, специальное значение PATH для системы, имеющей специализированные приложения, — сохраните эти настройки в отдельном файле и используйте команду для загрузки этого файла. Если управление файлами выполняется с помощью , исключите этот специализированный компьютер из списка копирования.

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

    case $HOSTNAME in
      lab.area51.org)      
        PATH=/opt/rocketscience/bin:$PATH
        PS1='\u @ \h \# \$ '
        export $PS1;;
      
      alien.area51.org)
        PATH=/opt/alien/sw/bin:$PATH;;
        
      saucer*)
        PATH=/opt/saucer/bin:$PATH
        PAGER=less
        export $PAGER;;
        
      *) 
        PATH=/usr/local/bin:$PATH
    esac
           
    export $PATH

    В этом примере используется оператор switch для выбора значений переменной $HOSTNAME из четырех возможных значений: lab.area51.org, alien.area51.org, шаблона, которому удовлетворяет любое имя, начинающееся строкой (имя компьютера: скажем, saucer-mars будет удовлетворять этому шаблону, а имя sauce.tomato.org — нет) и все остальные имена. Здесь в случае командной оболочки Bash, звездочка (*) интерпретируется как оператор оболочки, а не оператор регулярного выражения. Когда выбор сделан в пользу одного из перечисленных вариантов, переменные окружения инициализируются соответственно выбранному варианту. В отличие от операторов switch в некоторых других языках программирования в Bash будут выполнены операторы только одного из вариантов, перечисленных в case.

Наконец, посмотрим файлы автозагрузки, созданные другими пользователями, чтобы обрести вдохновение и сохранить свои силы. (Некоторые пользователи не дают доступ к этим файлам и своим домашним каталогам, но кто же мешает сделать проверку?). Может, у Джо установлено прикольное и полезное приглашение командной строки? Узнай, как сделать такое же. Может, у Жаннет настроены дополнительные «горячие» клавиши или имеется хорошая коллекция переменных окружения, помогающих воспользоваться специальными особенностями каких-нибудь утилит? Узнайте у нее ее рецепты. Лучший источник идей и кода приходит от опытных практиков командной строки.

Сохранение настроек командной строки

Итак, теперь вы умеете настраивать цветной текст. В руководстве используется такая последовательность:

Также можно отключить использование цвета:

Теперь можно отредактировать переменную PS1 в файле ~/.bashrc:

Как уже говорилось, если вы работаете в окружении chroot, командная строка может сообщить об этом. Эта функция сейчас включена, не отключайте её. Теперь значение переменной будет таким:

Закомментируйте текущее значение PS1 и скопируйте следующую логику debian_chroot:

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

В первом определении PS1 укажите настройки цветной командной строки, во втором – командной строки без цвета.

Сохраните и закройте файл.

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

Rofi как замена dmenu

Rofi ведёт себя подобно dmenu, если вызывается с именем dmenu (через символическую ссылку). Можно установить пакет AUR, который создаёт символическую ссылку dmenu на rofi. После этого программы, вызывающие dmenu (так же как и passmenu из pass), будут использовать rofi вместо dmenu.

Чтобы rofi приобрёл внешний вид, приблизительно похожий на внешний вид dmenu, используйте следующие параметры:

rofi -show run -modi run -location 1 -width 100 \
		 -lines 2 -line-margin 0 -line-padding 1 \
		 -separator-style none -font "mono 10" -columns 9 -bw 0 \
		 -disable-history \
		 -hide-scrollbar \
		 -color-window "#222222, #222222, #b1b4b3" \
		 -color-normal "#222222, #b1b4b3, #222222, #005577, #b1b4b3" \
		 -color-active "#222222, #b1b4b3, #222222, #007763, #b1b4b3" \
		 -color-urgent "#222222, #b1b4b3, #222222, #77003d, #b1b4b3" \
		 -kb-row-select "Tab" -kb-row-tab ""

What is bashrc?

If you run a Unix-based or Unix-like operating system, you likely have bash installed as your default terminal. While many different shells exist, bash is both the most common and, likely, the most popular. If you don’t know what that means, bash interprets your typed input in the Terminal program and runs commands based on your input. It allows for some degree of customization using scripting, which is where bashrc comes in.

In order to load your preferences, bash runs the contents of the bashrc file at each launch. This shell script is found in each user’s home directory. It’s used to save and load your terminal preferences and environmental variables.

Terminal preferences can contain a number of different things. Most commonly, the bashrc file contains aliases that the user always wants available. Aliases allow the user to refer to commands by shorter or alternative names, and can be a huge time-saver for those that work in a terminal regularly.

Продвинутые настройки

Bash — довольно развитый командный интерпретатор, поддерживающий кучу разных настроек. Причем из этих настроек можно получить гораздо больше профита, чем из настроек поведения терминала, выполненных с помощью утилит setterm и stty. Список всех возможных опций можно посмотреть командой «shopt -p» (shopt — сокращение от Shell Options). Приведем самые интересные из них:

  • autocd — если эта опция включена, то можно просто написать путь к каталогу (опустив команду cd), чтобы в него переместиться;
  • cdspell — bash будет пытаться исправлять простые опечатки (например, /ect/init.d вместо /etc/init.d) в аргументах команды cd;;
  • checkjobs — не дает выйти из консоли, пока в ней есть выполняющиеся задания;
  • cmdhist — объединение многострочных команд в одну строку так, чтобы тебе было проще искать их в истории;
  • dirspell — исправление небольших ошибок в написании имени директории при автодополнении;
  • globstar — позволит использовать конструкцию вида **, обозначающую «все файлы, начиная с текущего каталога, рекурсивно»;
  • Очень удобный новый wildchar — например, данная конструкция отобразит все mp3 в текущем и вложенных каталогах:

Согласись, это гораздо короче и удобнее, чем:

Устанавливаются опции следующим образом:

Кроме того:

1.Bash умеет сокращать путь к текущему каталогу в приглашении, если он становится слишком длинным. Для управления этой функцией предусмотрена переменная окружения PROMPT_DIRTRIM. При превышении уровня вложенности каталогов, указанного в этой переменной, путь будет сокращен. Пример использования:

2.Bash поддерживает «умный» метод помещения команд в историю, позволяя освободить ее от банальностей вроде ls. В историю не будут попадать дубликаты и команды ls, bg, fg, exit после выполнения следующей команды:

3. Bash умеет делать так, чтобы команды, выполненные с использованием sudo, автоматически попадали в файл истории root’а и не засоряли историю пользователя. Просто добавь следующую строку в файл /etc/bash.bashrc:

Полезная инфа в приглашении

Приглашение командного интерпретатора bash формируется на основе содержимого переменной окружения PS1. Если верить man-страницам, эта переменная может содержать любые строки, а также довольно большой набор специальных управляющих символов, которые при выводе приглашения будут превращены в актуальные данные. Так, например, в дистрибутиве Ubuntu содержимое переменной PS1 выглядит так:

А при выводе на экран превращается во всем знакомую строку вида:

Нетрудно догадаться, что юзер здесь появляется за счет управляющего символа ‘u’, имя хоста — за счет ‘h’, а текущий каталог — это ‘w’. Неуклюжая запись, содержащая в себе слова debian_chroot, это всего лишь индикатор того, находится ли пользователь в chroot-окружении. Такое лаконичное приглашение, конечно, удобно, но содержит далеко не всю информацию, которую bash способен отобразить. В его арсенале есть как минимум два десятка различных управляющих последовательностей, о которых многие пользователи даже не подозревают. Вот список наиболее интересных из них:

  • d — текущая дата
  • j — количество фоновых заданий
  • A — текущее время
  • ! — номер команды в истории

Кроме того, в PS1 вполне можно использовать текущие переменные окружения, а если учитывать, что перед каждым выводом на экран PS1 перечитывается, то туда можно засунуть такие вкусности, как, например, статус последней выполненной команды (переменная $?), чтобы знать, было ли ее исполнение успешным.

Управляющий символ ‘n’ также допустим в PS1, поэтому приглашение к вводу можно сделать многострочным, а заодно визуально отделить его от остального текста (с помощью начальной пустой строки):

Но и это еще не все. Пример с индикатором chrootокружения показывает, что в приглашении можно использовать вывод любых сторонних приложений, а это открывает просто безграничные возможности по его кастомизации. Например, следующим образом в приглашение можно добавить данные о текущей погоде, количестве непрочитанных писем в gmail и уровне сигнала Wi-Fi:

Где мы?

local city=»Moscow»
curl -s «http://www.google.com/ig/
api?weather=$city» | sed ‘s|.<temp_c data=»
()»/>.*|1|’
}

Имя пользователя и пароль (без @gmail.com)

local login=»логин»
local password=»пароль»
wget —secure-protocol=TLSv1 —timeout=3 -t 1 -q -O — https://${login}:${password}@
mail.google.com/mail/feed/atom —nocheckcertificate | grep fullcount | sed
«s/<fullcount>(.*)</fullcount>/1/»
}

Сигнал Wi-Fi

wifi(){
/sbin/iwconfig wlan0 | grep Quality | cut -d = -f2 | awk ‘{print $1}’
}
PS1=’n:::wn
u@h:$?$ ‘

Все это нужно поместить в конец ~/.bashrc и выставить на файл права 600, чтобы никто не смог подсмотреть пароли. Результат будет примерно таким:

Выполнение команд оболочки из rofi

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

  • настройте переменную в файле , а не (например) в файле , затем перезайдите в менеджер окон или среду рабочего стола;
  • установите параметр . Это позволит вводить команды в поле ввода, а затем после нажатия SHIFT+ENTER терминал останется открытым, пока не будет нажата какая-либо клавиша.

Пример для i3, использующий экранированную последовательность:

 bindsym $mod+d exec --no-startup-id "rofi -show drun -font \\"DejaVu 9\\" -run-shell-command '{terminal} -e \\" {cmd}; read -n 1 -s\\"'"

Настройка приглашения

Для задания различных значений переменной PS1 существуют специальные символы. Комбинируя различные специальные символы можно составить свою строку приглашения.

Специальные символы начинаются с символа косой черты «\», за которой следует буква или символ. Ниже приведена таблица специальных символов.

Обозначение Описание
\a ASCII-символ bell (07)
\d Дата в формате «День недели Месяц Дата» (например, «Пн Ноя 26»)
\D{format} Значение format передается функции strftime. В строку приглашения подставляется результат выполнения функции. Фигурные скобки обязательны.
\e ASCII-символ escape (033)
\h Hostname (имя хоста) до первого символа точка «.».
\H Hostname (имя хоста, компьютера).
\j Количество фоновых процессов, запущенных в данной оболочке
\l Базовое название оболочки.
\n Переход на новую строку.
\r Переход к началу строки (возврат каретки).
\s Имя оболочки (имя shell).
\t Текущее время в 24-часовом формате (HH:MM:SS).
\T Текущее время в 12-часовом формате (HH:MM:SS).
\@ Текущее время в 12-часовом am/pm формате.
\A Текущее время в 24-часовом формате (HH:MM).
\u Имя пользователя.
\v Версия bash (например, 4.4).
\V Версия bash с версией релиза (например, 4.4.19).
\w Текущий абсолютный путь (полный путь). Домашняя директория сокращается до значка тильды «~».
\W Текущий относительный путь. Домашняя директория сокращается до значка тильды «~».
\! Номер команды в истории команд (history).
\# Номер команды в текущей сессии терминала.
\$ Символ приглашения (# для root, $ для обычных пользователей).
\nnn Символ, соответствующий восьмеричному значению nnn.
\\ Символ обратной косой черты «\».
\[ Начало последовательности непечатаемых символов.
\] Конец последовательности.
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *