Перевод сборника команд Unix ToolBox. Часть 19 Полезные команды

548

Ну вот, потихоньку добираемся до последних глав перевода ?сборника команд Unix ToolBox. Поговорили уже о многих специализированных, узкопрофильных командных решениях. А теперь дошла очередь и до команд, которые, на мой взгляд, используются чаще всего. Например я активно использую less, tar, find. Например если надо найти новые ключи для нод 32, или проверить безопасность, или почитать маны. Вот про них и пойдет речь в этой главе. ?

Полезные команды

less

Команда less используется для просмотра текстового документа, выводимого в stdout. Присутствует в большинстве дистрибутивов.

# less unixtoolbox.xhtml

Основные команды управления (^N — Ctrl + N):

  • h H — Помощь
  • f ^F ^V SPACE -Листать вВперед на один экран (или N строк).
  • b ^B ESC-v — Листать азад на один экран (или N строк).
  • F — Листать постоянно; Эквивалент «tail -f».
  • /pattern — Искать вперед N-е совпадение строк
  • ?pattern — Искать вперед N-е совпадение строк
  • n — Повторить предыдущюю операцию поиска
  • N — Поторить операцию поиска в обоих направлениях
  • q — Выйти

vi

Текстовый редактор Vi присутствует в любой Unix-подобной системе, поэтому будет нелишним, знать его основные команды. В VI, есть два режима работы, командный и режим вставки. В коммандный режим можно перейти, нажав [ESC], в режим вставки с помощью i. Для получения помощи, используйте : help.
Редактолры nano и pico, не менее распространены, и попроще в использовании (прим. автора), не согласен (прим переводчика).

Выход

  • :w newfilename — Созранить файл с именем newfilename
  • :wq или — Сохранить и выйти
  • :q! — Выйти без сохранения

Поиск и перемещение

  • /string — Поиск вниз, строки «string»
  • ?string — Поиск вверх, строки «string»
  • n — Поиск следующего совпадения
  • N — Поиск предыдущего совпадения
  • { — Перейти на параграф назад
  • } — Перейти на параграф вперед
  • 1G — Перейти на первую строку файла
  • nG — Перети на строку №
  • G — Перейти на последнюю строку
  • :%s/OLD/NEW/g — Найти и заменить каждое совпадение

Удаление текста

  • dd — Удалить текущую строку целиком
  • D — Удалить текст, оставив пустую строку
  • dw — Удалить слово
  • x — Удалить букву
  • u — Откатить последнюю операцию
  • U — Откатить все изменения в текущей строке

mail

Mail, это базовое приложение для отправки и получения электронной почты. Для отправки почты, просто наберите «mail user@domain«. Первая строка, это «Тема» (subject), далее идет содержимое письма. Закончить набор и отправить письмо можно, введя на новой строке символ «.»(точка).
Пример:

# mail [email protected]
Subject: Your text is full of typos
«For a moment, nothing happened. Then, after a second or so,
nothing continued to happen.»
.
EOT
#

Можно использовать конвейер( pipe ), символ «|»:

# echo «This is the mail body» | mail [email protected]

Так-же, это простой способ проверить почтовый сервер.

Программа tar, для создания арзивов

Команда tar, предназначена для архивирования файлов или директорий. Имейте в виду, сам по себе tar, это не сжатый архив, сжатые архивы имеют расширения .tgz или .tar.gz (gzip) или .tbz (bzip2). Не используйте абсолютный путь при создании архива, возможно вы захотите распаковать его в другое место. Примеры использования:

Создания архива tar
# cd /
# tar -cf home.tar home/ # Создать архив, поместив в него директорию /home ( ключ -c, для создания )
# tar -czf home.tgz home/ # То-же, но с gzip компрессией
# tar -cjf home.tbz home/ # То-же, но с bzip2 компрессией

Включить в архив одну директорию ( или несколько ) из дерева, но сохранить относительные пути. Например, необходимо создать архив, содержащий директории /usr/local/etc и /usr/local/www, директория local/ должна быть началом дерева.

# tar -C /usr -czf local.tgz local/etc local/www
# tar -C /usr -xzf local.tgz # Распаковать архив директорию local в дерево /usr
# cd /usr; tar -xzf local.tgz # То-же, что выше
Распаковка архива tar
# tar -tzf home.tgz # Просмотр содержимого архива без его распаковки (листинг)
# tar -xf home.tar # Распаковать архив в текущую папку(ключ «x» для распаковки)
# tar -xzf home.tgz # То-же для архива с zip компрессией
# tar -xjf home.tbz # То-же для архива с bzip2 компрессией
# tar -xjf home.tbz home/colin/file.txt # Распаковать один файл
Дополнительно
# tar c dir/ | gzip | ssh user@remote ‘dd of=dir.tgz’ # Создать архив, содержащий директорию dir/ и сохранить удаленно
# tar cvf — `find . -print` > backup.tar # Создать архив с текущей директорией
# tar -cf — -C /etc . | tar xpf — -C /backup/etc # Копировать директории
# tar -cf — -C /etc . | ssh user@remote tar xpf — -C /backup/etc # Удаленное копирование
# tar -czf home.tgz —exclude ‘*.o’ —exclude ‘tmp/’ home/
dd

Программа dd ( disk dump ), используется для копирования ( конвертирования ) дисков, разделов, и прочих операций копирования. Типичный пример:

# dd if= of= bs= conv=

Важные опции для conv:

  • notrunc не обрезать нули в файле на выходе, записывая их как нули
  • noerror продолжать после ошибок чтения
  • sync дополнять каждый входящий блок нулями до размера ibs-size

Размер входных данных по-умолчанию 512 байт (1 блок). Увеличение размера блока ускоряет процесс копирования, но требует больше памяти.

Резервное копирование и восстановление
# dd if=/dev/hda of=/dev/hdc bs=16065b # Копировать с диска на диск с таким-же размером
# dd if=/dev/sda7 of=/home/root.img bs=4096 conv=notrunc,noerror # Резервное копирование в файл образа
# dd if=/home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # Восстановление из файла образа
# dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz # Сделать резервную копию и заархивировать в Zip
# gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # Восстановить из архива
# dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry ‘dd of=ad4s3e.gz’ # Что и выше, удаленно
# gunzip -dc ad4s3e.gz | ssh eedcoba@host ‘dd of=/dev/ad0s3e bs=1M’
# dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror # Пропустить MBR ( Master Boot Record )
# Необходимо если диск назначения (ad2) меньше.
Лечение

Программа dd считывает раздел поблочно, если на диске предположительно есть проблемы, нужно использовать опцию conv=sync,noerror, при этом dd будет пропускать битые блоки и записывать нули на диск назначения. Поэтому важно, установить размер блока, равным, или меньшим, чем размер блока на диске. Вполне подходящим будет размер блока в 1 килобайт, установить размер на входе и выходе можно опцией bs=1k. Если на диске имеются сбойные сектора, но основные данные нужно сохранить с данного раздела, можно создать файл образа, смонтировать образ и копировать данные на новый диск. С установленной опцией noerror, dd пропустит поврежденные блоки, записав на их место нули, при этом, потеряны будут, только данные, содержавшиеся в сбойных секторах диска.

# dd if=/dev/hda of=/dev/null bs=1m # Проверить на наличие бэд блоков
# dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh \ # Отправить на удаленный хост
root@fry ‘dd of=hda1.gz bs=1k’
# dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # Сохранить в образ
# mount -o loop /hda1.img /mnt # Создание и монтирование образа
# rsync -ax /mnt/ /newdisk/ # Копировать на новый диск
# dd if=/dev/hda of=/dev/hda # Обновить
# Обновление диска, безопасная операция, но диск при этом должен быть размонтирован.
Удаление данных
# dd if=/dev/zero of=/dev/hdc # Удалить все данные с диска ( забивает диск нулями )
# dd if=/dev/urandom of=/dev/hdc # Удалить все данные с диска ( более предпочтительный вариант )
# kill -USR1 PID # Посмотреть текущее состояние dd (Linux)
# kill -INFO PID # Посмотреть текущее состояние dd (FreeBSD)
Трюки с MBR ( master boot record )

MBR содержит код загрузчика и таблицу разделов. Первый 466 байт отводятся под загрузчик, 466-512 под таблицу размещения разделов.

# dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1 # Сделать резервную копию MBR
# dd if=/dev/zero of=/dev/sda bs=512 count=1 # Удалить MBR и таблицу размещения разделов
# dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # Восстановить MBR целиком
# dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # Восстановить только загрузчик
# dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # Восстановить таблицу размещения разделов
Screen — оконный менеджер виртуальных терминалов

Screen имеет две основные функциональности:

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

примеры:

Запустить screen можно командой:

# screen

Со screen сессией удобно использовать программы с длинным листингом ( например Top).

# top

Теперь отсоединим screen от физического терминала с помощью Ctrl-a Ctrl-d. Переподключиться можно:

# screen -rd

В частности это означает: если сессия запущена, переподключаться, если нужно переподключиться удаленно, сначала выйти из систему, если не запущена, запустить и уведомить пользователя. Или:

# screen -x

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

Основные команды screen

Все команды screen начинаются с Ctrl-a.

  • Ctrl-a ? Справка и список доступных функций
  • Ctrl-a c Создать новое окно (терминал)
  • Ctrl-a Ctrl-n и Ctrl-a Ctrl-p Переключиться на предыдущий или следующий экран.
  • Ctrl-a Ctrl-N Где N, число от 0 до 9, что-бы переключится на окно с соответствующим номером.
  • Ctrl-a « Получить список запущенных окон
  • Ctrl-a a Очистить пропущенный Ctrl-a
  • Ctrl-a Ctrl-d Отключиться, оставив сессию запущенной в фоновом режиме
  • Ctrl-a x Заблокировать терминал паролем

Сессия терминала прерывается, когда будет закрыта работающая программа и сделан выход с терминала.

Программа find

Важные опции:

  • -x (в BSD) -xdev (в Linux) Оставаться на то-же файловой системе.
  • -exec cmd {} \; Выполнить команду, если есть (), то find заменяет их на путь и имя файла найденного файла.
  • -iname То-же, что и -name но без учета регистра
  • -ls Показать информацию о файле (как ls -la)
  • -size n Размер в блоках или байтах, n (равно n блоков), +n (более n блоков), -n (менее n блоков), доступные обозначения размеров: k, M, G, T, P
  • -cmin n Статус файла был изменен N минут назад

# find . -type f ! -perm -444 # Найти файлы с правами 0444
# find . -type d ! -perm -111 # Найти директории с правами 0111
# find /home/user/ -cmin 10 -print # Файлы созданные или модифицированные за последние 10 минут.
# find . -name ‘*.[ch]’ | xargs grep -E ‘expr’ # Найти ‘expr’ в текущей директории.
# find / -name «*.core» | xargs rm # Найти и удалить аварийные дампы(так-же можно искать core.*).
# find / -name «*.core» -print -exec rm {} \; # Другой сиснтаксис
# Найти все графические файлы и создать архив, iname -регистронезависимо. -r -добавить
# find . \( -iname «*.png» -o -iname «*.jpg» \) -print -exec tar -rf images.tar {} \;
# find . -type f -name «*.txt» ! -name README.txt -print # Исключая файлы README.txt
# find /var/ -size +10M -exec ls -lh {} \; # Найти файлы больше 10 MB
# find /var/ -size +10M -ls # То-же, что и выше
# find . -size +10M -size -50M -print
# find /usr/ports/ -name work -type d -print -exec rm -rf {} \; # Очистить порты
# Найти файлы, принадлежащие определенному пользователю и с определенными правами
# find / -type f -user root -perm -4000 -exec ls -l {} \;

Будьте осторожны при использовании XARGS или EXEC, они могут возвращать неверный результат если имена файлов или директорий содержат пробелы. Используйте -print0 | xargs -0, вместо | xargs. Опция -print0 должна быть последней. Мини урок по команде find.

# find . -type f | xargs ls -l # Не будет работать при наличии пробелов в именах
# find . -type f -print0 | xargs -0 ls -l # Будет работать нормально с пробелами
# find . -type f -exec ls -l ‘{}’ \; # Или используйте с -exec, ковычки ‘{}’
Разное
# which command # Показывает полный путь к файлу команды
# time command # Показывает время выполнения команды
# time cat # Использовать команду time как секундомер. Ctrl-c для остановки
# set | grep $USER # Просмотр текущего окружения
# cal # Показать календарь на текущий месяц
# date [-u|—utc|—universal] [MMDDhhmm[[CC]YY][.ss]]
# date 10022155 # Установить дату и время
# whatis grep # Показать короткую справку по команде
# whereis java # Найти путь и стандартную директорию для «слова»
# setenv varname value # Установить переменную окружения varname в значение value (csh/tcsh)
# export varname=»value» # Установить переменную окружения varname в значение value (sh/ksh/bash)
# pwd # Печать текущей директории
# mkdir -p /path/to/dir # Создать директорию, включая родительскую, не выдавать ошибку если такая существует.
# mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs}
# rmdir /path/to/dir # Удалить директорию.
# rm -rf /path/to/dir # Удалить директорию с содержимым (принудительно).
# cp -la /dir1 /dir2 # Вместо копирования отобразить одну директорию в другую с помощью жесткой ссылки
# cp -lpR /dir1 /dir2 # То-же во FreeBSD
# cp unixtoolbox.xhtml{,.bak} # Быстрый вариант скопировать файл с новым расширением
# mv /dir1 /dir2 # Переименовать директорию
# ls -1 # Лстинг файлов, по одному в строке
# history | tail -50 # Показать последние 50 использовавшихся команд

Проверить хэш файла с помощью OpenSSL. Неплохая альтернатива программам md5sum и sha1sum.

# openssl md5 file.tar.gz # Сгенерировать md5 файла
# openssl sha1 file.tar.gz # Сгенерировать sha1 файла
# openssl rmd160 file.tar.gz # Сгенерировать RIPEMD-160 файла