Лабораторная работа "Работа в командной строке" - efanov/mephi GitHub Wiki

Подготовка

Если смысл вводимой команды вам непонятен, воспользуйтесь сервисом http://explainshell.com/.

1. Работа с командной оболочкой и справочной системой

  • Работа выполняется: на хостовой или виртуальной машине под управлением CentOS 7.
  • Навыки: выполнение команд, редактирование команд, просмотр истории, работа с аргументами команд.
  • Изучаемые команды: bash, man, whoami, cal, history, clear, date, echo, sudo, su.

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

Управление командами осуществляется с помощью аргументов. Аргументы отделяются друг от друга пробелом.

echo  -n   "Hello world!"
\__/   \   \__________/
 \      \    2-й аргумент
   \      1-й аргумент
     команда

Те аргументы, что содержат пробелы, заключаются в кавычки (одинарные ' или двойные "), при этом содержимое внутри кавычек будет является аргументом. Важно помнить и понимать, как командная оболочка обрабатывает команды и аргументы, чтобы научиться правильно их использовать.

Большинство программ в командной строке принимают параметры в стандартном формате:

  • длинный, состоит из двух дефисов -- и английского слова (или нескольких слов, разделённых дефисом), длинные параметры, как правило, имеют "говорящее" название и их проще запомнить, например --list-all, --help, --version;
  • короткий, состоит из дефиса - и алфавитно-цифрового символа ([a-zA-Z0-9]), чаще всего короткие параметры дублируют соответствующие длинные для ускорения набора команд, например -n, -2, -C.

Такие параметры ещё называются позиционно-независимыми, так как для них не имеет значения порядок их следования в командной строке.

Некоторые параметры могут принимать значения:

  • значение для длинного параметра отделяется пробелом или знаком равенства =, например --sort-column=3, --sort-column 3 - эквивалентны;
  • значение для короткого параметра отделяется пробелом или сразу следует за параметром, например -k 10, -k10 - эквивалентны.

Список параметров команды обычно можно узнать, выполнив команду с параметром --help или прочитав справочник с помощью команды man <имя_команды_для_которой_хотим_прочитать_справку>.

Короткие параметры удобны также там, что их можно объединять для ускорения набора команды, например, -abc10 - это то же самое, что и три отдельных параметра: -a -b -c 10.

Пример команды с параметрами:

grep -iw --color -m1 bash /etc/passwd

Экранирование

Специальные символы (! & # $ ' " * ( ) ` и пробел) в командной строке нужно экранировать. Экранировать можно символом обратного слэша \ или заключив весь аргумент в кавычки. Если вы не уверены, что команда будет интерпретирована правильно, всегда заключайте аргументы со спецсимволами в одинарные кавычки.

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

Примеры экранирования:

echo "it's hard to do that" # экранирование одинарной кавычки с помощью двойных
echo 'it'\''s hard to do that' # экранирование одинарной кавычки в одинарных кавычках
echo '"Пример текста в кавычках"' # экранируем двойные кавычки
# строка, которая начинается с символа решётки, является комментарием и игнорируется
echo '# эта строка не является комментарием'

Выполните команды выше и посмотрите на результат.

Рассмотрим пример echo 'it'\''s hard to do that' подробнее:

'it' - первая часть аргумента в одинарных кавычках
\' - одинарная кавычка, экранированная символом обратного слэша (вторая часть аргумента)
's hard to do that' - третья часть аргумента в одинарных кавычках

Таким образом видно, что аргумент может содержать сразу несколько частей, экранированных различными способами. Например: echo 'Это'" всё"' будет один'\ 'аргумент'

Задания

1.1. Откройте эмулятор терминала или выполните вход в систему в режиме командной строки.

1.2. Введите команду whoami и нажмите клавишу Enter. Вы увидите имя пользователя, под которым работаете. Убедитесь, что вы работаете не под пользователем root (системный администратор).

1.3. Нажмите клавишу "стрелка вверх". Терминал перейдёт в режим просмотра истории команд и отобразит последнюю выполненную команду.

1.4. Нажмите клавишу "стрелка вниз", чтобы стереть команду с экрана.

1.5. Выполните команду с опечаткой: whoaim. Что произошло?

1.6. Используя историю команд измените команду whoaim на whoami и снова выполните её. Для этого нажмите стрелку "вверх" дважды, после чего нажмите клавишу Enter.

1.7. Используя команду echo выведите в терминал фразу Hello World:

echo "Hello World"

В данном примере аргумент взят внутрь кавычек, таким образом, фраза "Hello World" станет единым аргументом. Если ввести просто echo Hello World - командная оболочка воспримет это как два самостоятельных аргумента: Hello и World, разделяя их по пробелу.

1.9. Выведите на экран текущие дату и время, выполнив команду date.

1.10. Выведите календарь, выполнив команду cal.

1.11. Прочитайте справку по команде cal и найдите информацию о том, как вывести календарь за три месяца. Для этого выполните команду man cal.

  • Для навигации по странице справки используйте стрелки клавиатуры или клавиши PageUp/PageDown.
  • Для поиска информации в справочной системе нажмите клавишу /, введите поисковый запрос и нажмите Enter. Продолжить поиск с тем же запросом можно последовательным нажатием клавиш /, Enter.
  • После того как вы нашли нужную информацию, завершите чтение справки, нажмите клавишу q. Так можно прочитать справку по любой команде, имеющейся в системе.

Используйте команду man для изучения других команд и выполнения заданий.

1.12. Выведите календарь для трёх месяцев одновременно: текущего, предыдущего и следующего.

1.13. Выведите историю своих команд. Выясните, какая команда за это отвечает.

1.14. Очистите окно терминала, выполнив команду clear. Повторите то же самое, нажав сочетание клавиш Ctrl+L.

2. Перемещение по файловой системе

  • Навыки: просмотр содержимого каталогов, перемещение по дереву каталогов.
  • Изучаемые команды: pwd, cd, ls.

Самостоятельно изучите понятия: дерево файловой системы, файл, каталог, текущий каталог, домашний каталог, корень файловой системы, родительский каталог, подкаталог.

2.1. Установите, в каком каталоге вы сейчас находитесь.

pwd

2.2. Перейдите в корневой каталог (/).

cd /

2.3. Попробуйте перейти на каталог уровнем выше. Проверьте текущий каталог. Изменился ли текущий каталог? Почему?

cd ..
pwd

2.4. Выведите список файлов текущего каталога.

ls

2.5 Выведите список файлов каталога /var.

ls /var

2.6. Вернитесь в домашний каталог.

cd ~

или просто

cd

2.7. Поднимитесь на один каталог вверх. Какой стал текущий каталог? Выведите текущий каталог на экран.

2.8. Выведите список файлов и каталогов из текущего каталога. Что в нём находится?

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

3. Работа с файловой системой

  • Навыки: создание файлов и каталогов, перемещение и переименование объектов файловой системы, копирование файлов и каталогов, просмотр содержимого файлов, удаление файлов.
  • Изучаемые команды: touch, mkdir, mv, cp, cat, rm, rmdir, ln.

3.1. Перейдите в домашний каталог.

3.2. Создайте в домашнем каталоге подкаталог fruits.

mkdir fruits

3.3. Перейдите в каталог /. Находясь в каталоге /, создайте в своём домашнем каталоге подкаталог animals.

mkdir ~/animals

3.4. Создайте во временном каталоге (/tmp) пустой файл temp.

touch /tmp/temp

3.5. Перейдите в ранее созданный каталог fruits.

3.6. В текущем каталоге (fruits) создайте пустые файлы apple, banana, pineaple, lion.

3.7. Находясь в каталоге fruits, в ранее созданном каталоге animals создайте пустые файлы cat.txt, dog.txt, elephant.txt.

3.8. Определите дату создания файла apple.

3.9. Выведите из текущего каталога (fruits) файлы, имя которых начинается на b.

ls b*

3.10. Выведите из текущего каталога файлы, имя которых оканчивается на a.

3.11. Выведите из текущего каталога файлы, имя которых содержит буквы b или i:

ls [bi]*

или

ls b* i*

Так как шаблоны раскрываются командной оболочкой до выполнения команды, вторая команда завершится с ошибкой.

3.12. Скопируйте файл /etc/passwd в домашний каталог:

cp /etc/passwd ~

3.13. Выведите содержимое файла /etc/issue на экран с помощью команды cat.

3.14. Скопируйте файл /etc/issue на файл apple так, чтобы заменить файл apple.

3.15. Выведите содержимое файла apple на экран. Оно должно совпадать с содержимым файла /etc/issue.

3.16. Переместите файл lion в каталог animals.

3.17. В имени файла pineaple есть опечатка. Переименуйте файл pineaple в pineapple.

3.18. Изучите команду wc. Подсчитайте с её помощью количество строк в файле /etc/passwd.

3.19. Перейдите в домашний каталог и создайте в нём символьную ссылку с именем passwd_link, указывающую на /etc/passwd.

ln -s /etc/passwd passwd_link

3.20. Создайте в домашнем каталоге жёсткую ссылку с именем history_hard, указывающую на ~/.bash_history.

ln .bash_history history_hard

Обратите внимание, что жёсткие ссылки создаются командой ln по умолчанию.

3.21. Отследите с помощью команды ls -l изменение количества жёстких ссылок у файла ~/.bash_history и сравните его с другими файлами домашнего каталога.

3.22. Удалите файл fruits/apple.

3.23. Создайте пустой каталог rmme, затем удалите его командой rmdir.

3.24. Попробуйте удалить каталог fruits:

rmdir fruits

Возникнет ошибка. Почему?

3.25. Удалите каталог fruits командой rm -fr.

rm -fr fruits

Примечание: rm -fr удаляет все каталоги с подкаталогами, не спрашивая и не помещая их в корзину. Этой командой надо пользоваться очень внимательно и только в крайних случаях, так как можно случайно удалить важные данные навсегда.

3.26. Выведите на экран содержимое файлов /etc/passwd и /var/log/boot.log одновременно, используя команду cat.

3.27. Скопируйте каталог /etc/init.d/ в домашний каталог:

cp /etc/init.d/ ~

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

cp -r /etc/init.d/ ~

3.28. Удалите каталог init.d из домашнего каталога.

4. Конвейеры. Обработка текстовых файлов

Конвейеры - мощный инструмент объединения команд. В конвейере стандартный вывод команды подаётся на ввод другой. С помощью конвейеров решается множество задач: поиск/замена строк, сортировка, преобразования строк.

Необходимо выполнить следующие задания, объяснив каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.

  • Работа выполняется: на виртуальной машине.
  • Навыки: построение конвейеров из команд, сортировка, фильтрация, поиск.
  • Изучаемые команды: cut, grep, sort, wc, tr, uniq, head, tail, fold, column, less.

Примечание. Вместо ??? необходимо подставить нужную команду, чтобы решить задачу. Используйте команду man, чтобы получить больше информации об используемых командах и их аргументах.

4.1. Вывести на экран всех пользователей системы с сортировкой по алфавиту:

cut -d: -f1 /etc/passwd | ???

Команда cut осуществляет разбиение каждой строки файла /etc/passwd на столбцы, используя двоеточие в качестве разделителя и выводит первый столбец.

Примечание. Предварительно изучите содержимое файла /etc/passwd и вывод команды cut.

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

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

Для того чтобы облегчить изучение вывода команд, используйте less и column. less позволяет читать длинный вывод команды, а column форматирует данные в виде таблицы, которые удобнее воспринимать. Разберите следующий пример, изучив man по каждой из команд конвейера:

cut -d: -f1,3,4 /etc/passwd | column -ts: | less

4.2. Изменить предыдущую команду таким образом, чтобы помимо имени пользователя на экране также выводился его идентификатор. Подсказка: посмотрите содержимое файла /etc/passwd, чтобы найти, в каком из полей, разделенных двоеточием, находится UID.

4.3. Подсчитать количество пользователей, у которых командой оболочкой является bash:

grep :/bin/bash /etc/passwd | wc -l

Команда grep используется для поиска строк в файлах, в данном случае искомая строка - :/bin/bash. Подробнее смотрите в man grep.

4.4. Вывести на экран только имена пользователей, использующих командную оболочку /bin/bash, отсортировав их по алфавиту в обратном порядке:

grep :/bin/bash /etc/passwd | ??? | ???

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

4.5. Выполнить сортировку установленных системных пакетов по размеру (большего к меньшему) и вывести первые 25 из них:

rpm -qa --qf '%{NAME}: %{SIZE}\n' | sort -rn -k2,2 | ???

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

rpm -ql man-db | xargs -l du    2> /dev/null  | sort -n
                ^ для каждого   ^ игнорировать  ^ сортировать числа
                 файла вызвать      ошибки
                  команду du

4.7. При помощи программы top вывести список работающих процессов и отсортировать их по имени процесса (аргумент команды sort заполнить самостоятельно):

top -b -n1 | sort ???

4.8. Изменить вывод команды top таким образом, чтобы в первой колонке отображалось имя процесса, во второй - объём занимаемой памяти:

top -b -n1 | tail -n+8 | cut -c7-  | tr -s ' ' '\t' | cut -f11,5
             ^ убирает   ^ отделяет  ^ "схлопывает"   ^ в 11 колонке - имя процесса,
              заголовки      PID         пробелы        в 5 колонке - объём памяти

4.9. Вывести файл /etc/passwd в отсортированном по пользователям виде, заменив знаки двоеточия пробелами:

??? | tr ":" " "

4.10. Вывести файл /etc/passwd в отсортированном по пользователям виде в две колонки - в первой - имя пользователя, во второй - командная оболочка пользователя:

???

Подсказка: используйте команды из предыдущих двух примеров. 4.11. На примере файла user-manual.txt из документации git исследовать конвейеры. Примечание. Установите пакет git с помощью команды yum install -y git, если он отсутствует в системе.

cd /usr/share/doc/git*

4.12. Выполнить анализ частоты появления каждого слова в файле user-manual.txt. Конвейер нужно строить по шагам, наблюдая за изменением результата. Определить этап получения первичной информации, этап обработки и этап представления результатов.

cat user-manual.txt | tr ' ' '\012' | tr '[:upper:]' '[:lower:]' | tr -d '[:punct:]' | grep -v '[^a-z]' | sort | uniq -c | sort -rn | head -5

Или:

cat user-manual.txt | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -rn | head -5

Почему различаются результаты работы конвейеров?

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

tr '[:lower:]' '[:upper:]' < user-manual.txt |  tr -d '[:punct:] \n\t' | fold -w1 | sort | uniq -c | sort -rn | head -5

4.14. Вывести самые часто встречаемые слова, в которых количество символов больше семи:

tr -cs '[:alpha:]' '\n' < user-manual.txt | less | grep -E ........ | sort | uniq -c | sort -rn | head

5. Работа с сетью

Несколько полезных команд помогут при работе в Интернете из командной строки.

5.1. Проверьте доступность сети командой ping.

ping ya.ru

Подсказка. Команда ping работает "вечно". Чтобы прервать её работу, нажмите Ctrl+C.

5.2. Выясните прогноз погоды.

curl wttr.in

Подсказка. С помощью curl можно загрузить любой адрес сети.

5.3. Узнайте свой IP-адрес.

IP-адрес может быть внутренним (адрес в локальной сети) и внешним (тот, через который осуществляется доступ в интернет).

Внутренний адрес:

hostname -I

Внешний адрес:

curl ifconfig.me

5.4. С помощью команды wget можно загрузить любой файл из Интернета и сохранить его. Загрузите файл https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-ru.md и прочитайте его командой less.

6. Получение прав root

Демонстрационные виртуальные машины настроены так, чтобы пользователь student был администратором. Если это не так, выполните вход в систему от root и выполните команду usermod -aG wheel student. Получить права администратора можно тремя способами.

6.1. Самый простой способ - выйти из системы и войти от имени пользователя root. Выполните команды id, whoami и убедитесь что это так.

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

6.2. Пользователь, который входит в группу wheel, может выполнять команды от имени root через команду sudo. При выполнении команды sudo нужно вводить пароль пользователя (только первый раз, последующие выполнения команды sudo не будут спрашивать пароль).

sudo id
id # сравните вызовы команд
# следующие вызовы sudo не запрашивают пароль
sudo less /var/log/messages

Попробуйте прочитать /var/log/messages без sudo.

6.3. Если пользователь не входит в группу wheel, можно переключиться в root с помощью команды su, зная пароль root. Особенность команды su - она, в отличие от sudo, запускает полноценный сеанс пользователя root, не забудьте выйти из него командой exit.

su
# нужно знать пароль root!
id
whoami
exit # не забываем завершить работу под root, в противном случае можно повредить систему!

Оформление результатов лабораторной работы

Сохраните результат выполнения работы в файл:

history > commandline_history.txt

Загрузите данный файл на собственный репозиторий GitHub.

⚠️ **GitHub.com Fallback** ⚠️