Лабораторная работа "Работа в командной строке" - efanov/mephi GitHub Wiki
- http://www.opennet.ru/ - отличный источник информации по Linux на русском языке
- Командная строка Linux в примерах
- Linux — кратко обо всём
- Шпаргалка начинающего линуксоида
- https://github.com/jlevy/the-art-of-command-line/blob/master/README-ru.md
Если смысл вводимой команды вам непонятен, воспользуйтесь сервисом http://explainshell.com/.
- Работа выполняется: на хостовой или виртуальной машине под управлением 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
.
- Навыки: просмотр содержимого каталогов, перемещение по дереву каталогов.
- Изучаемые команды:
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
, чтобы узнать подробнее о параметрах этой команды.
- Навыки: создание файлов и каталогов, перемещение и переименование объектов файловой системы, копирование файлов и каталогов, просмотр содержимого файлов, удаление файлов.
- Изучаемые команды:
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
из домашнего каталога.
Конвейеры - мощный инструмент объединения команд. В конвейере стандартный вывод команды подаётся на ввод другой. С помощью конвейеров решается множество задач: поиск/замена строк, сортировка, преобразования строк.
Необходимо выполнить следующие задания, объяснив каждый шаг конвейера. Вместо знаков вопроса подставьте нужную команду/аргумент.
- Работа выполняется: на виртуальной машине.
- Навыки: построение конвейеров из команд, сортировка, фильтрация, поиск.
- Изучаемые команды:
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.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
.
Демонстрационные виртуальные машины настроены так, чтобы пользователь 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.