Консоль в массы. Переход на светлую сторону. Часть первая

  • Tutorial


Вступление


Всем привет! Данная серия статей — это текстовый вариант моего доклада на WSD в Киеве 26 ноября. Решил написать, чтобы дать более развернутое описание темам, которые были затронуты, а некоторые моменты уточнить. Кроме того, есть возможность рассмотреть больше примеров, услышать мнение от тебя, уважаемый читатель. И, конечно же, поделиться информацией с более широкой аудиторией.

План побега


  1. Менеджеры терминалов. Часть первая
  2. Менеджеры терминалов. Часть вторая
  3. Скрипты на bash
  4. Автоматизация рутинных задач

Важный момент. Предполагается, что читатель уже имеет опыт работы с терминалом на *nix OS. В примерах используется много утилит, таких как grep, find, xargs, echo, sed, и другие. На этих утилитах я не буду останавливаться подробно. Также нет задачи рассмотреть все и вся.

У нас большая команда и я часто вижу как одну и ту же задачу люди выполняют по-разному. Это также касается и работы в терминале. Знакомьтесь — это IE6.



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

А вот так большинство пользователей представляют себе терминал. Черный экран, белые символы.



А теперь представьте, что в ваш любимый браузер добавили возможность работать в терминале. В нем вы можете выполнять команды git, npm, node и многие другие. Звучит как что-то нереальное из будущего. А вот и нет.



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

И так, приступим. Какие темы рассмотрим? Рассмотрим менеджеры терминалов. Потом скрипты на bash. И последнее, это как автоматизировать рутину с помощью скриптов на bash.

Репозиторий


Для удобства я создал репозиторий на github со всеми примерами и темами, которые будем рассматривать на протяжении всей серии статей. Так что можно скачать и попрактиковаться.

Слайды


Доступны по этой ссылке. Презентация сделана на движке shower.

Где это все работает


Это все работает на Windows 10 stable, Mac OS X, Ubuntu. Предпочтение отдается Ubuntu. Все примеры я буду показывать в Ubuntu. Также есть классный эмулятор терминала — это ConEmu. Правда, в нем не получится попробовать менеджеры терминалов.

Менеджеры терминалов. Часть первая. Screen


Начнем со screen’а. Познакомился я с ним совершенно случайно. Коллега помогал мне в решении одной задачи. И он увидел, что я не пользуюсь менеджером терминалов. Тогда он сказал: «Хм, давай поправим это.» Установил мне screen, помог настроить и показал парочку базовых сочетаний клавиш.

Установка


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


Базовые сочетания клавиш


Почему я не выводил весь список в статью, а добавил ссылку?! Все просто. Во-первых, они есть в мануале (man screen). Во-вторых, их не нужно учить, запоминать или еще что-то там, просто нужно начать использовать.

Настройки


По умолчанию screen настроен не очень удобно. У него даже нет строки состояния. Выводится сообщение о лицензии и еще некоторые неудобства. Все это можно поправить с помощью файла конфигураций. Разместить его нужно в домашней директории пользователя.


screen в деле


Давайте рассмотрим screen в работе. Как его запустить мы уже знаем. Достаточно набрать screen. Перед этим не забудьте поместить файл настроек в домашнюю директорию пользователя.



  1. Рабочая область. Layout.
  2. Строка состояния. На ней размещаются вкладки и другие элементы.
  3. Вкладка с именем по умолчанию.

Мы рассмотрели начальное состояние screen’а. Давайте теперь рассмотрим его на примере более сложной задачи.



Для этого нам понадобится репозиторий, о котором я упоминал выше. Давайте его склонируем себе на компьютер:

git clone https://github.com/var-bin/terminalForCoder__WSD.git

Далее запустите screen. Нам понадобится 2 — 3 вкладки. Чтобы создать новую вкладку нужно нажать следующие сочетания клавиш:

Ctrl + a, c - создать новую вкладку

Следующим шагом будет переименование вкладок. Для этого используйте:

Ctrl + a, A - переименовать вкладку

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

Ctrl + a, int - переключиться на нужную вкладку (int - номер вкладки 0 - 9)

Или

Ctrl + a, " - интерактивное переключение вкладок

С вкладками немного попрактиковались. Теперь давайте разобьем наш текущий регион на два независимых региона. Делается это с помощью сочетания клавиш:

Ctrl + a, | - разбить текущий регион на два новых по вертикали

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

Ctrl + a, Tab - переключить фокус на следующий регион
Ctrl + a, c - создать новую вкладку

Теперь давайте запустим в том регионе, что слева, к примеру, midnight commander (любую другую утилиту) с помощью команды:

mc

А в том регионе, что справа, запустим наше тестовое приложение. Это простой чат, написанный на node.js и socket.io. Этот пример взят с официального сайта socket.io. Единственное, что я добавил — это немного логирования, чтобы мы видели что оно работает. Для этого нужно перейти в директорию %repoName%/screen/chat-example. И выполнить команды:

npm i
node index.js

%repoName% — имя директории в которую был склонирован репозитой.

Если все хорошо, то вы должны увидеть на экране строку:

listening on localhost:3000

После этого запустите браузер и в новой вкладке перейдите по адресу localhost:3000. Наберите любое сообщение в строке ввода и нажмите Enter. Как видите, все работает и вы видите это сообщение также и в терминале. В том регионе, где выполняли команду node index.js.



И теперь, самое интересное. Давайте сымитируем обрыв связи. Закроем терминал через крестик. Но при этом не закрывайте браузер. И попробуйте отправить еще несколько сообщений. Как видите, все продолжает работать. Это при том, что мы только что закрыли терминал.



Это говорит о том, что screen сохранил сессию и все процессы, которые были запущены. Давайте подключимся к этой сессии обратно. Запустите терминал и выполните команду:

screen -r



Как вы могли заметить, тот layout, который мы создавали раньше, он не сохранился. Это довольно неприятный сюрприз. В настройках screen’a есть команды, которые позволяют настроить сохранение ранее созданного layout’а. Но сколько я не пробовал у меня не завелось. И это ситуация когда у нас две-три вкладки. А представьте себе картину, когда у нас шесть-десять вкладок. Layout разбит на регионы как по вертикали так и по горизонтали. И в самый неподходящий момент у нас происходит обрыв связи. Единственный плюс — это то, что все запущенные процессы сохранятся.

Я долгое время работал без менеджеров терминалов по одной простой причине. Я о них не знал! Считал, что это нормально открывать несколько окон putty (windows + подключение к удаленному серверу) и переключаться между ними с помощью сочетания клавиш Alt + Tab. И как-то пытаться во всем этом хаосе работать.

Теперь о плохом. screen не умеет создавать layout для каждой вкладки. Также screen не умеет сохранять layout, если оборвалась связь или еще что-то там. До версии 4.1 не умел делать разбивку по вертикали (для меня это критично). Когда вы создаете новый регион, то в нем отдельно нужно создавать новое окно (Ctrl+a, c), выполнить переход в нужную директорию и т.д. Чтобы удалить регион тоже нужно помучиться Ctrl+a :remove. Для меня screen был как глоток свежего воздуха посреди мегаполиса. Но чтобы его настроить «под себя», нужно потратить немало времени. И некоторые хотелки так и не получилось запилить в виду ограниченности реализации screen.

Подведем краткий итог. Мы рассмотрели один из популярных менеджеров терминалов, а именно screen. Также мы рассмотрели как его установить, настроить. На примере рассмотрели screen в работе. Еще раз хочу напомнить: если нужно посмотреть какие сочетания клавиш за что отвечают, какие настройки можно еще задать для screen’а, какие можно передавать опции в качестве аргументов screen’у, и многое другое, то выполните команду:

man screen

Забегая немного наперед, в следующей статье мы рассмотрим более продвинутый менеджер терминалов, а именно tmux. Также сравним screen и tmux.

На этом все. Спасибо за внимание. Кто дочитал до конца отдельное спасибо. До встречи в следующей статье.
Поделиться публикацией

Комментарии 42

    +13
    Только сейчас понял анекдот про чукчу объясняющему другому чукче, что такое трамвай. «Яблоко знашь? Совсем не похож!»

    Сумбурно все написанно. Причем тут IE?
      +4

      А мне не понятно зачем надо было писать ещё одну статью про screen, если в потом будет ещё одна статья про tmux.

        0

        Добрый день.
        Потому что информации много. Если писать все в одну статью, то для конечного читателя будет сложно читать.

          +2

          зачем вообще начинать со скринов? Показывать, как их настраивать и сразу вызывать головокружения у новичка от не самых легких строк состояния.


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

        0

        Добрый день. Спасибо за вопрос. IE здесь приводится в пример. Если бы у вас не было вкладок. Точно так же, без screen'а у вас недоступна возможность работы с вкладками в терминале.

        +1
        без screen'а у вас недоступна возможность работы с вкладками в терминале

        Может глупость спрошу, но "открыть новую вкладку" в окне стандартного терминала, например, в Ubuntu — это не работа с вкладками? Или тут "вкладка" в терминале — это нечто большее чем просто вкладка в окне терминала? Ну, например, сохранение сессий, восстановление вкладок и т. д.?

          0

          Добрый день.
          Ждал этого вопроса =). Да, согласен, что вкладками никого не удивишь. Тут именно вся соль в том, что screen умеет сохранять сессии, процессы, восстанавливать вкладки, разделять layout на несколько независимых регионов и много других полезных мелочей. В статье про tmux кроме всего прочего будет показано, как настроить сохранение сессий для ssh. Если оборвалась сессия, то он все сохраняет и не требует повторного ввода пароля. Как это может быть со стандартным терминалом.

            +2
            Какого ещё пароля? Вы ещё ssh ключами не пользуетесь что ли? 2017 год уже на носу.
              0

              Добрый день.
              Да, нужно было уточнить. Опять же, при работе через putty. Если происходит обрыв связи, даже, при соединении по ssh. При следующем подключении к сессии, неважно, screen, tmux или еще что-то там, то без дополнительной магии терминал, вас вежливо попросит ввести пароль. И нужно будет перезапустить сессию заново.

                +2
                Вы не поняли вопрос. Паролями при соединении по SSH сейчас никто не пользуется. Точнее никто не должен пользоваться кроме очень редких случаев (например первый коннект к чистому серверу).

                Следующее действие, что нужно сделать — установить ключ ssh и запретить коннект по паролю.

                А по теме статьи: нет смысла рассматривать screen, если есть в планах рассматривать tmux.

                P.S. А еще есть byobu
                  0
                  Добрый день.
            0
            Автору может быть интересен screenie. Визуализирует сессии.
              0

              Добрый день.
              Спасибо за совет. Пробовал, довольно интересно. Интерактивная надстройка над screen'ом. Если и начинать им пользоваться, то уже после того, как достаточно долгое время используешь screen. А то будет слишком много магии =)

              0
              Почему скрипты именно на bash?
                0

                Добрый вечер.
                Спасибо за вопрос. Все просто — в 99% когда вы садитесь за компьютер, который работает на *nix подобных OS, оболочка по умолчанию, которая обрабатывает команды пользователя будет bash. Конечно, есть еще такая оболочка как zsh, но это уже совсем другая история.

                  +1
                  Ну да, 99%, но ведь есть ещё оставшийся 1%. И bash не стандартизирован, лично я считаю что стоит писать скрипты на POSIX sh, потому что он стандартизирован и есть миллион различных совместимых реализаций.
                +1
                Для тех, кто работает под linux — есть terminator.
                Совершенно внезапно он умеет обходится без кучи putty окон, а разбиение окон очень быстро делается в процессе работы.
                Из минусов — в моём случае потребовалось изменить прямо в исходнике применение клавиш мышки (говорят, что в свежей версии у автора есть требуемая галочка в меню) и клавиши для перемещения между окнами(мне удобней ctrl+стрелка) и вставку из клипборда на ctrl+v.

                Ну и, правильно заметили выше — вместо screen — лучше tmux — ctrl+a я использую часто, а вот ctrl+b — не используем и хорошо подходит для контрольной последовательности.
                  0

                  Добрый вечер.
                  Спасибо за совет. Довольно интересная утилита. Наверное, в скором будущем буду ее пробовать. Серьезный претендент, чтобы заменить tmux.

                    0
                    Для тех, кто работает под linux — есть terminator.

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

                    Упоминая screen и tmux автору надо было акцентировать внимание на том, что означенные инструменты пригодны для использования и в «голой» консоли, без иксов.
                      0
                      А для Mac OS есть шикарный iTerm, который умеет такие же вкладки :)
                        0
                        Ну для macOS много хороших вариантов есть. Мой фаворит TotalTermial, киллер фича ввиде выпадающей панельки в любой момент очень нравится!
                        +2

                        Вместо <C-a> можно использовать что‐то ещё в screen, как и вместо <C-b> в tmux. Это настраивается. А вот тот же statusline в tmux менее ограничен, а настройки более понятны (кроме того, часто можно заменить малопонятное сокращение на что‐то более читаемое: к примеру, #D на более понятное #{pane_id}). И проблема с сохранением layout: использую tmux, здесь такого нет. Даже не знал, что в screen есть.

                        • НЛО прилетело и опубликовало эту надпись здесь
                            +1
                            Даже если есть необходимость в putty, то под Windows есть ConEmu, в котором есть вкладки, сохранение сессий и многое другое.
                              –1

                              Добрый день.
                              Если вы внимательно читали статью, то в ней есть упоминание ConEmu. И ConEmu не есть полноценная замена putty. ConEmu — это уже больше для использования в своих целях, на своей машине. А вот если вы работаете в офисе, где вам отрезаны права на использование usb, установка софта и прочие ограничения, то putty (опять же windows) самая крутая штука, что может быть, для подключения к удаленному серверу.
                              Если вы на Windows 10, то там есть возможность использовать команды *nix OS, только нужно включить Developer Mode и дождаться, когда все закачается. Пруффы: раз, два

                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  причем разработчик использует windows, но ему зачем-то при этом нужно логиниться на nix…


                                  Ну надо заметить не такая уж и редкая ситуация. Если честно, и сам так работаю IDE на windows хосте, а код на удаленных VPS под linux.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      0
                                      Ну а какая мне разница под какой ОС работает у меня PhpStorm и браузер. Все равно ведь, весь код и среда исполнения у меня на удаленных серверах. Ну да немного напрягает в Windows отсутствие ssh из коробки, но плюсом для меня идет ms office и терабайт места в облаке.

                                      Какие плюсы мне как веб разработчику дает linux или допустим macos на рабочей машине? Мне абсолютно все равно, что у меня установлено linux, либо же windows. Например на работе на десктопе и ноутбуке у меня ubuntu с xfce, дома на десктопе и ноутбуке windows10, и если честно, то для работы особой разницы не вижу. Все равно и там и там 90% времени открыт PhpStorm и браузер.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          Вы правильно заметили, XX век закончился. Настало время облачных платформ и сервисов облачных вычислений, а также VPS по 3 евро штука и безлимитного высокоскоростного интернета. Если я вас правильно понимаю, то вы все еще тестируете свои проекты у себя на локалхосте, разворачивая там все рабочее окружение, а затем размещаете на shared хостинге? С моей точки зрения это как минимум странно, если это так. Я не пытаюсь вам навязывать свою точку зрения, но все таки попробуйте облака, это действительно удобно и возможно вам понравиться.
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Мне известно, что ConEmu не есть замена putty и про подсистему linux в windows 10, тоже знаю. Я просто ответил на комментарий о куче окон при использовании putty.
                                +1
                                > вместо screen — лучше tmux — ctrl+a я использую часто, а вот ctrl+b — не используем и хорошо подходит для контрольной последовательности.

                                Всё почти наоборот. screen'у элементарно заменить переключающую последовательность — опции типа -e ^ba (для Ctrl+B) и так далее; есть и умолчание для screenrc. Я не пользуюсь Ctrl+A, у меня в зависимости от места Ctrl+F, B, N, местами ещё более редкие.

                                tmux'у с некоторых пор это тоже делается, но сильно более громоздко — например, для новой сессии надо сказать

                                tmux new-session \; set-option prefix ^n


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

                                Ещё из специфичного, что нужно мне — при общем utf-8, есть контексты, в которых надо запускать терминалы под koi8. Screen умеет перекодировки в обе стороны (и я ему ещё и koi8-u добавлял), tmux — нет.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0

                                  Добрый день.


                                  Не, ну серьезно, можно же предложение «screen лучше, чем putty — чем лучше?

                                  Вот тут не понятно. screen не есть замена putty. Он не лучше и не хуже putty. Это немного два разных инструмента.


                                  Единственное ценное, что есть в статье — объяснение настройки screen. Oh, wait… Объяснения почему-то нет, а есть магия «скопируйте вот это вот туда»..

                                  Сначала хотел описать за что какой конфиг отвечает. Но потом понял, что я просто перепишу мануал на русский. Если что-то непонятно, то man screen поможет на счет раз.
                                  Что означают непонятные символы в этой строке hardstatus string "%-w%{= BW}%50>%n %t%{-}%+w%<" можно почитать тут

                                  +1
                                  Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)
                                    0

                                    tmux тоже это умеет.


                                    Кстати, некоторые сейчас рассматривают Neovim как замену screen и tmux: возможности :terminal буферов вместе с остальными возможностями *Vim, в принципе, это позволяют.

                                    0
                                    Автор забыл упомянуть шикарную фишку screen — возможность «расшарить» экран на двух и более пользователей (screen -x). Это полезно для обучения опытным пользователем новичка (а только именно так и возможно эффективно изучать Linux)
                                      0

                                      Добрый день.
                                      Да, действительно, есть такая фича. Но до ее использования нужно дойти. Не хотелось грузить лишней информацией. Для новичка она лишняя. А вот опытный пользователь и сам про нее знает =). Только нужно использовать ее осторожно, на свой страх и риск.

                                      0

                                      А насчет продолжения, первый же результат в гугле по запросу tmux:
                                      Краткая шпаргалка по tmux (менеджеру терминалов)

                                        –1

                                        Добрый день.
                                        Спасибо за ссылку. Добавлю ее в полезные ссылки для следующей статьи.

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

                                      Самое читаемое