Работа с терминалом; пример простого проекта
Ещё немного про secure shell
- Ключ (повторение)
- Запароленный ключ; в чём разница с паролями на хостах?
- Агент, хранящий распароленный ключ
- Порт агента, хранящего распароленный ключ
- Проброс порта агента, хранящего распароленный ключ
- Дальнейший проброс порта агента, хранящего распароленный ключ
вы издеваетесь?
- Дальнейший проброс порта агента, хранящего распароленный ключ
- Проброс порта агента, хранящего распароленный ключ
- Порт агента, хранящего распароленный ключ
- Агент, хранящий распароленный ключ
- Запароленный ключ; в чём разница с паролями на хостах?
- Бонус: проброс других портов
Терминал
- В/В байтов
- Управление со стороны ОС (сигналы с клавиатуры),
stty
- Управление выводом со стороны приложения, ESC-последовательности
- Немного истории
terminfo(/termcap); tput
- изменение атрибутов текста
- позиционирование курсора
Проблемы с неправильным $TERM
Неожиданный бонус Tektronix_4010:
если вы используете xterm, просто скачайте этот файл и скажите ему cat:
$ cat map.tek.xterm
Хуже не будет
Для пользователей xterm в дистрибутивах линейки ALT (возможно, и для других тоже) — сценарий на shell, который показывает все .tek-файлы в заданном каталоге (по умолчанию — в документации по xterm).
Curses
(кому интересно) Учебник на русском
(кому интересно) Учебник на английском
(кому интересно) Учебник от автора ncurses
NCurses — свободная (на сегодняшний день, главная) реализация Curses
- Curses: библиотека работы с произвольным терминалом
- Независимость от типа терминала
- Экран = матрица символов (а не телетайп)
Важно — функции вывода заполняют эту воображаемую матрицу (а не настоящий экран), экран обновляется отдельной командой.
- Простой пример:
Сборка: cc Hello.c -lcurses -o Hello
initscr() / endwin() — инициализация и останов движка curses
move() — перемещение курсора, LINES/COLS — размер экрана
addstr() — аналог puts()
(никогда больше не используем -lcurses)
- Если надо по-русски, программа должна установить локаль:
Сборка — с libncursesw: cc Hello.c -lncursesw -o Hello
- Пример с окном
1 #include <ncurses.h> 2 3 #define DX 3 4 5 void main() { 6 WINDOW *win; 7 int c = 0; 8 9 initscr(); 10 noecho(); 11 cbreak(); 12 printw("Window:"); 13 refresh(); 14 15 win = newwin(LINES-2*DX, COLS-2*DX, DX, DX); 16 keypad(win, TRUE); 17 scrollok (win, TRUE); 18 do { 19 wprintw(win, " Key: %d, Name: %s\n", c, keyname(c)); 20 box(win, 0, 0); 21 wrefresh(win); 22 } while((c = wgetch(win)) != 27); 23 24 endwin(); 25 26 }
Поэкспериментируйте (попробуйте не включать) noecho(), keypad(), scrollok(). Что делают эти функции?
Примитивный Makefile:
- Make (очень коротко): цели и рецепты
Синтаксис: обязательный символ табуляции в рецептах
- Задача — запуск команд пересборки, когда это надо
- Цели могут быть, а могут не быть файлами
- Пример:
- Использование:
1 $ make 2 cc Window.c -o Window -lncursesw 3 $ ls 4 a.out Hello.c~ Makefile~ win.c Window.c WindowEx.c 5 Hello.c Makefile simple.c Window Window.c~ 6 $ make 7 make: «Window» не требует обновления. 8 $ make clean 9 rm -f *~ *.o Window a.out 10 $ ls 11 Hello.c Makefile simple.c win.c Window.c WindowEx.c 12 $ make 13 cc Window.c -o Window -lncursesw 14 $ ls 15 Hello.c Makefile simple.c win.c Window Window.c WindowEx.c 16
Д/З
(для сдающих спецкурс, кто ещё не сделал этого) Зарегистрировать свой репозиторий в качестве комментария здесь
Сделать в репозитории подкаталог, совпадающий с именем данной страницы (03_TerminalProject, и поместить в него решение следующей задачи.
С помощью интернета и здравого смысла написать на ncurses программу Show.c, которая постранично просматривает файл (слишком длинные строки усекаются или переносятся — как вам удобнее).
- Имя файла передавать параметром командной строки.
- Файл должен показываться в окне, а в первой строке экрана должно содержаться его имя.
Весь файл допустимо хранить в памяти, например, одним куском или в виде списка строк.
При нажатии пробела файл прокручивается дальше (если есть такая возможность), при нажатии ESC программа завершается.
Имеет смысл очищать окно при помощи werase(), а потом всё заново на нём выводить.
- Многобайтовую кодировку можно не поддерживать
Сделать Makefile и добиться работоспособности make (обратите внимание на использование табуляций; понадобится на следующей лекции)
- Не забыть опубликовать решение в репозитории!
Дополнительно, для тех, кому стало интересно:
- При нажатии стрелки вправо выводить строки файла, начиная со следующей колонки (так можно посмотреть урезанные длинные строки; начала строк при этом не видны). Стрелку влево обработать так же.
Реализовать обработку PgUp, PgDown и стрелок вверх/вниз — прокрутка на один экран вперёд/назад, на одну строку вперёд-назад, остальные клавиши игнорировать
Так как-то