Контрольные вопросы

Список вопросов

+++++++++++++
Программа man форматирует и выдает в интерактивном режиме справочную информацию, например man cat выдает опции команды cat.
На сочетания клавиш ^C она не реагирует, ^D интерпретирует как PgDown. Как из неё выйти, не зная команды на выход?
+++++++++++++
Предположим, что в файле /etc/passwd есть запись
user123:x:10123:500:special user:/:/usr/bin/bc
Что сможет сделать пользователь user123, получив доступ через терминал?
+++++++++++++
Напишите команды, выполняющие следующие действия:

Выдать на экран слово «file»

Выдать на экран содержимое файла с именем «file»

Одной командой выдать на экран содержимое нескольких файлов «file1» «file2» «file3»

Одной командой выдать на экран содержимое всех файлов в каталоге /tmp имена которых начинаются с «file1»

Выбрать из вывода предыдущей команды все строки содержащие слово «make» и показать на экране последние четыре строки из отобранных
+++++++++++++++++++++++++++++
Как создать файл с именем «???»

Как удалить все файлы, имя которых имеет длину 3 символа и начинается с вопроса?

Как удалить в текущем каталоге все файлы и подкаталоги, имя которых начинается с точки?

Как удалить в текущем каталоге ВСЕ файлы и подкаталоги?

++++++++++++++++++++++++++++
Что выведут команды echo?

A='*'
echo "$A"

echo '$A'

echo $A

+++++++++++++
Что произойдёт при выполнении двух команд?
echo=qqq
echo $echo

Что произойдёт при выполнении двух команд?
A=echo
$A $A > $A

Судя по всему, bash выполняет перенаправление файлов до подстановки переменных. Исходя из этого, попытайтесь представить, что произойдёт в третьей команде
A=echo
O=’>’
$A $A $O $A
+++++++++++++++++++++++++++++++
Что произойдёт при выполнении команды?
ed file.txt <<EOF
1,\$s/a/b/g
w
q
EOF

+++++++++++++
Чем отличаются две команды в редакторе vi?
:!q

:q!
++++++++++++++++++++++++++++++++++
Что изменится после выполнения команды?
export PATH=$PATH:~/bin
+++++++++++++
Что напечатают программы (запущенные от обычного пользователя)?
touch /tmp/$$; echo $?; rm /tmp/$$

touch /$$; echo $?; rm /$$
++++++++++++++++++++++++++++++++
Арифметическое выражение в двойных скобках без знака $, например ((A=A-3)) ничего не подставляет в командную строку, но возвращает код завершения. Код равен 0 если результат не 0, код равен 1 если вычислен 0 или произошла ошибка
Что напечатают команды?
((1+2)) || echo $?

((A=1+2)) && echo $? && echo $A

+++++++++++++
Файл /etc/passwd состоит из строк, разбитых двоеточиями на поля. Формат такой
Логин:Пароль:uid:gid:комментарий:домашний каталог: командная строка
Предположим у на с есть пользователь user. Что выдаст команда?

ls $(grep user /etc/passwd| cut –d: -f6)
+++++++++++++
Какой вариант записи оператора самый правильный (пометить галочкой):
if grep qq file then echo success fi
if grep qq file; then echo success; fi
if grep qq file; then; echo success; fi
+++++++++++++
В каталоге находятся файлы с именами a1, a2…a9, b1,b2…b9. Напишите три варианта цикла for который бы выполнял бы какую-нибудь операцию (например grep qq) со всеми файлами с b2 по b6. Один вариант должен использовать подстановку {}, другой [], третий (()).
+++++++++++++
Почему команда выдаст Not Null?
A=0
if [ $A > 0 ]; then echo Not Null;fi
+++++++++++++
Напишите скрипт, который проверял бы, что имя является файлом и печатал соответствующий текст (/etc/passwd – файл, /etc - не файл)
++++++++++++
У программы ps есть ключ u (user) который добавляет имя пользователя в первую колонку списка процессов. У команды сортировки sort есть ключ –u (uniq, уникальный), который говорит, что повторяющие строки после сортировки отбрасываются. Выдайте список всех пользователей, у которых сейчас есть запущенные процессы.
+++++++++++++
Команда wc (word count – подсчёт слов) имеет ключи –c –w –l, которые указывают что надо подсчитать число символов, слов или строк соответственно.
Напишите команду, которая подсчитает число процессов запущенных пользователем с именем student
+++++++++++++
Большинство стандартных каталогов в Unix имеют владельца root группу root доступа и права rwxr-xr-x Объясните, зачем обычным пользователям даны два права x и r
+++++++++++++
Используя команды: wc –l (выдает число строк в файле file в формате 526<пробел>file), cut (или awk), head, tail и цикл for напишите скрипт, который выводит задом наперед (вначале последняя строка, потом предпоследняя и т.д) содержимое файла, имя которого находится в переменной $1. (Примечание. В Unix есть стандартная команда tac, которая выполняет нужное преобразование, но её использование будем считать неспортивным)
+++++++++++++
В CentOS Linux в файле /etc/init.d/functions есть такие строки
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"
Предположите, что произойдёт, если выполнить скрипт
. /etc/init.d/functions
RES_COL=40; $MOVE_TO_COL; $SETCOLOR_SUCCESS OK; $SETCOLOR_NORMAL; echo
Зачем нужна точка в первой строке этого скрипта?
+++++++++++++
Тестовая программа test.c
#include "test.h"
int main() { return 0; }

Что неверно в таком запуске компилятора
gcc test.c jpeg.h

Какой файл будет создан при таком запуске компилятора
gcc –с test.c

Какие файлы будут использованы для сборки программы test при таком запуске
gcc –o test test.o -ljpeg
+++++++++++++
Программа sendmail использует для доставки почты файлы /etc/mail/mailertable и /etc/mail/virtusertable. Для ускорения доступа эти файлы программой makemap компилируются в двоичный вид - mailertable.db и virtusertable.db.

makemap hash <текстовый_файл> <скомпилированный_файл>

Напишите такой Makefile, чтобы после изменения текстовой версии любого из указанных файлов достаточно было перейти в /etc/mail/ и набрать make, для обновления скомпилированной версии.
+++++++++++

Тестовые задачи

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

1 Языковая статистика1

Написать скрипт, который подсчитывает статистику длин слов в тексте. Выдача - таблица из двух колонок: длина слова, число слов с такой длиной, встретившихся в тексте. Границами слов считать любые не буквы.

2 Языковая статистика2

Взять любой литературный текст из интернета сохранить в однобайтовой кодировке (или перекодировать в такую кодировку командой iconv)

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

3 Языковая статистика3

Найти в литературном произведении наиболее часто встречающееся слово из 5 букв

4 Определение кодировки

Написать программу автоматического определения однобайтовой кодировки русских литературных текстов (из набора KOI8, CP1251, CP866).

Для предварительной проверки того, что в файле просто текст можно использовать проверку на максимальную длину слова между пробельными символами (<25). Для проверки кодировки можно построить частотную статистику, а можно попытаться искать вхождение коротких слов типа " и ", " или ", ",а " в разных кодировках. Можно теоретически подобрать слово, а можно проверять кандидатуры на одном достаточно длинном тексте, перекодированном в разные кодировки, исключать тестовые слова, которые вызывают ложные срабатывания.

5 Три буквы

Взять любой достаточно объёмный текст на русском языке (можно архив lib.ru).

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

Если я правильно посчитал, то число сочетаний из трёх букв (включая Ё) равно 333333 т.е приблизительно 33000. Число вполне разумное и вычисление много времени и памяти не займёт.

6 quoted-printable1

Почтовая кодировка quoted-printable оставляет латинскую часть кодировки ASCII как есть, а однобайтные русские буквы, знак = и, иногда, пробел представляет в 16-ричном представлении вида =А6. Говорят, что в Ubuntu есть программа qprint для работы с этой кодировкой.

В CentOS такой команды нет, но есть команда xxd, которая конвертирует байты в их 16-ричное представление.

Написать программу, которая будет кодировать смешанный русско-английский текст в quoted-printable. Строго следовать стандарту не обязательно. Так, пробелы можно оставить пробелами, а также считать, что в тексте нет управляющих символов.

7 quoted-printable2

Почтовая кодировка quoted-printable оставляет латинскую часть кодировки ASCII как есть, а однобайтные русские буквы, знак = и, иногда, пробел представляет в 16-ричном представлении вида =А6. Говорят, что в Ubuntu есть программа qprint для работы с этой кодировкой.

В CentOS такой команды нет, но есть команда xxd, которая конвертирует байты в их 16-ричное представление.

Написать программу, которая из кодировки quoted-printable восстанавливает однобайтовую кодировку. Т.е. поcледовательность вида =E3 превращает в один байт со значением 0xE3

8 Кредитка1

Для проверки правильности номера банковской карты используется алгоритм Луна (ГОСТ ISO/IEC 7812-1-2014)

Контрольная цифра вычисляется на основе первых 15 цифр и записывается в 16 позицию

Алгоритм описывается так (в стандарте чуть иначе):

  1. удвоить значение каждой второй цифры, начиная с первой цифры слева
  2. если после шага 1 в данной позиции получилось двузначное число, то сложить его цифры между собой
  3. сложить результаты удвоения, полученные на этапе 2 и цифры исходного номера, не подвергшейся удвоению
  4. вычесть сумму, полученную на этапе 3, из следующего бОльшего числа, оканчивающегося на ноль.

Если сумма, полученная на этапе 3, является числом, оканчивающимся на ноль (30, 40 и т. п.), то контрольная цифра равна 0.

Написать скрипт подсчёта контрольной цифры 15-значного номера, полученного как аргумент.

9 Кредитка2

Для проверки правильности номера банковской карты используется алгоритм Луна (ГОСТ ISO/IEC 7812-1-2014)

Контрольная цифра вычисляется на основе первых 15 цифр и записывается в 16 позицию

Реализовать алгоритм проверки:

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

Написать скрипт проверки правильности номера, полученного как аргумент.

10 Уникальные файлы

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

Написать скрипт поиска одинаковых файлов. Критерием одинаковости является контрольная сумма, вычисленая программой sum.

Скрипт получает в качестве параметра имя каталога (или начинает с текущего если нет параметра) и печатает группы имен найденных файлов дубликатов. Группы разделяются пустыми строками.

11 Календарь

Напечатать календарь на текущий год. В первой строке месяца его название. Далее даты разбитые на строки по 7 дней недели. Первая строка имеет слева отступ, соответствующий дню недели, приходящемуся на 1 число. Субботу и воскресенье можно вывести на экран красным цветом.

2021 сентябрь 1 2 3 4 5 6 7 8 9 10

12 Игра "угадайка"

Человек задумывает число от 0 до 10. Программа задаёт вопросы на "больше"-"меньше":

Это число больше 7?
[y/n]
Это число меньше 2?
[y/n]

Человек отвечает да или нет, программа должна отгадать число.

13 Крестики-нолики

Надо написать программу, с которой можно играть в крестики-нолики. Программа запускается с параметром x или o, который указывает за кого она будет играть. Крестики ходят первыми.

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

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

Для чтения строк используется команда read, вывод на экран командой echo или printf.Можно стирать экран и рисовать только текущую позицию, а можно печатать очередную позицию после предыдущей, так что на экране останется история ходов.

14 Бэкап1

В одном из заданий в течение семестра была задача на инкрементальное архивирование командой tar. Предположим, что полный архив делается раз в 10 дней, а затем каждый день делается архивирование обновлённых за сутки файлов. В результате, у вас есть архивы с названиями такого вида:

dir-full-20220110.tar, dir-new-20220111.tar, dir-new-20220112.tar... dir-full-20220120.tar

Написать скрипт, который по имени файла (с путём) находит в архивах его самую свежую версию и выдаёт имя архива.

15 Бэкап2

В одном из заданий в течение семестра была задача на инкрементальное архивирование командой tar. Предположим, что полный архив делается раз в 10 дней, а затем каждый день делается архивирование обновлённых за сутки файлов. В результате, у вас есть архивы с названиями такого вида:

dir-full-20220110.tar, dir-new-20220111.tar, dir-new-20220112.tar... dir-full-20220120.tar

Написать скрипт, который по имени файла (с путём) печатает даты его изменений.

16 Почти шелл

Написать оболочку для работы с архивом tar, которая будет имитировать работу с файловой системой.

В задании для примера взят архив arch.tar. Текущий каталог можно хранить в файле archive.cwd (где archive совпадает с именем архива) Пусть скрипт называется fstar. Он должен реализовать следующие команды:

  • fstar ls arch.tar — список файлов текущего каталога.
  • fstar cd /directory arch.tar - смена текущего каталога в архиве
  • fstar cat file arch.tar - извлечение файла из архива в STDOUT
  • fstar cp archfile path/dstfile arch.tar - извлечение из архива файла archfile под именем path/dstfile
  • fstar cp srcfile path arch.tar - добавление файла srcfile в архив, приписав ему каталог path в архиве

Стеммер

Алгоритм нахождения корневых основ русского языка (стемминга) описан по ссылке - http://snowball.tartarus.org/algorithms/russian/stemmer.html

Задача — реализовать алгоритм на языке shell

Скриптовый вирус

Вот готовое описание скриптового вируса. Осталось его реализовать.

Вирус должен быть написан на языке shell. Он должен уметь заражать скрипты на языке shell через вставку в них своего кода.

Вирус содержит строки комментарии, обозначающие его начало и конец

#virus begin
virus body
#virus end
  • Вирус должен просмотреть все объекты в каталоге (цикл for).
  • У каждого объекта проверяется тип - является ли он файлом (test -f). Не файлы пропускаются.
  • У каждого файла проверяется доступен ли он на чтение и на запись (test -r, test -w). Недоступные файлы пропускаются.
  • У каждого файла проверяется наличие в первой строке подстроки "#!/bin/bash" (head -n 1, grep). Файлы без такой подстроки пропускаются.
  • В файле ищется сигнатура вируса #virus begin. Если файл уже заражен, то он пропускается.
  • Когда найден файл жертва, то вирус копирует его в каталог /tmp/.
  • Из аргумента $0 вирус узнает имя файла, из которого он был запущен, и копирует свое тело из этого файла в каталог /tmp/.
  • В тело файла жертвы записывается строка #!/bin/bash, затем тело вируса из каталога /tmp, затем оригинальный скрипт без первой строки из копии в каталоге /tmp.
  • Удаляются вспомогательные файлы в каталоге /tmp
  • После заражения одного файла вирус останавливается и передает управление родительскому скрипту.

File commander

Надо написать однопанельный клон нортон коммандера. Т.е. надо выводить на экран часть списка файлов в текущем каталоге. Одну из строк с именем файла помечать цветом или маркером в начале строки как текущую. Стрелками перемещать маркер и прокручивать список. По нажатию на Enter выполнять с текущим файлом некоторое действие в зависимости от его типа.

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

Для управления вместо стрелок используем буквы. Например j-стрелка вниз, k- вверх, Enter или x - выполнить, q-завершить работу.

  • Определяем размеры экрана, начинаем основной цикл
  • Читаем список файлов и каталогов в текущем каталоге. Файлы, имена, которых начинаются с точки - игнорируем.
  • Имена файлов не вмещающихся в ширину экрана обрезаем
  • Печатаем на экране столько файлов, сколько входит, зарезервировав одену строку на ввод команды. Каталог .. печатаем в первой позиции. Каталог . не печатаем.
  • Перед каждым файлом печатаем два символа. Первый - тип: f-файл, d-каталог, x-исполняемый файл. Второй символ - курсор: обычно пробел, но для текущего файла - '>'
  • При нажатии клавиш вверх и вниз - курсор перемещается. При достижении последней строки, список файлов сдвигается вверх если "за экраном" есть файлы, то же при достижении верхней строки. Список файлов как бы находится за виртуальной прорезью размером с экран.
  • При нажатии на клавишу исполнения: на каталоге - переход в каталог, на исполняемом файле - запуск, на текстовом файле - запуск редактора.
  • Клавиша выхода - очистка экрана и выход.

Для чтения по одной букве используем read -n1. Для определения типа файла - file Определение размеров экрана - stty -a. управление экраном tput. Логика прокрутки списка файлов - самостоятельно.

Файлы для обработки