Терминалы, оболочки, консоли и командные строки
Оригинал: Terminals, shells, consoles, and command lines
Автор: Seth Kenlon (Red Hat).
Дата публикации: 23 марта 2020 г.
Перевод: В.Костромин
Дата перевода: 12 мая 2020 г.
Терминалы, оболочки, консоли и командные строки связаны, но эти термины не являются синонимами. Сет Кенлон объясняет различия.
Если вы изучаете Linux или Unix, вы могли встречать термины «терминал», «командная строка», «оболочка» и «консоль», и у вас может быть справедливое замешательство относительно того, что есть что, и обозначают ли эти слова одно и то же. Определенно эти термины связаны, но есть нюансы и различия, которые могут иметь важные последствия. В этой статье вы найдете необходимые разъяснения.
Как работают компьютеры
Когда компьютер запускается, ядро ОС распознает его физические устройства и обеспечивает возможность взаимодействия между ними. Существует много разных ядер: давным-давно было ядро Unix, ядро Sun, ядро BSD, а позже появилось ядро Linux, ядро Hurd, ядро Mach и ядро NT.
И это еще не всё. Существуют специализированные ядра для различных типов вычислительных устройств. Некоторые из них совсем простые, другие очень сложные. Все зависит от потребностей устройств, на которых они запускаются.
Самый базовый набор инструкций для компьютера поддерживает его во включенном состоянии. Драйверы устройств, управляемые ядром, следят за вентиляторами, предотвращая перегрев, мониторят использование дискового пространства, управляют состоянием оперативной памяти, обнаруживают новые устройства и так далее. Самые первые компьютеры в состоянии простоя делали даже меньше этого, и каждая программа, которая запускалась на ранних моделях компьютеров, была единственной целью использования компьютера, по крайней мере на то время, пока эта программа (в виде колоды перфокарт) исполнялась. Возможность запуска фонового задания или двух приложений одновременно была невообразимой. Если вы хотели запустить два процесса одновременно, вы должны были использовать второй компьютер.
Интерактивная оболочка
Однако по мере развития комьютеров, некоторые ученые осознали, что использование компьютера для выполнения одной задачи при каждом его запуске является неэффективным и, с развитием технологий, нерациональным использованием его мощности. Поэтому они разработали нечто, что они назвали оболочкой — shell.
Существуют разные версии того, почему был выбран термин «оболочка», самое правдоподобное и удовлетворительное объяснение состоит в том, что интерфейс оболочки окружает ядро так же, как ореховая скорлупа окружает орех. Оболочка — это та часть, с которой взаимодействует пользователь, а запросы на вычислительную мощность управляются ядром.
Когда мы говорим об оболочке, важно понимать, что ее появление определило новый этап в развитии компьютерных технологий. Оболочка превратила компьютер из изолированного прибора в мощный инструмент, который может менять свою функцию по требованию. Компьютеры стали интерактивными. Даже в современных компьютерах оболочка — это самый низкий уровень взаимодействия пользователя с компьютером. Это самый прямой способ проинструктировать компьютер о том, что вы хотите делать дальше, поэтому умение использовать возможности оболочки является бесценным знанием для опытных пользователей.
Оболочка является абстрактной концепцией для многих людей. Когда мы думаем или говорим об оболочке, полезно иметь в виду какую-то конкретную. Их много и есть из чего выбрать. Самая популярная — это (GNU) Bash, но альтернативой ей могут служть Zsh и Fish. Tcsh и Ksh — это надежные старые фавориты ранних версий UNIX со строгим соответствием POSIX. Ash и Dash стремятся быть легкими и быстрыми, что делает их идеальными для встраиваемых систем и для минимальных сред. Powershell от Microsoft — это основанная на .NET оболочка с открытым кодом.
Командная строка
Когда вы обращаетесь к оболочке, вы видите вначале приглашение. Некоторые называют приглашение оболочки командной строкой, что понятно: приглашение появляется в строке, в которой вы можете ввести (набрать, напечатать) какую-то команду.
Приглашение представляет собой некоторый символ, который дает вам понять, что оболочка ожидает ваших инструкций. Обычно это символ доллара ( $ ), но это может быть также символ процента ( % ), угловая скобка ( > ), знак числа ( # ) или что-то еще. То есть приглашение оболочки может выглядеть примерно следующим образом:
Одно из заметных различий между оболочками заключается в синтаксисе. Например, в Bash, Zsh, Ash и Ksh значения переменных задаются с помощью знака равенства:
В Tcsh, однако, используется ключевое слово set :
Помощь
На первый взгляд интерфейс оболочки не очень удобен для пользователя, потому что кажется, что вы должны заранее точно знать, что вы хотите делать с помощью оболочки. Это не то, к чему привыкло большинство современных компьютерщиков, потому что графические приложения по крайней мере предоставляют пользователям кнопки и меню, которые можно исследовать, даже не зная точно, что делает приложение.
Даже если пользователь понимает, что оболочка ожидает ввода, попытка ввести какое-то слово английского или другого языка, приводит либо к выводу сообщения об ошибке, либо какой-то бессмыслицы.
Даже если вы введете команду help в ответ на приглашение Bash, вы получите только список встроенных команд, только немногие из которых могут показаться полезными для дальнейшего взаимодействия с оболочкой.
В этом смысле оболочка не похожа на привычные для вас приложения. Она действительно для большинства просто командная строка: строка, в которой вы можете набрать какую-то команду. Пользователь должен знать, какие команды доступны, и предполагается, что пользователь, открывающий оболочку, ознакомился по крайней мере с самыми простыми командами, чтобы с их помощью он мог больше узнать о системе.
Поскольку пользователь не всегда имеет даже необходимый минимум знаний, в публичных системах заменяют не всегда полезную команду help на что-то более информативное, например, на shellp.
Консоль
В Linux или BSD вы можете получить доступ к оболочке не запуская графическое окружение вообще (то есть оболочка — это все, что будет вам доступно), либо набрав сочетание клавиш Alt+Shift с одной из функциональных клавиш от F2 до F6. Каждая из этих функциональных клавиш открывает для вас экран, предоставляемый getty (или agetty, или еще чем-то подобным, в зависимости от того, что используется в вашем дистрибутиве). На этом экране отображается приглашение для входа в оболочку, и этот экран часто называют консолью. Строго говоря, это сеанс getty или эмулированное tty-устройство.
На Mac нет никакого способа отказаться от запуска графического интерфейса в работающей системе, хотя во время загрузки вы можете использовать специальные (snag) клавиши для загрузки в однопользовательском режиме. В однопользовательском режиме в Mac OS отключены многие функции, в том числе управление пользователями, поэтому обычно это не рекомендуется.
Наиболее распространенный способ доступа к оболочке на современных компьютерах — это открыть эмулятор терминала, в котором запускается оболочка.
Терминал
Терминал исторически был физическим устройством, которое использовалось еще до того, как появилась концепция персонального компьютера (ПК). Терминал был в чем-то похож на современный компьютер, но на самом деле это был просто экран (иногда даже просто принтер!) с подключенной клавиатурой. Окно терминала на современном компьютере является эмуляцией этого исторического объекта, и вы обычно можете запустить любую оболочку внутри эмулятора терминала.
Например, на рабочем столе Linux вы можете запустить один экземпляр терминала GNOME (GNOME Terminal), который будет служить окном для доступа к оболочке Bash, и другой экземпляр терминала GNOME, который послужит окном в оболочку Tcsh.
Сам терминал служит только для запуска работающей оболочки. Эмулятор терминала не обрабатывает данные и не запускает команды, хотя он может добавлять функции пользовательского интерфейса, такие как специальные сочетания клавиш, возможность перетаскивания файлов в оболочку, цветовые темы и т.д.
Существует множество эмуляторов терминала для любой операционной системы. Настольные компьютеры с Linux и BSD поставляются с xterm в качестве запасного варианта и обычно включают современный эмулятор для ежедневного использования (например, GNOME Terminal, Konsole и т.д.). Mac OS поставляется с проприетарным эмулятором терминала, но существует намного лучшая замена — iTerm2 (поставляется под лицензией GPLv2).
Windows по умолчанию включает PowerShell, но существует много возможностей замены этого эмулятора программами с открытым кодом, такими как ConEmu или Cmder.
Источник
Linux=Terminal?
Несколько десятилетий прошло с момента релиза первого рабочего стола пользователя, где с помощью манипулятора-мыши появилась возможность выбирать различные части интерфейса, взаимодействовать с ними, вводить данные. Это был прорыв, определивший, как будет выглядеть пользовательское взаимодействие с современной операционной системой еще долгие годы. Сегодня без этой фичи сложно представить пользовательскую операционную систему. Визуальный рабочий стол стал для большинства пользователей основным способом знакомства с компьютерными технологиями и операционной системой.
Для более продвинутого администрирования системы пользователю так или иначе придется сделать шаг назад и обратиться к специализированному и менее визуализированному интерфейсу — консоли. В разных операционных системах этот интерфейс может называться по разному. В текущей статье обратимся к Terminal-у в ОС Linux. Операционная система Linux до сегодняшнего дня сохраняет особое отношение к Terminal-у, без него не получится установить приложение, настроить часы, осуществить поиск машин в сети и так далее. Начинающему пользователю или администратору может быть сложно ориентироваться в мире Terminal без окон, поэтому цель данной статьи — рассказать, как можно заполучить от операционной системы хотя бы примитивный рабочий стол и даже запустить приложение, которое требует наличия окон, в терминале.
Тестовое окружение
Для демонстрации настроек и работы с системами операционной системы Linux будем использовать Ubuntu 20.04 Server версию. Необходимо установить базовую систему и создать обычного пользователя. В результате должно получиться нечто похожее на снимок ниже:
Для подготовки лабораторной операционной системы также потребуется установить дополнительное ПО на сервер. Это будет Xvfb и Xpra (их описание будет в статье далее). Установить их можно соответствующими командами:
apt-get update && apt-get -y install xvfb imagemagick (последний нужен для корректного преобразования памяти в картинку)
apt-get update && apt-get -y install xpra
Проверка и отчасти демонстрация результатов может производиться на любом хосте в сети с сервером. Для тестов в качестве второй машины использовалась операционная система Kali Linux, включенная в локальную сеть вместе с Ubuntu сервером.
Создаем рабочий стол
Инструменты xpra и xvfb были созданы в первую очередь для тестирования ОС и её окружения. Однако, с появлением целого сообщества этих инструментов, их использование значительно расширилось.
xvfb — приложение, которое создано для работы с графикой на тех системах, где даже на уровне железа может и не быть видеокарты или другого устройства вывода. Все операции инструмент проводит в оперативной памяти. Применение инструмента нашлось в рендеринге, фоновых операциях с графикой. Стоит заметить, что это ПО даёт только лишь возможность взглянуть на экран, но не имеет инструментов для взаимодействия с его интерфейсами. Поэтому, чтобы картинка менялась, придется немного покодить для автоматизации. К примеру, для браузера можно использовать скрипты для Selenium.
Продемонстрируем, как можно выстроить работу с помощью xvfb . Главной единицей взаимодействия для данной тулзы является устройство Screen или просто экран. По умолчанию существует только один экран с разрешением 1280x1024x8 (ШиринаХВысотаХГлубина). Выполним следующие команды на сервере:
1. Установим X11 приложения — apt install x11-apps . Нам понадобится калькулятор для демонстрации интерфейса.
2. Откроем экран для отрисовки калькулятора:
3. Запустим калькулятор на созданном экране — DISPLAY=$DISPLAY /usr/bin/xcalc &
4. Создадим из экрана картинку, которую можно будет просмотреть на клиенте —
Выполним команду на клиенте, чтобы увидеть результат:
Выглядит не слишком современно, но это уже больше, чем просто консоль. На снимке слева — калькулятор, который был захвачен из xvfb буфера, а справа — оригинальный калькулятор, который был запущен в клиентской системе. Вообщем-то ничего важного при визуализации потеряно не было, как будто просто черно-белый экран. Проверим, что можно сделать с помощью других инструментов.
Xpra в противовес инструменту xvfb имеет полный функционал по взаимодействию с системой. Можно сказать, это своеобразный аналог VNC, который может использовать в качестве транспорта протокол ssh, tcp и несколько других, достаточно лишь настроить на целевой системе сервер для приема соединения, а на клиенте использовать верный протокол для взаимодействия. Оставим эту настройку для читателя (тестирование на виртуальных машинах не рекомендуется, так как у ПО есть проблемы с поддержкой, виртуальные машины просто зависают). А в качестве второго эксперимента проведем печать интерфейса приложения прямо из запущенного контейнера Docker.
Для проведения этого теста нам понадобится установить Docker для операционной системы Ubuntu. Инструкции к его установке можно найти вот здесь. В инструкции достаточно подробное описание, потому перейдем сразу к этапу создания Image, который будет использоваться для контейнера целевой машины. Для создания контейнера нам нужно сделать файл “Dockerfile” и наполнить его следующими данными:
Для завершения эксперимента нужно снова запустить команды для создания файла png и скопировать его на клиентскую машину. В результате получаем такой же скриншот:
Вместо заключения
В очередной раз операционная система Linux доказала свою многогранность и возможность применять различные неожиданные решения. Новичкам нужно только найти правильный набор ПО, и с ним можно будет решить любую задачу — даже просмотр пользовательского интерфейса на сервере, в котором нет видеокарты.
Данная статья была написана в преддверии старта курса Administrator Linux. Basic от OTUS. Узнать подробнее о курсе и посетить бесплатный урок можно по этой ссылке.
Источник
Краткое введение в терминалы и консоль
Тут живут драконы и нет ментейнеров (вместо эпиграфа)
Очень сжатое боевое описание «что есть псевдо-терминал» и «консоль».
Итак, во-первых, определимся с тем, что такое консоль: консоль это программа, которая принимает от пользователя кнопки, а от соединения с компьютером — буквы на экран и спец. команды по рисованию картинки на экране.
Терминал — обобщённое название как программы, так и специальной железки (таких больше нет в природе). Особое исключение — когда вы запускаете путти или ещё кого-то для подключения к последовательному порту коммутатора/рутера/модема (или даже сервера), то вы выступаете (точнее компьютер с путти выступает) в роли терминала (название «терминал» — потому что терминирует кабель (то есть висит на самом конце) ).
Как легко понять по кабелю, есть два конца: терминал и то, что ему посылает байтики в кабель.
Когда запускается шелл, то он получает в своё распоряжение виртуальное устройство /dev/tty, которое у каждого процесса своё — это «обратная» часть терминала. Передняя часть в случае кабеля реализуется путти+компьютер, в случае консоли компьютера, специализированным ядерным драйвером (виртуальными консолями). Важно: драйвер эмулирует наличие терминала.
Существует интерфейс unix98 (/dev/ptmx), который позволяет создать парочку из «входа и выхода» для всех обратившихся программ. В этом случае одна половинка изображает из себя «обратную» половинку, а вторая — консоль. Используется, в частности, openssh’ем и x’овыми терминалками.
В этом месте много путаницы, но правило простое: с одной стороны тот, кто рисует, с другой — тот, кто говорит, что рисовать. С той стороны, с которой рисуют, с той же находится и пользователь с клавиатурой. Его данные поступают на противоположную сторону к программе.
В качестве самой частой программы со стороны «программы» выступает getty разных видов (mgetty, agetty и т.д.), задачей которой является выставление скорости работы канала и запуск команды login для ввода пароля.
В качестве передней части (рисующей байтики) выступает либо виртуальная консоль линукса, либо программа-терминалка (почти любая), либо находящийся за последовательным шнурком терминал (например, другой компьютер).
Каждое устройство по рисованию (терминал, виртуальная консоль и т.д.) имеют свой набор возможностей (поддерживаемых символов и команд). Тип терминала задаётся переменной TERM, но только в смысле, что он говорит программам, с каким терминалом они работают. Невозможно переменной TERM заставить терминал эмулировать другие терминалы — он про эту переменную ничего не знает.
Внезапное применение: KVM, XEN (и, я не уверен, но, кажется, OpenVZ) используют этот механизм для доступа к консоли виртуальных машин: в виртуальной машине создаётся специализированное устройство, взаимодействующее с демоном в dom0. С точки зрения domU — у него есть последовательное устройство для терминала. Чтобы на этом устройстве увидеть строчку login, нужно прописать в inittab строчку с вызовом getty и разрешить логин (/etc/securetty).
В dom0 демон видит последовательное устройство от domU, создаёт соответствующий псевдотерминал с помощью /dev/ptmx). Созданные устройства для подключения терминалов появляются в /dev/pts/*. Помимо этого consoled пишет в xenstore кому какой домен соответствует, специализированные терминалки (xenconsole) умеют это читать и выполнять. Когда даётся команда xl console (xm console), то она всего лишь вызывает xenconsole с заданным параметром.
Вместо xenconsoled можно использовать любую другую терминалку — хоть minicom, хоть cu, хоть socat, хоть putty. После подключения к консоли правильным является задать тип используемой консоли (set TERM=linux или set TERM=xterm, установка в vt100 даст чёрно-белый экран).
Ровно так же можно организовать подключение к машине по модему (если кто их ещё помнит) — модемы просто «удлиняют» последовательный порт на N километров. С одной стороны нужно настроить модем на автоответ и повесить mgetty (и не забыть про /etc/securetty), с другой стороны нужно набрать номер и получить обычное сообщение login.
Это было очень сжатое и которое описание псевдотерминалов. Полное почти невозможно, ибо для полного понимания как это работает нужно начинать с телетайпов и устройства механических печатных машинок.
Основным моментом, который нужно осознать, является то, что в tty всегда есть два участника, один из которых умеет рисовать (сам, или выбрасывая содержимое на экран так, чтобы терминалка пользователя это нарисовала), а другой — даёт команды что рисовать и принимает последовательности нажатия кнопок.
Источник