Bash
ARP (Address Resolution Protocol — протокол разрешения адресов) — протокол сетевого уровня (Network Link layer), предназначенный для преобразования IP- адресов (адресов сетевого уровня) в mac-адреса (адреса канального уровня) в сетях TCP/IP. Он определён в RFC826.
Утилита arp:
arp -a выводит содержимое таблицы ARP. arp <host> выводит ARP-запись для заданного хоста. arp -d <host> удаляет запись, соответствующую хосту. arp -d -a удаляет все записи таблицы. arp -s <host> <MAC-address> добавляет запись. arp -f <file> добавляет записи из файла соответствия <file>.
#!/bin/sh I=1 while [ $I -le 254 ] do arp -d 192.168.1.${I} arp -s 192.168.1.${I} 0:0:0:0:0:0 I=`expr $I + 1` done arp -f /etc/ethers.local
ip neigh flush all
Awk - это фактически целый язык, в принципе достаточно комплексный и глубокий, поэтому чтобы уместить инфу по нему в одну статью, пришлось вырезать только самые базовые и простые вещи. Так же ближе к концу будет представлена мини-практика и несколько наглядных примеров использования.
AWK состоит из операторов (правил), имеющих вид:
шаблон {действие} шаблон {действие} . . .
Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится.
В AWK также существует 2 предопределённых шаблона BEGIN и END. BEGIN выполняется до начала обработки входного потока. END — после обработки последней записи входного потока.
Действие может состоять из последовательности операторов, разделяемой точкой с запятой, переводом строки или закрывающей скобкой.
Переменная | Содержание | Значение по умолчанию |
---|---|---|
ARGC | Число аргументов командной строки | - |
ARGV | Массив аргументов командной строки | - |
ENVIRON | Массив, содержащий переменные окружения | - |
FILENAME | Обрабатываемый входной файл | - |
FNR | Номер записи в текущем файле | - |
FS | Разделитель полей записи на вводе | пробел(ы) и/или табуляция |
NF | Число полей в текущей записи | - |
NR | Номер записи (общее число считанных записей) | - |
OFMT | Формат распечатки чисел | %.6g |
OFS | Разделитель полей записи на выводе (символ) | пробел(ы) и/или табуляция |
ORS | Разделитель записей на выводе AWK-программы (символ) | \0 |
RS | Разделитель записей на вводе (символ) | \0 |
RSTART | Позиция начала подстроки, найденной функцией match |
- |
RLENGTH | Длина подстроки, найденной функцией match |
- |
SUBSEP | Разделитель индексов в многомерных массивах | \034 |
Синтаксис команды | Описание |
awk ' {print $1,$3} ' |
Печатает только первый и третий столбцы, используя stdin |
awk ' {print $0} ' |
Печатает все столбцы, используя stdin |
awk ' /'pattern'/ {print $2} ' |
Печатает только элементы второго столбца, соответствующие шаблону "pattern", используя stdin |
awk -f script.awk inputfile |
Как и sed, awk использует ключ -f для получения инструкций из файла, что полезно, когда их большое количество и вводить их вручную в терминале непрактично. |
awk ' program ' inputfile |
Исполняет program, используя данные из inputfile |
awk "BEGIN { print \"Hello, world!!\" }" |
Классическое "Hello, world" на awk |
awk '{ print }' |
Печатает все, что вводится из командной строки, пока не встретится EOF |
#! /bin/awk -f BEGIN { print "Hello, world!" } |
Скрипт awk для классического "Hello, world!" (сделайте его исполняемым с помощью chmod и запустите) |
# This is a program that prints \ "Hello, world!" # and exits |
Комментарии в скриптах awk |
awk -F "" 'program' files |
Определяет разделитель полей как null, в отличие от пробела по умолчанию |
awk -F "regex" 'program' files |
Разделитель полей также может быть регулярным выражением |
awk '{ if (length($0) > max) max = \ length($0) } END { print max }' inputfile |
Печатает длину самой длинной строки |
awk 'length($0) > 80' inputfile |
Печатает все строки длиннее 80 символов |
awk 'NF > 0' data |
Печатает каждую строку, содержащую хотя бы одно поле (NF означает Number of Fields) |
awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }' |
Печатает семь случайных чисел в диапазоне от 0 до 100 |
ls -l . | awk '{ x += $5 } ; END \ { print "total bytes: " x }' total bytes: 7449362 |
Печатает общее количество байтов, используемое файлами в текущей директории |
ls -l . | awk '{ x += $5 } ; END \ { print "total kilobytes: " (x + \ 1023)/1024 }' total kilobytes: 7275.85 |
Печатает общее количество килобайтов, используемое файлами в текущей директории |
awk -F: '{ print $1 }' /etc/passwd | sort |
Печатает отсортированный список имен пользователей |
awk 'END { print NR }' inputfile |
Печатает количество строк в файле, NR означает Number of Rows |
awk 'NR % 2 == 0' data |
Печатает четные строки файла. |
ls -l | awk '$6 == "Nov" { sum += $5 } END { print sum }' |
Печатает общее количество байтов файла, который последний раз редактировался в ноябре. |
awk '$1 ~/J/' inputfile |
Регулярное выражение для всех записей в первом поле, которые начинаются с большой буквы j. |
awk '$1 ~!/J/' inputfile |
Регулярное выражение для всех записей в первом поле, которые не начинаются с большой буквы j. |
awk 'BEGIN { print "He said \"hi!\" \to her." }' |
Экранирование двойных кавычек в awk. |
echo aaaabcd | awk '{ sub(/a+/, \"<A>"); print }' |
Печатает "<A>bcd" |
awk '{ $2 = $2 - 10; print $0 }' inventory |
Модифицирует inventory и печатает его с той разницей, что значение второго поля будет уменьшено на 10. |
awk '{ $6 = ($5 + $4 + $3 + $2); print \ $6' inventory |
Даже если поле шесть не существует в inventory, вы можете создать его и присвоить значение, затем вывести его. |
echo a b c d | awk '{ OFS = ":"; $2 = "" > print $0; print NF }' |
OFS - это Output Field Separator (разделитель выходных полей) и команда выведет "a::c:d" и "4", так как хотя второе поле аннулировано, оно все еще существует, поэтому может быть подсчитано. |
echo a b c d | awk '{ OFS = ":"; \ $2 = ""; $6 = "new" > print $0; print NF }' |
Еще один пример создания поля; как вы можете видеть, поле между $4 (существующее) и $6 (создаваемое) также будет создано (как пустое $5), поэтому вывод будет выглядеть как "a::c:d::new" "6". |
echo a b c d e f | awk '\ { print "NF =", NF; > NF = 3; print $0 }' |
Отбрасывание трех полей (последних) путем изменения количества полей. |
FS=[ ] |
Это регулярное выражения для установки пробела в качестве разделителя полей. |
echo ' a b c d ' | awk 'BEGIN { FS = \ "[ \t\n]+" } > { print $2 }' |
Печатает только "a". |
awk -n '/RE/{p;q;}' file.txt |
Печатает только первое совпадение с регулярным выражением. |
awk -F\\\\ '...' inputfiles ... |
Устанавливает в качестве разделителя полей \\ |
BEGIN { RS = "" ; FS = "\n" } { print "Name is:", $1 print "Address is:", $2 print "City and State are:", $3 print "" } |
Если у нас есть запись вида "John Doe 1234 Unknown Ave. Doeville, MA", этот скрипт устанавливает в качестве разделителя полей новую строку, так что он легко может работать со строками. |
awk 'BEGIN { OFS = ";"; ORS = "\n\n" } > { print $1, $2 }' inputfile |
Если файл содержит два поля, записи будут напечатаны в виде: "field1:field2 field3;field4 ...;..." так как разделитель выходных полей - две новые строки, а разделитель полей - ";". |
awk 'BEGIN { > OFMT = "%.0f" # print numbers as \ integers (rounds) > print 17.23, 17.54 }' |
Будет напечатано 17 и 18 , так как в качестве выходного формата (Output ForMaT) указано округление чисел с плавающей точкой до ближайших целых значений. |
awk 'BEGIN { > msg = "Dont Panic!" > printf "%s\n", msg >} ' |
Вы можете использовать printf практически так же, как и в C. |
awk '{ printf "%-10s %s\n", $1, \ $2 }' inputfile |
Печатает первое поле в виде строки длиной 10 символов, выровненной по левому краю, а затем второе поле в обычном виде. |
awk '{ print $2 > "phone-list" }' \inputfile |
Простой пример извлечения данных, где второе поле записывается под именем "phone-list". |
awk '{ print $1 > "names.unsorted" command = "sort -r > names.sorted" print $1 | command }' inputfile |
Записывает имена, содержащиеся в $1, в файл, затем сортируем и выводим результат в другой файл. |
awk 'BEGIN { printf "%d, %d, %d\n", 011, 11, \ 0x11 }' Will print 9, 11, 17 if (/foo/ || /bar/) print "Found!" |
Простой поиск для foo или bar. |
awk '{ sum = $2 + $3 + $4 ; avg = sum / 3 > print $1, avg }' grades |
Простые арифметические операции (в большинстве похожи на C) |
awk '{ print "The square root of", \ $1, "is", sqrt($1) }' 2 The square root of 2 is 1.41421 7 The square root of 7 is 2.64575 |
Простой расширяемый калькулятор |
awk '$1 == "start", $1 == "stop"' inputfile |
Печатает каждую запись между start и stop. |
awk ' > BEGIN { print "Analysis of \"foo\"" } > /foo/ { ++n } > END { print "\"foo\" appears", n,\ "times." }' inputfile |
Правила BEGIN и END исполняются только один раз, до и после каждой обработки записи. |
echo -n "Enter search pattern: " read pattern awk "/$pattern/ "'{ nmatches++ } END { print nmatches, "found" }' inputfile Search using shell if (x % 2 == 0) print "x is even" else print "x is odd" |
Простое условие. awk, как и C, также поддерживает операторы ?:. |
awk '{ i = 1 while (i <= 3) { print $i i++ } }' inputfile |
Печатает первые три поля каждой записи, по одной в строке. |
awk '{ for (i = 1; i <= 3; i++) print $i }' |
Печатает первые три поля каждой записи, по одной в строке. |
BEGIN { if (("date" | getline date_now) <= 0) { print "Can't get system date" > \ "/dev/stderr" exit 1 } print "current date is", date_now close("date") } |
Выход с кодом ошибки, отличным от 0, означает, что что-то идет не так. Пример: |
awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' file1 file2 |
Печатает awk file1 file2 |
for (i in frequencies) delete frequencies[i] |
Удаляет элементы в массиве |
foo[4] = "" if (4 in foo) print "This is printed, even though foo[4] \ is empty" |
Проверяют элементы массива |
function ctime(ts, format) { format = "%a %b %d %H:%M:%S %Z %Y" if (ts == 0) ts = systime() # use current time as default return strftime(format, ts) } |
awk-вариант функции ctime() в C. Так вы можете определять свои собственные функции в awk. |
BEGIN { _cliff_seed = 0.1 } function cliff_rand() { _cliff_seed = (100 * log(_cliff_seed)) % 1 if (_cliff_seed < 0) _cliff_seed = - _cliff_seed return _cliff_seed } |
Генератор случайных чисел Cliff. |
cat apache-anon-noadmin.log | \ awk 'function ri(n) \ { return int(n*rand()); } \ BEGIN { srand(); } { if (! \ ($1 in randip)) { \ randip[$1] = sprintf("%d.%d.%d.%d", \ ri(255), ri(255)\ , ri(255), ri(255)); } \ $1 = randip[$1]; print $0 }' |
Анонимный лог Apache (IP случайные) |
cat [ОПЦИИ]... [ФАЙЛ]...
Ее можно использовать для отображения текстовых файлов, копирования текстовых файлов в новый документ, присоединения содержимого текстового файла в конце другого текстового файла для их объединения.
Простейший способ использования cat - задать команде имя файла. Содержимое текстового файла будет выведено на экран. Например, следующая команда прочитает содержимое файла mytext.txt и выведет его в стандартный поток вывода (экран вашего терминала): cat mytext.txt
Если файл слишком длинный, он пролистается, и вы увидите только последний экран. При необходимости просмотреть документ постранично или прокручивать его вперёд и назад можно воспользоваться такими средствами просмотра как pg, more или less.
Когда указано несколько файлов, cat будет выводить их последовательно, объединяя содержимое в потоке стандартного вывода. Поэтому следующая команда выведет содержимое двух текстовых файлов, как если бы они были одним:
cat mytext.txt mytext2.txt
Обычно копирование осуществляется командой cp, но для копирования текстовых файлов вы можете аналогичным образом использовать команду cat. cat отправляет результат в stdout (стандартный поток вывода), обычно это экран терминала. Однако, можно перенаправить результат в файл при помощи символа перенаправления “>”.
Например, команда:
cat mytext.txt > newfile.txt
считает содержимое mytext.txt и отправить его в стандартный поток вывода, но вместо отображения текста оболочка перенаправит результат в файл newfile.txt. Если этот файл не существует, он будет создан. Если он будет же существует, то будет перезаписантс потерей предыдущего содержимого, поэтому будьте осторожны.
Аналогично можно объединять несколько файлов в один. Например, команда
cat mytext.txt mytext2.txt > newfile.txt
считает содержимое mytext.txt и mytext2.txt и запишет объединенный текст в newfile.txt. При отсутствии файла он будет создан, при наличии — перезаписан.
Вместо перезаписи файла можно присоединить текст файла-источника к другому файлу при помощи оператора перенаправления «>>».
Например, команда:
cat mytext.txt >> another-text-file.txt
Прочтет содержимое mytext.txt и запишет его в конец файла another-text-file.txt. Если этот файл не существует, он будет создан, и содержимое mytext.txt будет записано в новый файл.
Это работает также для нескольких файлов. Следующая команда последовательно запишет содержимое mytext.txt и mytext2.txt в конец файла another-text-file.txt:
cat mytext.txt mytext2.txt >> another-text-file.txt
Если в качестве имени файла задать дефис («-«), cat осуществляет считывание из стандартного потока ввода. Например, если у вас есть файл list.txt со следующим текстом:
яблоки апельсины масло хлеб
вы можете воспользоваться командой echo для вывода текста, направить этот текст команде cat и указать ей объединить его с содержимым файла:
echo "Мой список покупок" | cat - list.txt
На выходе получим следующий текст:
Мой список покупок яблоки апельсины масло хлеб
Данные опции доступны для GNU cat, стандартной для большинства дистрибутивов Linux. Для уточнения опций, доступных конкретно в вашей системе, обратитесь к руководству.
-n, —number — выводить номер каждой строки результата.
-b, —number-nonblank — выводить номер каждой строки результата, кроме пустых. Эта опция отменяет -n.
-E, —show-ends — отображать «$» в конце каждой строки.
-s, —squeeze-blank — исключать из вывода повторяющиеся пустые строки.
-T, —show-tabs — показывать символы табуляции как ^I.
-v, —show-nonprinting — показывать непечатаемые символы, кроме табуляции и конца строки.
-t — показывать непечатаемые символы, кроме конца строки.
-e — показывать непечатаемые символы, кроме табуляции.
-A, —show-all — показывать все непечатаемые символы.
—help — вывести справку и выйти.
—version — вывести информацию о версии и выйти.
Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:
Кроме перечисленных выше опций, существуют опции, которые объединяют в себе несколько других с определёнными значениями. Во основные из них:
cp file1 destination/file10 - копирование из файла в файл
cp file1 destination/ - из файла в папку
cp -r source destination - из папки в папку
cp -t file1 destination - точное указание, того что нужно скопировать. Если папка destination не существует вы получите ошибку, вместо не очевидного поведения.
cp -r source destination1/ - копирование содержимого папки в папку
Если папка назначения существует, то в ней будет создана папка source. Для того чтобы избежать такого поведения можно использовать опцию -T:
cp -rT source destination/
cp source/* destination - можно явно указать, что вас интересует именно копирование содержимого папки с помощью символа *.
cp -i file1 destination - спрашивает стоит ли перезаписывать каждый существующий файл
cp -n file1 destination - никогда не перезаписывать существующие файлы
cp -b file1 destination - сделать резервную копию
cp --backup=numbered file1 destination - использовать номер в резервной копии
cp -u source/* destination - заменять только если файл источник новее или файл в папке назначения не существует
cp -P link1 destination - копировать символические ссылки, как ссылки
cp --preserve=links hlink1 destination -
Если вы хотите чтобы жесткая ссылка осталась ссылкой после копирования, нужно использовать опцию --preserve со значением links
cp -p source/* destination - Если вы хотите оставить оригинального владельца и права доступа используйте опцию --preserve со значением mode,ownership или же опцию -p
cp -a source/* destination -
Если надо сохранить всю структуру файловой системы, в том числе символические и жесткие ссылки и временные метки, то можно использовать опцию -a
Использованы материалы с https://losst.pro/komanda-cp-v-linux и https://habr.com/ru/companies/ruvds/articles/471092/
curl - утилита, позволяющая имитировать http-запросы, загружать и выгружать различные файлы(в том числе и через аутентификацию), тестировать доступность ресурсов, проверять заголовки, проксировать запросы и даже отправлять/получать емейлы. Используется практически повсеместно и везде для различных целей. В тч, например, существует набор сканеров и хакерских тулз в основе которых зашит этот инструмент.
Самые распространенные флаги:
1.Флаги запроса
-X или --request - указывает HTTP метод (GET, POST, PUT, DELETE и т.д.)
-G или --get - отправляет данные методом GET (добавляет их в URL)
-d или --data - отправляет данные в теле запроса (по умолчанию POST)
-F или --form - отправляет multipart/form-data (для загрузки файлов)
-H или --header - добавляет заголовок запроса
-I или --head - отправляет HEAD запрос (только заголовки ответа)
2.Флаги вывода
-i или --include - показывает заголовки ответа в выводе
-s или --silent - подавляет вывод прогресса и ошибок
-S или --show-error - показывает ошибки даже с -s
-v или --verbose - подробный вывод (полезно для отладки)
--trace или --trace-ascii - очень подробный вывод всех данных
3.Флаги файлов
-o или --output - записывает вывод в файл
-O или --remote-name - сохраняет файл с именем как на сервере
-C или --continue-at - продолжает загрузку с места прерывания
4. Флаги аутентификации
-u или --user - указывает имя пользователя и пароль
--basic - использует Basic аутентификацию
--digest - использует Digest аутентификацию
--negotiate - использует Negotiate аутентификацию
--ntlm - использует NTLM аутентификацию
5.Другие полезные флаги
-L или --location - следует за перенаправлениями
-k или --insecure - отключает проверку SSL сертификата
--connect-timeout - устанавливает таймаут соединения
--max-time - устанавливает максимальное время выполнения
--limit-rate - ограничивает скорость передачи
-A или --user-agent - устанавливает User-Agent
-b или --cookie - отправляет cookie
-c или --cookie-jar - сохраняет cookie в файл
-x или --proxy - использует прокси
Распространённые комбинации флагов
curl -i -H "Accept: application/json" -o output.json https://api.example.com/data ##Простой GET запрос с заголовками и сохранением в файл
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com/resource ##POST запрос с JSON данными
curl -u username:password -O https://example.com/file.zip ## Загрузка файла с аутентификацией
curl -F "[email protected]" -F "name=file" https://example.com/upload ##Отправка формы с файлом
curl -v -X POST -H "Custom-Header: value" -d 'data' https://example.com ##Отладка запроса
curl -IL https://curl.se/windows/dl-7.85.0_5/curl-7.85.0_5-win64-mingw.zip ##Получение информации об удаленном файле
curl -v -o /dev/null https://curl.se/windows/dl-7.85.0_5/curl-7.85.0_5-win64-mingw.zip ##Более подробная инфа
Практические примеры
curl ifconfig.me ##получение публичного ip
# Или с более подробным выводом
curl -s https://api.ipify.org?format=json | jq .
curl -s -o /dev/null -w "%{http_code}" https://google.com
##Проверка доступности сайта(http-код)
curl -C - -O https://example.com/largefile.iso ##Загрузка файла с продолжением, если она неожиданно прервется
curl -kT sample[1-5].zip -u testlab\surender ftps://192.168.0.80/awesomewebsite.com/files/ ##Выгрузка нескольких файлов(sample) на сервер через ftp
curl -kIA "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0" https://website.com/files/File.zip ##изменение user-agent в запросе(сообщает серверу тип клиента,отправившего запрос)
curl -X POST -H "Content-Type: application/json" \
-d '{"username":"test","password":"secret"}' \
https://api.example.com/login ##Отправка данных в формате json
curl -H "Authorization: token YOUR_GITHUB_TOKEN" \
https://api.github.com/user/repos ##Работа с api github(с аутентификацией)
curl -c cookies.txt -d "user=admin&pass=123" https://example.com/login
curl -b cookies.txt https://example.com/dashboard ##Тестирование api с кешированием cookie
curl -x 192.168.0.250:8088 -U username:password https://website.com/ ##Запрос через прокси-сервер с аутентификацией
curl -w "DNS: %{time_namelookup} Connect: %{time_connect} TTFB: %{time_starttransfer} Total: %{time_total}\n" -o /dev/null -s https://example.com ##Тестирование времени ответа
curl -i https://git.io -F "url=https://github.com" -F "code=my-link" ##Создание сокращенной ссылки (например, через git.io)
curl --insecure --ssl-reqd smtps://mail.yourdomain.com –-mail-from [email protected] –-mail-rcpt [email protected] --user [email protected] --upload-file email_msg.txt ##Отправка емейла
Использованы материалы с хабра
Начну с небольшого примера, наглядно иллюстрирующего основные параметры команды:
# dd if=/dev/urandom of=/dev/null bs=100M count=5
Параметры:
Таким образом, описанная команда читает 5*100 мегабайт из устройства /dev/urandom в устройство /dev/null. Придавая этой команде смысловую нагрузку получается, что система сгенерирует 500 мегабайт случайных значений и запишет их в null устройство. Конечно, единственное, что сделает эта команда: нагрузит процессор на несколько секунд. Рассмотрим примеры из практики:
Создание образа диска:
# dd if=/dev/cdrom of=image.iso
Команда будет считывать из устройства данные и записывать в файл до тех пор, пока не достигнет окончания устройства. Если диск битый, можно попробовать его прочитать, игнорируя ошибки чтения:
# dd if=/dev/cdrom of=image.iso conv=noerror
Параметр «conv» позволяет подключать несколько фильтров, применимых к потоку данных. Фильтр «noerror» как раз отключает остановку работы программы, когда наткнется на ошибку чтения. Таким образом, некоторые данные с диска все же можно будет прочитать. Точно таким образом я спас данные со своей флешки Corsair, которую погнули: подобрал подходящее положение, когда контакт есть, и сделал дамп файловой системы.
Подключить, кстати, такие образы можно при помощи команды mount с ключем "-o loop":
# mount -o loop image.iso /mnt/image
Если что-то не получается, процесс разбивается на 2 уровня:
# losetup -e /dev/loop0 image.iso
# mount /dev/loop0 /mnt/image
Если и так не работает, значит файловая система образа полетела.
Работа с носителями информации
Очень простое, хоть и не оптимальное решение клонирования жесткого диска:
# dd if=/dev/sda of=/dev/sdb bs=4096
Все то же побайтовой копирование с размером буфера 4 Кб. Минус способа в том, что при любой заполненности разделов копироваться будут все биты, что не выгодно при копировании разделов с маленькой заполненностью. Чтобы уменьшить время копирования при манипуляции с большими объемами данных, можно просто перенести MBR на новый носитель (я ниже опишу как), перечитать таблицу разделов ядра (при помощи того же fdisk), создать файловые системы и просто скопировать файлы (не забыв сохранить права доступа к файлам).
Как вариант, можно даже по расписанию делать бекап раздела по сети. Разрулив ключи ssh будет работать такая схема:
# dd if=/dev/DEVICE | ssh user@host «dd of=/home/user/DEVICE.img».
Когда-то читал исследование, согласно которому очень большая доля жестких дисков на барахолке подвергается восстановлению данных без привлечения чего-то специализированного, и содержит конфиденциальную информацию. Чтобы на носителе ничего нельзя было восстановить — можно забить его нулями:
# dd if=/dev/zero of=/dev/DEVICE
Думаю, понятно на что нужно заменить DEVICE. После проведения лекций по Linux, я очень тщательно стал следить за тем, что пишу.
Проверить можно тем же dd, но преобразовав данные в hex:
# dd if=/dev/sda | hexdump -C
Должны посыпаться нули.
Операции с MBR
MBR расположена в первых 512 байтах жесткого диска, и состоит из таблицы разделов, загрузчика и пары доп. байт. Иногда, ее приходится бекапить, восстанавливать и т.д. Бекап выполняется так:
# dd if=/dev/sda of=mbr.img bs=512 count=1
Восстановить можно проще:
# dd if=mbr.img of=/dev/sda
Причины этих махинаций с MBR могут быть разные, однако хочу рассказать одну особенность, взятую из опыта: после восстановления давней копии MBR, где один из разделов был ext3, а позже стал FAT и использовался Windows, раздел перестал видиться виндой. Причина — ID раздела, который хранится в MBR. Если UNIX монтирует файловые системы согласно суперблоку, то винды ориентируются на ID разделов из MBR. Поэтому всегда нужно проверять ID разделов при помощи fdisk, особенно если на компьютере есть винды.
Генерация файлов
При помощи dd можно генерировать файлы, а затем использовать их как контейнеры других файловых систем даже в зашифрованном виде. Технология следующая:
При помощи dd создается файл, забитый нулями (случайными числами забивать не рационально: долго и бессмысленно):
# dd if=/dev/zero of=image.crypted bs=1M count=1000
Создался файл размером почти в гигабайт. Теперь нужно сделать этот файл блочным устройством и, при этом, пропустить его через механизм шифрования ядра linux. Я выберу алгоритм blowfish. Подгрузка модулей:
# modprobe cryptoloop
# modprobe blowfish
Ассоциация образа с блочным устройством со включенным шифрованием:
# losetup -e blowfish /dev/loop0 image.crypted
Команда запросит ввести пароль, который и будет ключем к образу. Если ключ введен не правильно, система не смонтируется. Можно будет заново создать данные в образе, используя новый ключ, но к старым данным доступа не будет.
Создаем файловую систему и монтируем:
# mkfs.ext2 /dev/loop0
# mount /dev/loop0 /mnt/image
Образ готов к записи данных. После завершения работы с ним, нужно не забыть его отмонтировать и отключить от блочного loop устройства:
# umount /dev/loop0
# losetup -d /dev/loop0
Теперь шифрованный образ готов.
Ипользованы материалы https://habr.com/ru/articles/117050/
df(disc free)- утилита в unix-системах, показывающая список файловых систем по именам устройств, их размер, свободное пространство и точки монтирования.
[править | править код]
Отобразит размер в человеко-читаемом формате, размерностью 1024, добавив названия единиц (Kибибайт, Mебибайт, Гибибайт, Tебибайт)[1].
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 4.0G 2.4G 1.5G 62% / /dev/sda2 29G 14G 14G 50% /usr /dev/sda3 62G 2.6G 56G 5% /var tmpfs 512M 60K 512M 1% /tmp
Отобразит размер в человеко-читаемом формате, в единицах СИ, размерностью 1000, добавив названия единиц (кб,мб,тб)
$ df -i / Файл.система Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в /dev/sda2 38363136 1262071 37101065 4% /
Утилиту df можно использовать для получения информации о том, к какой файловой системе относится какой-либо каталог. Например, для текущего каталога:
$ df -k . Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 4166504 2449796 1505056 62% /
1.Простой вывод команды dig (для понимания вывода, без доп.параметров )
Когда вы задаете имя домена в команде dig по-умолчанию вы получаете A-запись домена (ip-адрес сайта (домена) который мы запрашивали) как показано на листинге ниже
$dig ya.ru ; <<>> DiG 9.7.3 <<>> ya.ru ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31244 ;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;ya.ru. IN A ;; ANSWER SECTION: ya.ru. 2187 IN A 87.250.251.3 ya.ru. 2187 IN A 77.88.21.3 ya.ru. 2187 IN A 213.180.204.3 ya.ru. 2187 IN A 93.158.134.3 ya.ru. 2187 IN A 213.180.193.3 ya.ru. 2187 IN A 87.250.250.203 ya.ru. 2187 IN A 93.158.134.203 ya.ru. 2187 IN A 87.250.250.3 ;; Query time: 2 msec ;; SERVER: 10.218.138.252#53(10.218.138.252) ;; WHEN: Fri Mar 23 15:21:18 2012 ;; MSG SIZE rcvd: 151
В примере можно увидеть A-записи домена ya.ru в разделе ANSWER SECTION
Давайте рассмотрим разделы данного вывода подробней:
- HEADER (заголовок): показывает версию dig, глобальные опции используемые с командой и другую дополнительную информацию
- QUESTION SECTION (секция запроса): Показывает наш запрос, то бишь мы запросили показать A-запись (команда dig без параметров) для домена ya.ru
- ANSWER SECTION (секция ответа): Показывает ответ полученный от DNS, в нашем случае показывает A-запись для ya.ru
Последняя секция это статистика по запросу (служебная информация) - время выполнения запроса, имя DNS-сервера который запрашивался, когда был создан запрос и размер сообщения
Так же можно выполнить опрос конкретного DNS-сервера:
$dig @ns1.yandex.ru ya.ru ; <<>> DiG 9.7.3 <<>> @ns1.yandex.ru ya.ru ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56730 ;; flags: qr aa rd; QUERY: 1, ANSWER: 8, AUTHORITY: 2, ADDITIONAL: 3 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;ya.ru. IN A ;; ANSWER SECTION: ya.ru. 7200 IN A 77.88.21.3 ya.ru. 7200 IN A 87.250.250.3 ya.ru. 7200 IN A 87.250.250.203 ya.ru. 7200 IN A 87.250.251.3 ya.ru. 7200 IN A 93.158.134.3 ya.ru. 7200 IN A 93.158.134.203 ya.ru. 7200 IN A 213.180.193.3 ya.ru. 7200 IN A 213.180.204.3 ;; AUTHORITY SECTION: ya.ru. 7200 IN NS ns1.yandex.ru. ya.ru. 7200 IN NS ns5.yandex.ru. ;; ADDITIONAL SECTION: ns1.yandex.ru. 345600 IN A 213.180.193.1 ns1.yandex.ru. 3600 IN AAAA 2a02:6b8::1 ns5.yandex.ru. 345600 IN A 213.180.204.1 ;; Query time: 13 msec ;; SERVER: 213.180.193.1#53(213.180.193.1) ;; WHEN: Fri Mar 23 14:41:37 2012 ;; MSG SIZE rcvd: 254
Результат вывода дополняется еще двумя секциями:
AUTHORITY SECTION: Показывает имена DNS-серверов обработавших наш запрос
ADDITIONAL SECTION: Показывает ip-адреса этих DNS-серверов (из секции AUTHORITY SECTION)
2. Вывод только секции ANSWER SECTION
В большинстве случаев требуется только ip адрес домена, то бишь вывод секции "ANSWER SECTION"
Для этого существуют следующие ключи:
-+nocomments - отключает линию комментариев
-+noauthority - отключает секцию "AUTHORITY SECTION"
-+noadditional – отключает секцию "ADDITIONAL SECTION"
-+nostats – отключает секцию статистики
-+noanswer – выключает секцию ответа (ANSWER SECTION)
Пример:
$ dig ya.ru +nocomments +noquestion +noauthority +noadditional +nostats ; <<>> DiG 9.7.3 <<>> ya.ru +nocomments +noquestion +noauthority +noadditional +nostats ;; global options: +cmd ya.ru. 114 IN A 77.88.21.3 ya.ru. 114 IN A 213.180.204.3 ya.ru. 114 IN A 93.158.134.3 ya.ru. 114 IN A 213.180.193.3 ya.ru. 114 IN A 87.250.250.203 ya.ru. 114 IN A 93.158.134.203 ya.ru. 114 IN A 87.250.250.3 ya.ru. 114 IN A 87.250.251.3
Можно сделать проще, существует ключ +noall, который выключает все секции. Таким образом мы используем ключ +noall и добавляем ключ +answer, уменьшая длину команды
$ dig ya.ru +noall +answer ; <<>> DiG 9.7.3 <<>> ya.ru +noall +answer ;; global options: +cmd ya.ru. 7152 IN A 213.180.193.3 ya.ru. 7152 IN A 87.250.250.203 ya.ru. 7152 IN A 93.158.134.3 ya.ru. 7152 IN A 87.250.250.3 ya.ru. 7152 IN A 77.88.21.3 ya.ru. 7152 IN A 213.180.204.3 ya.ru. 7152 IN A 87.250.251.3 ya.ru. 7152 IN A 93.158.134.203
3. Запрос MX-записи
Для запроса MX-записи домена мы используем одноименный аргумент командной строки (MX)
$ dig ya.ru MX +noall +answer ; <<>> DiG 9.7.3 <<>> ya.ru MX +noall +answer ;; global options: +cmd ya.ru. 1979 IN MX 10 mx.yandex.ru.
Этот же запрос можно выполнить с ключом -t (тип)
$ dig -t MX ya.ru +noall +answer ; <<>> DiG 9.7.3 <<>> -t MX ya.ru +noall +answer ;; global options: +cmd ya.ru. 1903 IN MX 10 mx.yandex.ru.
4. Запрос NS-записи
По аналогии с предыдущим пунктом, используем аргумент NS
$ dig ya.ru NS +noall +answer ; <<>> DiG 9.7.3 <<>> ya.ru NS +noall +answer ;; global options: +cmd ya.ru. 7170 IN NS ns5.yandex.ru. ya.ru. 7170 IN NS ns1.yandex.ru.
Вы также можете использовать ключ -t для указания типа запроса
$ dig -t NS ya.ru +noall +answer ; <<>> DiG 9.7.3 <<>> -t NS ya.ru +noall +answer ;; global options: +cmd ya.ru. 7088 IN NS ns5.yandex.ru. ya.ru. 7088 IN NS ns1.yandex.ru.
5. Просмотр всех типов DNS-записей
Для этого используется ключ ANY
$ dig ya.ru ANY +noall +answer ; <<>> DiG 9.7.3 <<>> ya.ru ANY +noall +answer ;; global options: +cmd ya.ru. 4931 IN TXT "v=spf1 redirect=_spf.yandex.ru" ya.ru. 6963 IN NS ns1.yandex.ru. ya.ru. 6963 IN NS ns5.yandex.ru. ya.ru. 1533 IN MX 10 mx.yandex.ru. ya.ru. 6494 IN A 93.158.134.203 ya.ru. 6494 IN A 213.180.193.3 ya.ru. 6494 IN A 87.250.250.203 ya.ru. 6494 IN A 93.158.134.3 ya.ru. 6494 IN A 87.250.250.3 ya.ru. 6494 IN A 77.88.21.3 ya.ru. 6494 IN A 213.180.204.3 ya.ru. 6494 IN A 87.250.251.3
Также допустим ключ -t
$ dig -t ANY ya.ru +noall +answer ; <<>> DiG 9.7.3 <<>> -t ANY ya.ru +noall +answer ;; global options: +cmd ya.ru. 4857 IN TXT "v=spf1 redirect=_spf.yandex.ru" ya.ru. 6889 IN NS ns5.yandex.ru. ya.ru. 6889 IN NS ns1.yandex.ru. ya.ru. 1459 IN MX 10 mx.yandex.ru. ya.ru. 6420 IN A 213.180.204.3 ya.ru. 6420 IN A 87.250.251.3 ya.ru. 6420 IN A 93.158.134.203 ya.ru. 6420 IN A 213.180.193.3 ya.ru. 6420 IN A 87.250.250.203 ya.ru. 6420 IN A 93.158.134.3 ya.ru. 6420 IN A 87.250.250.3 ya.ru. 6420 IN A 77.88.21.3
6. Краткий вывод команды dig
Допустим чтобы просмотреть только ip-адрес, без лишней информации, используем опцию +short
$ dig ya.ru +short 213.180.193.3 93.158.134.203 87.250.250.203 77.88.21.3 213.180.204.3 87.250.250.3 93.158.134.3 87.250.251.3
Вы также можете вывести информацию по любому виду информации с ключем +short
Пример:
$ dig ya.ru ns +short ns5.yandex.ru. ns1.yandex.ru.
7. Просмотр информации об обратной зоне домена (PTR)
Для просмотра обратной зоны необходимо использовать ключ -х
Для примера, мы хотим узнать имя домена по айпи-адресу 77.88.21.3
$ dig -x 77.88.21.3 +short www.yandex.ru.
Для вывода полной информации убираем ключ +short
$dig -x 77.88.21.3 ; <<>> DiG 9.7.3 <<>> -x 77.88.21.3 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 885 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;3.21.88.77.in-addr.arpa. IN PTR ;; ANSWER SECTION: 3.21.88.77.in-addr.arpa. 11007 IN PTR www.yandex.ru. ;; Query time: 2 msec ;; SERVER: 10.218.138.252#53(10.218.138.252) ;; WHEN: Fri Mar 23 16:21:23 2012 ;; MSG SIZE rcvd: 68
8. Использование конкретного DNS-сервера для выполнения запроса
Для использования конкретного DNS-сервераиспользуется запись вида - @dnsserver, где dnsserver это или имя или ip-адрес DNS-сервера
Данный пример мы рассмотрели в п.1
9. Объемный запрос (запрос информации сразу о нескольких доменах)
Для запроса информации о нескольких доменах возможно использование текстовых файлов с перечислением доменов.
Создадим файл names.txt с именами доменов:
$nano names.txt ya.ru google.ru
Далее используем ключ -f для чтения из файла:
$ dig -f names.txt +noall +answer ya.ru. 5241 IN A 87.250.251.3 ya.ru. 5241 IN A 93.158.134.203 ya.ru. 5241 IN A 213.180.193.3 ya.ru. 5241 IN A 87.250.250.203 ya.ru. 5241 IN A 93.158.134.3 ya.ru. 5241 IN A 87.250.250.3 ya.ru. 5241 IN A 77.88.21.3 ya.ru. 5241 IN A 213.180.204.3 google.ru. 231 IN A 74.125.232.55 google.ru. 231 IN A 74.125.232.56 google.ru. 231 IN A 74.125.232.63
Также можно комбинировать тип DNS записи c опцией -f:
$dig -f names.txt MX +noall +answer ya.ru. 184 IN MX 10 mx.yandex.ru. google.ru. 10800 IN MX 10 google.com.s9b1.psmtp.com. google.ru. 10800 IN MX 10 google.com.s9a2.psmtp.com. google.ru. 10800 IN MX 10 google.com.s9b2.psmtp.com. google.ru. 10800 IN MX 10 google.com.s9a1.psmtp.com.
Также возможно перечисление доменов непосредственно в командной строке. Для примера узнаем MX-запись для домена ya.ru и NS-запись для домена google.ru:
dig ya.ru mx +noall +answer google.ru ns +noall +answer ; <<>> DiG 9.7.3 <<>> ya.ru mx +noall +answer google.ru ns +noall +answer ;; global options: +cmd ya.ru. 7143 IN MX 10 mx.yandex.ru. google.ru. 66518 IN NS ns4.google.com. google.ru. 66518 IN NS ns3.google.com. google.ru. 66518 IN NS ns1.google.com. google.ru. 66518 IN NS ns2.google.com.
10. Изменение параметров по умолчанию для команды dig
Например вы хотите, чтобы утилита dig по умолчанию выводила только секцию ответа (ANSWER SECTION).
Для этого необходимо внести в файл .digrc необходимые ключи, в нашем случае +noall +answer:
$nano $HOME/.digrc +noall +answer
Вывод будет:
$ dig ya.ru ya.ru. 4162 IN A 93.158.134.203 ya.ru. 4162 IN A 213.180.193.3 ya.ru. 4162 IN A 87.250.250.203 ya.ru. 4162 IN A 93.158.134.3 ya.ru. 4162 IN A 87.250.250.3 ya.ru. 4162 IN A 77.88.21.3 ya.ru. 4162 IN A 213.180.204.3 ya.ru. 4162 IN A 87.250.251.3
syslog
(2) вместо /dev/kmsg
sudo dmesg - вызов dmesg
без каких-либо опций выводит весь буфер ядра
sudo dmesg --follow - режим реального времени
sudo dmesg | grep -i usb - поиск определенного термина
sudo dmesg -c - очистить журнал после вывода
sudo dmesg -H - включение временных меток
sudo dmesg -f syslog - отфильтровать вывод по определенной категории(здесь syslog)
Доступные категории -
syslogd
sudo dmesg -f syslog,daemon - можно по нескольким
sudo dmesg -l warn - отфильтровать по уровню журнала
sudo dmesg --time-format=ctime - отфильтровать по выводу формата времени(доступные - ctime,notime,delta,reltime,iso)
Опция -e с echo позволяет вам интерпретировать escape-символы. С помощью escape-символов вы можете отображать текст на экране другим способом по вашему выбору.
Следующие escape-символы доступны с escape:
В то время как опция -e просит команду echo интерпретировать escape-символы, опция -E делает обратное и игнорирует escape-символы.
Теперь давайте посмотрим, как использовать некоторые из этих escape-символов с командой echo.
echo -e "Око за оком оставляет весь мир слепым\n\t- Ганди"
Можете ли вы угадать, какой будет вывод команды выше? Вот:
Око за оком оставляет весь мир слепым
– Ганди
Давайте посмотрим некоторые другие примеры escape-символов. Символ возврата каретки печатает только текст после этого символа.
destroyer@andreyex:~$ echo -e “Привет\rМир”
Мир
Если вы используете символ возврата, он удалит один символ перед ним:
destroyer@andreyex:~$ echo -e “Привет \bМир”
ПриветМир
Вы можете играть с другими escape-символами таким же образом.
Работа с одинарными и двойными кавычками часто является головной болью.
Если у вас есть одинарная кавычка в тексте, который вы хотите отобразить, вы должны заключить весь ввод в двойные кавычки:
destroyer@andreyex:~$ echo “Это мой мир”
Это мой мир
Если вы хотите отобразить двойные кавычки, вы должны «избежать» этого:
destroyer@andreyex:~$ echo “Это \”мой\” мир”
Это “мой” мир
Вы, вероятно, используете команду ls для отображения файлов в каталоге . Вы также можете использовать команду echo для этой цели.
Чтобы отобразить содержимое текущего каталога, вы можете использовать эту команду:
echo *
Вы также можете использовать команду echo для отображения файлов только определенного типа:
echo *.txt
Мы уже показали этот совет для очистки файлов журналов в Linux. Если у вас есть текстовый файл, и вы хотите очистить его содержимое, не удаляя сам файл, вы можете использовать команду echo следующим образом:
echo > filename
Вы, вероятно, натолкнулись на какой-нибудь bash-скрипт, отображающий вывод текста другим цветом. Задумывались ли вы, как это делается? Позвольте нам показать вам это.
Вы можете использовать escape-последовательность ANSI и изменить внешний вид вывода, например, цвет фона, подчеркивание, полужирный и т. д.
Чтобы изменить цвет выходного текста, вы можете использовать эти:
echo -e “\033[30mЭто Черный”
echo -e “\033[31mЭто Красный”
echo -e “\033[32mЭто Зеленый”
echo -e “\033[33mЭто Желтый”
echo -e “\033[34mЭто Синий”
echo -e “\033[35mЭто Пурпурный”
echo -e “\033[36mЭто Голубой”
echo -e “\033[37mЭто Белый”
\033[представляет ESC[ в приведенных выше командах.
fdisk — общее название системных утилит для управления разделами жёсткого диска. Широко распространены и имеются практически в любой операционной системе, но работают по-разному. Используют интерфейс командной строки.
/dev/sda - это диск целиком
/dev/sda1 /dev/sda2/ /dev/sda3 - разделы на диске
Таблица разделов определяет, как именно разбито пространство на целом диске. На данный момент существует два стандарта таблицы разделов — MBR (основная загрузочная запись) и GPT (таблица разделов GUID). MBR был первым стандартом, на смену которому приходит GPT. MBR имеет ограничение в том, что позволяет конфигурировать не более четырех основных разделов и максимальный размер раздела не может превышать 2TB.
Fdisk можно использовать в командном или интерактивном режиме.
Флаги в командном режиме:
fdisk -v Вывод версии
fdisk [-b SSZ] [-u] DISK Изменить таблицу разделов
fdisk -l [-b SSZ] [-u] DISK Показать таблицу разделов
fdisk -s PARTITION Задать разделу размер в блоках
-u: задать начало и конец раздела в блочных единицах измерения
-b 2048: (for certain MO disks) использовать 2048-байтовые блоки
Интерактивный режим:
sudo fdisk /dev/sdb
Добро пожаловать в fdisk (util-linux 2.37.2).
Изменения останутся только в памяти до тех пор, пока вы не решите записать их.
Будьте внимательны, используя команду write.
Команда (m для справки): m
Справка:
Общие
d удалить раздел
F показать свободное неразмеченное пространство
l список известных типов разделов
n добавление нового раздела
p вывести таблицу разделов
t изменение типа раздела
v проверка таблицы разделов
i вывести информацию о разделе
Разное
m вывод этого меню
x дополнительная функциональность (только для экспертов)
Записать и выйти
w запись таблицы разделов на диск и выход
q выход без сохранения изменений
Создать новую метку
g создание новой пустой таблицы разделов GPT
o создание новой пустой таблицы разделов DOS
Команда (m для справки): g
Создана новая метка диска GPT (GUID: ABCCD678-445B-2E46-A499-C4F532CABC20).
Команда (m для справки): n
Номер раздела (1-128, по умолчанию 1): Enter
Первый сектор (2048-4194270, по умолчанию 2048): Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4194270, по умолчанию 4194270): +1G
Создан новый раздел 1 с типом 'Linux filesystem' и размером 1 GiB.
Команда (m для справки): n
Номер раздела (2-128, по умолчанию 2): Enter
Первый сектор (2099200-4194270, по умолчанию 2099200): Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2099200-4194270, по умолчанию 4194270): Enter
Создан новый раздел 2 с типом 'Linux filesystem' и размером 1023 MiB.
Команда (m для справки): p
Диск /dev/sdb: 2 GiB, 2147483648 байт, 4194304 секторов
Disk model: VBOX HARDDISK
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: gpt
Идентификатор диска: ABCCD678-445B-2E46-A499-C4F532CABC20
Устр-во начало Конец Секторы Размер Тип
/dev/sdb1 2048 2099199 2097152 1G Файловая система Linux
/dev/sdb2 2099200 4194270 2095071 1023M Файловая система Linux
Команда (m для справки): w
Таблица разделов была изменена.
Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.
Можно выйти без сохранения с помощью команды q.
Управление разделами так же можно автоматизировать с помощью fdisk в скриптах, пример(здесь используем MBR-разметку):
fdisk /dev/hda << EOF
n
p
1
a
1
t
c
w
EOF
n — создать новый раздел
p — новый раздел будет «primary» (первичный) (можно ввести «e» — extended (расширенный))
1 — первичный раздел будет первой из четырех возможных (для USB-ZIP должен быть 4я)
1 — сделать первый раздел активным
t — сменить тип раздела с — сменить тип раздела на Fat32 (LBA)
w — записать изменения на диск и выйти из fdisk
Далее создаем фс на основе созданных разделов
sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo fdisk -l /dev/sdb
Команда find одна из самых мощных практичных команд bash.
При этом она крайне объёмная и насчитывает более 50 опций, в которых легко запутаться, особенно в сочетании с командами exec или xargs.
Здесь будет шпаргалка по find, начиная с самых распространенных и заканчивая наиболее хитрыми приемами(буду дополнять по мере опыта)
find . -name "s.txt" ищет s.txt в текущем каталоге
find . -iname "s.txt" убрать чувствительность к регистру
find . -type d найти только каталоги
-type : d - каталоги, f -простые файлы, l - символьные ссылки, b - блочные устройства, с - символьные устройства, р - именованные каналы, s - сокеты
find . -size +1G - поиск файлов больше 1гб
find . -empty - поиск пустых файлов и каталогов
find . -cmin -60 - поиск файлов, созданных или изменненых в течение часа
find . -cmin +60 - поиск файлов, созданных и измененных в любое время, кроме последнего часа
find . -atime +180 - поиск файлов, к которым не обращались в последние полгода
find /home -user sc0rch 2>/dev/null - поиск всех файлов, принадлежащих юзеру sc0rch
find /home -perm 777 - поиск по набору разрешений
find . -maxdepth 1 -type f -name "*.txt" - ограничить глубину поиска текущей папкой
find . -path "./directory_ran/*" -prune -o -name "random" - исключить папку /directory_ran из поиска
find /home \(-user john -or -user sc0rch\) -and -size +1G 2>/dev/null - найти файлы johna или sc0rcha и размером более 1гб
find . -empty -delete - найти и удалить все пустые файлы
find /home "random" -exec command {} \; - выполнить произвольную команду по отношению к результатам поиска
find . -empty -exec rm -f {} \; - то же самое что delete
find . -name "*.jpg" -exec cp () /backup/photos \; - скопировать все jpg в /backup/photos
find . -type f -name "*.txt" -exec grep -i alice {} \; - найти все txt-файлы, в которых присутствует имя alice
find . -type f -name "*.txt" | xargs grep -i alice - то же, используя xargs
find . -type f -name "*.txt" -exec mv {} {}.old \; - переименовать все обнаруженные файлы с расширением .old
Grep ожидает шаблон и необязательные аргументы вместе со списком файлов, если они используются без конвейера.
$ grep [options] pattern [files]
Пример:
$ grep my file.txt
my_file
$
Grep позволяет искать заданный шаблон не только в одном, но и в нескольких файлах с помощью масок (например, знака «*»):
$ sudo grep -i err /var/log/messages*
Вывод:
$ sudo grep err /var/log/messages*
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11)
/var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
/var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message.
$
Из приведенного вывода можно заметить, что grep печатает имя файла перед соответствующей строкой, чтобы указать местонахождение шаблона.
Grep предлагает искать паттерн, не глядя на его регистр. Используйте флаг -i, чтобы утилита игнорировала регистр:
$ grep -i [pattern] [file]
Вывод:
$ grep -i it text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
Зачастую вместо частичного совпадения необходимо полное соответствие поисковому слову. Это можно сделать, используя флаг -w:
$ grep -w [pattern] [file]
Вывод:
$ grep -w is text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$
Иногда вместо фактического совпадения со строкой нам необходимо количество успешных совпадений, найденных grep. Этот результат можно получить, используя опцию -c:
$ grep -c [pattern] [file]
Вывод:
$ grep -c is text_file.txt
2
$
Часто требуется выполнить поиск файлов не только в текущем рабочем каталоге, но и в подкаталогах. Grep позволяет это сделать с помощью флага -r:
$ grep -r [pattern] *
Вывод:
$ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$
Как можно заметить, grep проходит через каждый подкаталог внутри текущего каталога и перечисляет файлы и строки, в которых найдено совпадение.
Если вы хотите найти что-то несоответствующее заданному шаблону, grep и это умеет при помощи флага -v:
$ grep -v [pattern] [file]
Вывод:
$ grep This text_file.txt
This is a sample text file. It contains
This is a sample text file. It's repeated two times.
$ grep -v This text_file.txt
several lines to be used as part of testing grep
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$
Можно сравнить вывод команды grep по одному и тому же шаблону и файлу с флагом -vили без него. С флагом печатается каждая строка, которая не соответствует шаблону.
Если хотите напечатать номера найденных строк, чтобы узнать их позицию в файле, используйте опцию -n:
$ grep -n [pattern] [file]
Вывод:
$ grep -n This text_file.txt
1:This is a sample text file. It contains
7:This is a sample text file. It's repeated two times.
$
Для больших файлов вывод может быть огромным и тогда вам понадобится фиксированное количество строк вместо всей простыни. Можно использовать -m[num]:
$ grep -m[num] [pattern] [file]
Обратите внимание, как использование флага влияет на вывод для того же набора условий:
$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep -m2 It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
$
Иногда необходимо вывести не только строки по некоторому шаблону, но и дополнительные строки выше или ниже найденных для понимания контекста. Можно напечатать строку выше, ниже или оба варианта, используя флаги -A, -B или -C со значением num (количество дополнительных строк, которые будут напечатаны). Это применимо ко всем совпадениям, которые grep находит в указанном файле или в списке файлов.
$ grep -A[num] [pattern] [file]
или
$ grep -B[num] [pattern] [file]
или
$ grep -C[num] [pattern] [file]
Ниже показан обычный вывод grep, а также вывод с флагами. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующих выходных данных:
$ grep numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$ grep -A1 numbers text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$ grep -B1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
$ grep -C1 numbers text_file.txt
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
$
Чтобы напечатать только имя файлов, в которых найден шаблон, используйте флаг -l:
$ grep -l [pattern] [file]
Вывод:
$ grep -l su *.txt
file.txt
text_file.txt
$
Если необходимо напечатать строки, которые точно соответствуют заданному шаблону, а не какой-то его части, применяйте в команде ключ -x:
$ grep -x [pattern] [file]
В приведенном ниже примере file.txt содержится слово «support», а строки без точного совпадения игнорируются.
$ grep -x support *.txt
file.txt:support
$
Используя регулярные выражения, можно найти начало строки:
$ grep [options] "^[string]" [file]
Пример:
$ grep It text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$ grep ^It text_file.txt
It supports numbers like 1, 2, 3 etc. as well as
$
Обратите внимание, как использование символа «^» изменяет выходные данные. Знак «^» указывает начало строки, т.е. ^It соответствует любой строке, начинающейся со слова It. Заключение в кавычки может помочь, когда шаблон содержит пробелы и т. д.
Эта полезная регулярка способна помочь найти по шаблону конец строки:
$ grep [options] "[string]$" [file]
Пример:
$ grep "\." text_file.txt
This is a sample text file. It contains
functionality. You can always use grep with any
kind of data but it works best with text data.
It supports numbers like 1, 2, 3 etc. as well as
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$ grep "\.$" text_file.txt
kind of data but it works best with text data.
alphabets and special characters like - + * # etc.
This is a sample text file. It's repeated two times.
$
Обратите внимание, как меняется вывод, когда мы сопоставляем символ «.» и когда используем «$», чтобы сообщить утилите о строках, заканчивающихся на «.» (без тех, которые могут содержать символ посередине).
Если у вас есть некий список часто используемых шаблонов, укажите его в файле и используйте флаг -f. Файл должен содержать по одному шаблону на строку.
$ grep -f [pattern_file] [file_to_match]
В примере мы создали файл шаблонов pattern.txt с таким содержанием:
$ cat pattern.txt
This
It
$
Чтобы это использовать, применяйте ключ -f:
$ grep -f pattern.txt text_file.txt
This is a sample text file. It contains
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
Grep позволяет указать несколько шаблонов с помощью -e:
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
Пример:
$ grep -e is -e It -e to text_file.txt
This is a sample text file. It contains
several lines to be used as part of testing grep
It supports numbers like 1, 2, 3 etc. as well as
This is a sample text file. It's repeated two times.
$
Grep поддерживает расширенные регулярные выражения или ERE (похожие на egrep) с использованием флага -E.
Использование ERE имеет преимущество, когда вы хотите рассматривать мета-символы как есть и не хотите заменять их строками. Использование -E с grep эквивалентно команде egrep.
$ grep -E '[Extended RegEx]' [file]
Вот одно из применений ERE, когда необходимо вывести строки, например, из больших конфигурационных файлов. Здесь использовался флаг -v, чтобы не печатать строки, соответствующие шаблону ^(#|$).
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem sftp /usr/libexec/openssh/sftp-server
$
Приведенные выше примеры – лишь верхушка айсберга. Grep поддерживает целый ряд опций и может оказаться полезным инструментом в руках специалиста, который способен эффективно его использовать. Мы можем не только взять на вооружение приведенные выше примеры, но и комбинировать их, чтобы получить требуемый результат в различных условиях.
Для дальнейшего изучения утилиты и расширения кругозора стоит почитать мануал, выполнив в терминале команду man grep, или посетить страницу с официальной документацией.
Как и с awk объем документации на iptables огромный, поэтому опишу только основные моменты
Общий синтаксис выглядит так
iptables -t таблица действие цепочка дополнительные_параметры
Чтобы заблокировать требуемый IP-адрес, нужно добавить правило в цепочку INPUT
. Также необходимо указать таблицу. В команде ниже имя таблицы задано явно. Если ключ t
не используется, то правило попадает в таблицу по умолчанию — Filter
. В качестве примера заблокируем IP-адрес 10.0.36.126:
iptables -t filter -A INPUT -s 10.0.36.126 -j REJECT
При блокировке конкретного IP-адреса были использованы такие опции, как:
t
— указывает таблицу, для которой будет применимо правило;A
— указывает, в какую цепочку необходимо добавить правило. В данном примере указана цепочка INPUT
;s
— указывает целевой объект (источник), к которому необходимо применить действие;j
— указывает действие, которое должно быть выполнено. В данном примере трафик будет отклонен (действие REJECT
).При необходимости блокировки исходящего трафика на конкретный IP-адрес, используется цепочка OUTPUT
и опция d
:
iptables -A OUTPUT -d 10.0.36.126 -j REJECT
Заблокируем SSH-соединения с хоста 10.0.36.126 для протокола TCP:
iptables -A INPUT -p tcp --dport ssh -s 10.0.36.126 -j REJECT
Для UDP:
iptables -A INPUT -p udp --dport ssh -s 10.0.36.126 -j REJECT
Заблокируем конкретный порт:
iptables -A INPUT -p tcp --dport 22 -s 10.0.36.126 -j REJECT
Заблокируем ssh с любого ip-адреса:
iptables -A INPUT -p tcp --dport ssh -j DROP
Разрешаем весь трафик к серверу для клиента с IP-адресом 10.0.36.126:
iptables -A INPUT -s 10.0.36.126 -j ACCEPT
Разрешить трафик с определенного диапазона IP-адресов, например с 10.0.36.126 до 10.0.36.156:
iptables -A INPUT -m iprange --src-range 10.0.36.126-10.0.36.156 -j ACCEPT
Разрешить весь трафик от сервера к определенным диапазонам IP-адресов — с 10.0.36.126 до 10.0.36.156:
iptables -A OUTPUT -m iprange --dst-range 10.0.36.126-10.0.36.156 -j ACCEPT
Для того чтобы открыть порт, необходимо задать протокол через опцию p
. В качестве протокола поддерживаются такие значения, как tcp
, udp
и т.д. С полным списком поддерживаемых протоколов можно ознакомиться в файле /etc/protocols
Откроем 22 порт по протоколу TCP для адреса 10.0.36.126:
iptables -A INPUT -p tcp --dport 22 -s 10.0.36.126 -j ACCEPT
Откроем порты 22, 80, 443 по протоколу TCP для адреса 10.0.36.126:
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -s 10.0.36.126 -j ACCEPT
Для того чтобы запретить входящий ICMP-трафик, необходимо выполнить следующую команду:
iptables -A INPUT -j DROP -p icmp --icmp-type echo-request
Если необходимо добавить сообщение об ошибке «Destination Port Unreachable», то в команде необходимо заменить действие DROP
на REJECT
:
iptables -A INPUT -j REJECT -p icmp --icmp-type echo-request
Пример блокировки трафика для устройства с MAC-адресом 00:0c:29:ed:a9:60:
iptables -A INPUT -m mac --mac-source 00:0c:29:ed:a9:60 -j DROP
Предположим, мы хотим разрешить входящий доступ по протоколу SSH, который будет доступен только с понедельника по пятницу с 9 утра до 6 вечера. Команда будет выглядеть следующим образом:
iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
Чтобы сохранять правила после перезагрузки, необходимо установить пакет iptables-persistent
. Для этого воспользуемся командой:
apt -y install iptables-persistent
Для отображения нумерации правил воспользуемся командой:
iptables -L --line-numbers
Удалим правило под номером 2 с помощью команды:
iptables -D INPUT 2
Также существует еще один способ который заключается в удалении сразу всех правил для конкретной цепочки. Например, для цепочки OUTPUT
команда будет следующей:
iptables -F OUTPUT
Удаление всех правил:
iptables -F
Сохранить текущие правила:
iptables-save > /etc/iptables/rules.v4
Сохранить текущие ipv6-правила:
ip6tables-save > /etc/iptables/rules.v6
Восстановить ранее сохраненные правила:
iptables-restore < /etc/iptables/rules.v4
Использованы материалы https://1cloud.ru/help/security/ispolzovanie-iptables-na-linux
В командной строке для остановки какого-либо процесса преобладает следующий синтаксис:
Где:
Команда Kill посылает указанный сигнал указанному процессу. Если не указано ни одного сигнала, посылается сигнал SIGTERM. Сигнал SIGTERM завершает лишь те процессы, которые не обрабатывают его приход. Для других процессов может быть необходимым послать сигнал SIGKILL, поскольку этот сигнал перехватить невозможно.
Номера сигналов
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Сигнал по умолчанию (если он не задан) - SIGTERM. Если он не помогает, для принудительного завершения процесса можно использовать следующие варианты:
$ kill SIGKILL PID $ kill -9 PID
где флаг "-9" ссылается на сигнал SIGKILL.
Если вы не знаете точно PID приложения, просто запустите команду:
$ ps ux
Она выведет информацию по всем запущенным программам.
Также обратите внимание, что можно завершать несколько процессов одной командой.
$ kill -9 PID1 PID2 PID 3
Команда "pkill" позволяет использовать расширенные шаблоны регулярных выражений и другие критерии соответствия. Вместо использования PID вы теперь можете завершить приложение, введя имя его процесса. Например, для завершения работы Firefox просто введите команду:
$ pkill firefox
Так как оно соответствует шаблону регулярного выражения, вы можете также ввести имя только частично, например:
$ pkill fire
Чтобы предотвратить завершение не тех приложений, которые требовалось, можно использовать команду "pgrep -l [process name]" для вывода списка всех подходящих процессов.
Killall также использует имя процесса вместо PID и завершает все экземпляры процесса с этим именем. Например, если вы запустили несколько экземпляров Firefox, вы можете завершить их все с помощью команды:
$ killall firefox
В Gnome вы можете перезапустить Nautilus с помощью команды:
$ killall nautilus
Xkill - это графический способ завершения приложений. Когда вы введете "xkill" в терминале, курсор примет вид крестика. Все, что вам требуется, кликнуть этим крестиком в окне нужного приложения и оно немедленно завершится. Если вам понравится такой способ, можно настроить для активации xkill горячие клавиши. Например, ctrl+shift+K в kubuntu по умолчанию.
Большинство современных оболочек имеют стандартную встроенную команду kill.
ls без опций отображает список файлов и каталогов в чистом формате, где мы не сможем просматривать такие детали, как типы файлов, размер, дата и время изменения, разрешения и ссылки и т. д.
# ls
001.pcap Desktop Downloads index.html install.log.syslog Pictures Template
anaconda-ks.cfg Documents fbcmd_update.php install.log Music Public Videos
Здесь, ls -l (l — символ, а не единица) показывает файл или каталог вместе с его размером, а также дату и время изменения, права и владельца.
# ls -l
total 176
-rw-r--r--. 1 root root 683 Aug 19 09:59 0001.pcap
-rw-------. 1 root root 1586 Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Documents
drwxr-xr-x. 4 root root 4096 Aug 16 02:55 Downloads
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Videos
Показ всех файлов, включая скрытые, которые начинаются с «.»
# ls -a
. .bashrc Documents .gconfd install.log .nautilus
.. .cache Downloads .gnome2 install.log.syslog .netstat.swp
0001.pcap .config .elinks .gnome2_private .kde .opera
anaconda-ks.cfg .cshrc .esd_auth .gtk-bookmarks .libreoffice Pictures
.bash_history .dbus .fbcmd .gvfs .local .pki
.bash_logout Desktop fbcmd_update.php .ICEauthority .mozilla Public
.bash_profile .digrc .gconf index.html Music .pulse
С опцией -lh, ls показывает размеры в удобном формате.
# ls -lh
total 176K
-rw-r--r--. 1 root root 683 Aug 19 09:59 0001.pcap
-rw-------. 1 root root 1.6K Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Documents
drwxr-xr-x. 4 root root 4.0K Aug 16 02:55 Downloads
-rw-r--r--. 1 root root 21K Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root 46K Jul 31 09:58 index.html
-rw-r--r--. 1 root root 48K Jul 31 02:17 install.log
-rw-r--r--. 1 root root 12K Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Music
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Public
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Templates
drwxr-xr-x. 2 root root 4.0K Jul 31 02:48 Videos
Использование опции -F с командой ls добавит символ «/» в конце каждого каталога.
# ls -F
0001.pcap Desktop/ Downloads/ index.html install.log.syslog Pictures/
anaconda-ks.cfg Documents/ fbcmd_update.php install.log Music/ Public/
Следующая команда ls с опцией -r выводит файлы и каталоги в обратном порядке.
# ls -r
Videos Public Music install.log fbcmd_update.php Documents 0001.pcap
Templates Pictures install.log.syslog index.html Downloads Desktop
ls с опцией -R выведет очень длинный список деревьев каталогов. Смотрите пример вывода команды.
# ls -R
total 1384
-rw-------. 1 root root 33408 Aug 8 17:25 anaconda.log
-rw-------. 1 root root 30508 Aug 8 17:25 anaconda.program.log
./httpd:
total 132
-rw-r--r-- 1 root root 0 Aug 19 03:14 access_log
-rw-r--r--. 1 root root 61916 Aug 10 17:55 access_log-20120812
./lighttpd:
total 68
-rw-r--r-- 1 lighttpd lighttpd 7858 Aug 21 15:26 access.log
-rw-r--r--. 1 lighttpd lighttpd 37531 Aug 17 18:21 access.log-20120819
./nginx:
total 12
-rw-r--r--. 1 root root 0 Aug 12 03:17 access.log
-rw-r--r--. 1 root root 390 Aug 12 03:17 access.log-20120812.gz
С помощью комбинации -ltr список будет сортироваться по дате последнего изменения от старых к новым.
# ls -ltr
total 176
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-------. 1 root root 1586 Jul 31 02:17 anaconda-ks.cfg
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Videos
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Documents
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
drwxr-xr-x. 4 root root 4096 Aug 16 02:55 Downloads
-rw-r--r--. 1 root root 683 Aug 19 09:59 0001.pcap
При комбинации -lS перечисляет файлы и папки по размеру, начиная с большого.
# ls -lS
total 176
-rw-r--r--. 1 root root 48867 Jul 31 02:17 install.log
-rw-r--r--. 1 root root 46701 Jul 31 09:58 index.html
-rw-r--r--. 1 root root 21262 Aug 12 12:42 fbcmd_update.php
-rw-r--r--. 1 root root 11439 Jul 31 02:13 install.log.syslog
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Desktop
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Documents
drwxr-xr-x. 4 root root 4096 Aug 16 02:55 Downloads
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Music
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Pictures
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Public
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Templates
drwxr-xr-x. 2 root root 4096 Jul 31 02:48 Videos
-rw-------. 1 root root 1586 Jul 31 02:17 anaconda-ks.cfg
-rw-r--r--. 1 root root 683 Aug 19 09:59 0001.pcap
Мы можем увидеть некоторое число перед именем файла/каталога. С опцией -i файл/каталог отображается с номером inode (индексный дескриптор).
# ls -i
20112 0001.pcap 23610 Documents 23793 index.html 23611 Music
23564 anaconda-ks.cfg 23595 Downloads 22 install.log 23612 Pictures
23594 Desktop 23585 fbcmd_update.php 35 install.log.syslog 23601 Public
Проверка версии команды:
# ls --version
ls (GNU coreutils) 8.4
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Richard M. Stallman and David MacKenzie.
Вывести справочную страницу команды ls с опциями.
# ls --help
Usage: ls [OPTION]... [FILE]...
С помощью команды ls -l выведите список файлов в каталоге /tmp. Команда с параметром -ld выводит информацию о каталоге /tmp.
# ls -l /tmp
total 408
drwx------. 2 narad narad 4096 Aug 2 02:00 CRX_75DAF8CB7768
-r--------. 1 root root 384683 Aug 4 12:28 htop-1.0.1.tar.gz
drwx------. 2 root root 4096 Aug 4 11:20 keyring-6Mfjnk
drwx------. 2 root root 4096 Aug 16 01:33 keyring-pioZJr
drwx------. 2 gdm gdm 4096 Aug 21 11:26 orbit-gdm
drwx------. 2 root root 4096 Aug 19 08:41 pulse-gl6o4ZdxQVrX
drwx------. 2 narad narad 4096 Aug 4 08:16 pulse-UDH76ExwUVoU
drwx------. 2 gdm gdm 4096 Aug 21 11:26 pulse-wJtcweUCtvhn
-rw-------. 1 root root 300 Aug 16 03:34 yum_save_tx-2012-08-16-03-34LJTAa1.yumtx
# ls -ld /tmp/
drwxrwxrwt. 13 root root 4096 Aug 21 12:48 /tmp/
Для просмотра UID и GID файлов и каталогов используйте опцию -n с командой ls.
# ls -n
total 36
drwxr-xr-x. 2 500 500 4096 Aug 2 01:52 Downloads
drwxr-xr-x. 2 500 500 4096 Aug 2 01:52 Music
drwxr-xr-x. 2 500 500 4096 Aug 2 01:52 Pictures
-rw-rw-r--. 1 500 500 12 Aug 21 13:06 tmp.txt
drwxr-xr-x. 2 500 500 4096 Aug 2 01:52 Videos
Мы создали псевдоним для команды ls, когда мы выполняем команду ls, она по умолчанию принимает опцию -l и отображает длинный список, как упоминалось ранее.
# alias ls="ls -l"
Примечание. Мы можем посмотреть уже созданные ранее псевдонимы, а также удалить alias, как показано на примере ниже.
# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
Чтобы удалить ранее определенный псевдоним, просто используйте команду unalias.
# unalias ls
Ядро — это та часть операционной системы, работа которой полностью скрыта от пользователя, т. к. пользователь с ним не работает напрямую: пользователь работает с программами. Но, тем не менее, без ядра невозможна работа ни одной программы, т.е. они без ядра бесполезны. Этот механизм чем-то напоминает отношения официанта и клиента: работа хорошего официанта должна быть практически незаметна для клиента, но без официанта клиент не сможет передать заказ повару, и этот заказ не будет доставлен.
В Linux ядро монолитное, т.е. все его драйвера и подсистемы работают в своем адресном пространстве, отделенном от пользовательского. Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В случае с ядром Linux — это правда лишь отчасти: ядро Linux может работать в таком режиме, однако, в подавляющем большинстве сборок возможна модификация части кода ядра без его перекомпиляции, и даже без его выгрузки. Это достигается путем загрузки и выгрузки некоторых частей ядра, которые называются модулями. Чаще всего в процессе работы необходимо подключать модули драйверов устройств, поддержки криптографических алгоритмов, сетевых средств, и, чтобы уметь это правильно делать, нужно разбираться в строении ядра и уметь правильно работать с его модулями. Об этом и пойдет речь в этой статье.
В современных ядрах при подключении оборудования модули подключаются автоматически, а это событие обрабатывается демоном udev, который создает соответствующий файл устройства в каталоге "/dev". Все это выполняется в том случае, если соответствующий модуль корректно установлен в дерево модулей. В случае с файловыми системами ситуация та же: при попытке монтирования файловой системы ядро подгружает необходимый модуль автоматически, и выполняет монтирование.
Если необходимость в модуле не на столько очевидна, ядро его не загружает самостоятельно. Например, для поддержки функции шифрования на loop устройстве нужно вручную подгрузить модуль «cryptoloop», а для непосредственного шифрования — модуль алгоритма шифрования, например «blowfish».
Поиск необходимого модуля
Модули хранятся в каталоге "/lib/modules/<версия ядра>" в виде файлов с расширением «ko». Для получения списка всех модулей из дерева можно выполнить команду поиска всех файлов с расширением «ko» в каталоге с модулями текущего ядра:
find /lib/modules/`uname -r` -name ‘*.ko’
Полученный список даст некоторое представление о доступных модулях, их назначении и именах. Например, путь «kernel/drivers/net/wireless/rt2x00/rt73usb.ko» явно указывает на то, что этот модуль — драйвер устройства беспроводной связи на базе чипа rt73. Более детальную информацию о модуле можно получить при помощи команды modinfo:
# modinfo rt73usb
filename: /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko
license: GPL
firmware: rt73.bin
description: Ralink RT73 USB Wireless LAN driver.
version: 2.3.0
author: rt2x00.serialmonkey.com
depends: rt2x00lib,rt2x00usb,crc-itu-t
vermagic: 2.6.38-gentoo-r1 SMP preempt mod_unload modversions CORE2
parm: nohwcrypt:Disable hardware encryption. (bool)
Поле «firmware» указывает на то, что этот модуль сам по себе не работает, ему нужна бинарная микропрограмма устройства в специальном файле «rt73.bin». Необходимость в файле микропрограммы появилась в связи с тем, что интерфейс взаимодействия с устройством закрыт, и эти функции возложены на файл прошивки (firmware). Взять firmware можно с сайта разработчика, установочного диска, поставляемого вместе с устройством, или где-нибудь в репозиториях дистрибутива, затем нужно его скопировать в каталог "/lib/firmware", при чем имя файла должно совпадать с тем, что указано в модуле.
Следующее поле, на которое нужно обратить внимание — это поле «depends». Здесь перечислены модули, от которых зависит данный. Логично предположить, что модули друг от друга зависят, например модуль поддержки USB накопителей зависит от модуля поддержки USB контроллера. Эти зависимости просчитываются автоматически, и будут описаны ниже.
Последнее важное поле — «param». Здесь описаны все параметры, которые может принимать модуль при загрузке, и их описания. В данном случае возможен только один: «nohwcrypt», который, судя по описанию, отключает аппаратное шифрование. В скобках указан тип значения параметра.
Более подробную информацию о модуле можно прочитать в документации к исходным кодам ядра (каталог Documentation) в дереве исходных кодов. Например, найти код нужного видеорежима драйвера «vesafb» можно в файле документации «Documentation/fb/vesafb.txt» относительно корня дерева исходных кодов.
Загрузка и выгрузка модулей
Загрузить модуль в ядро можно при помощи двух команд: «insmod» и «modprobe», отличающихся друг от друга возможностью просчета и удовлетворения зависимостей. Команда «insmod» загружает конкретный файл с расширением «ko», при этом, если модуль зависит от других модулей, еще не загруженных в ядро, команда выдаст ошибку, и не загрузит модуль. Команда «modprobe» работает только с деревом модулей, и возможна загрузка только оттуда по имени модуля, а не по имени файла. Отсюда следует область применения этих команд: при помощи «insmod» подгружается файл модуля из произвольного места файловой системы (например, пользователь скомпилировал модули и перед переносом в дерево ядра решил проверить его работоспособность), а «modprobe» — для подгрузки уже готовых модулей, включенных в дерево модулей текущей версии ядра. Например, для загрузки модуля ядра «rt73usb» из дерева ядра, включая все зависимости, и отключив аппаратное шифрование, нужно выполнить команду:
# modprobe rt73usb nohwcrypt=0
Загрузка этого модуля командой «insmod» произойдет следующим образом:
# insmod /lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko nohwcrypt=0
Но нужно помнить, что при использовании «insmod» все зависимости придется подгружать вручную. Поэтому эта команда постепенно вытесняется командой «modprobe».
После загрузки модуля можно проверить его наличие в списке загруженных в ядро модулей при помощи команды «lsmod»:
# lsmod | grep rt73usb
Module | Size | Used by | |
rt73usb | 17305 | 0 | |
crc_itu_t | 999 | 1 | rt73usb |
rt2x00usb | 5749 | 1 | rt73usb |
rt2x00lib | 19484 | 2 | rt73usb,rt2x00usb |
Из вывода команды ясно, что модуль подгружен, а так же в своей работе использует другие модули.
Чтобы его выгрузить, можно воспользоваться командой «rmmod» или той же командой «modprobe» с ключем "-r". В качестве параметра обоим командам нужно передать только имя модуля. Если модуль не используется, то он будет выгружен, а если используется — будет выдана ошибка, и придется выгружать все модули, которые от него зависят:
# rmmod rt2x00usb
ERROR: Module rt2x00usb is in use by rt73usb
# rmmod rt73usb
# rmmod rt2x00usb
После выгрузки модуля все возможности, которые он предоставлял, будут удалены из таблицы ядра.
Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы. Я не буду вдаваться здесь в подробности, они для каждого дистрибутива свои, но один метод загрузки всегда действенен и удобен: при помощи стартовых скриптов. В тех же RedHat системах можно записать команды загрузки модуля прямо в "/etc/rc.d/rc.local" со всеми опциями.
Файлы конфигурация модулей находится в каталоге "/etc/modprobe.d/" и имеют расширение «conf». В этих файлах преимущественно перечисляются альтернативные имена модулей, их параметры, применяемые при их загрузке, а так же черные списки, запрещенные для загрузки. Например, чтобы вышеупомянутый модуль сразу загружался с опцией «nohwcrypt=1» нужно создать файл, в котором записать строку:
options rt73usb nohwcrypt=1
Черный список модулей хранится преимущественно в файле "/etc/modules.d/blacklist.conf" в формате «blacklist <имя модуля>». Используется эта функция для запрета загрузки глючных или конфликтных модулей.
Сборка модуля и добавление его в дерево
Иногда нужного драйвера в ядре нет, поэтому приходится его компилировать вручную. Это так же тот случай, если дополнительное ПО требует добавление своего модуля в ядро, типа vmware, virtualbox или пакет поддержки карт Nvidia. Сам процесс компиляции не отличается от процесса сборки программы, но определенные требования все же есть.
Во первых, нужен компилятор. Обычно установка «gcc» устанавливает все, что нужно для сборки модуля. Если чего-то не хватает — программа сборки об этом скажет, и нужно будет доустановить недостающие пакеты.
Во вторых, нужны заголовочные файлы ядра. Дело в том, что модули ядра всегда собираются вместе с ядром, используя его заголовочные файлы, т.к. любое отклонение и несоответствие версий модуля и загруженного ядра ведет к невозможности загрузить этот модуль в ядро.
Если система работает на базе ядра дистрибутива, то нужно установить пакеты с заголовочными файлами ядра. В большинстве дистрибутивов это пакеты «kernel-headers» и/или «kernel-devel». Для сборки модулей этого будет достаточно. Если ядро собиралось вручную, то эти пакеты не нужны: достаточно сделать символическую ссылку "/usr/src/linux", ссылающуюся на дерево сконфигурированных исходных кодов текущего ядра.
После компиляции модуля на выходе будет получен один или несколько файлов с расширением «ko». Можно попробовать их загрузить при помощи команды «insmod» и протестировать их работу.
Если модули загрузились и работают (или лень вручную подгружать зависимости), нужно их скопировать в дерево модулей текущего ядра, после чего обязательно обновить зависимости модулей командой «depmod». Она пройдется рекурсивно по дереву модулей и запишет все зависимости в файл «modules.dep», который, в последствие, будет анализироваться командой «modprobe». Теперь модули готовы к загрузке командой modprobe и могут загружаться по имени со всеми зависимостями.
Стоит отметить, что при обновлении ядра этот модуль работать не будет. Нужны будут новые заголовочные файлы и потребуется заново пересобрать модуль.
«Слушаем» что говорит ядро
При появлении малейших неполадок с модулем, нужно смотреть сообщения ядра. Они выводятся по команде «dmesg» и, в зависимости от настроек syslog, в файл "/var/log/messages". Сообщения ядра могут быть информативными или отладочными, что поможет определить проблему в процессе работы модуля, а могут сообщать об ошибке работы с модулем, например недостаточности символов и зависимостей, некорректных переданных параметрах. Например, выше рассмотренный модуль «rt73usb» требует параметр типа bool, что говорит о том, что параметр может принимать либо «0», либо «1». Если попробовать передать «2», то система выдаст ошибку:
# modprobe rt73usb nohwcrypt=2
FATAL: Error inserting rt73usb (/lib/modules/2.6.38-gentoo-r1/kernel/drivers/net/wireless/rt2x00/rt73usb.ko): Invalid argument
Ошибка «Invalid argument» может говорить о чем угодно, саму ошибку ядро на консоль написать не может, только при помощи функции «printk» записать в системный лог. Посмотрев логи можно уже узнать в чем ошибка:
# dmesg | tail -n1
rt73usb: `2' invalid for parameter `nohwcrypt'
В этом примере выведена только последняя строка с ошибкой, чтобы не загромаждать статью. Модуль может написать и несколько строк, поэтому лучше выводить полный лог, или хотя бы последние строк десять.
Ошибку уже легко найти: значение «2» неприемлемо для параметра «nohwcrypt». После исправления, модуль корректно загрузится в ядро.
Из всего сказанного можно сделать один вывод: ядро Linux играет по своим правилам и занимается серьезными вещами. Тем не менее — это всего лишь программа, оно, по сути, не сильно отличается от других обычных программ. Понимание того, что ядро не так уж страшно, как кажется, может стать первым шагом к пониманию внутреннего устройства системы и, как результат, поможет быстро и эффективно решать задачи, с которыми сталкивается любой администратор Linux в повседневной работе.
Использованы материалы http://www.rhd.ru/docs/manuals/enterprise/RHEL-4-Manual/sysadmin-guide/ch-kernel-modules.html
https://habr.com/ru/articles/117654/
mv (сокращённо от англ. move) — утилита в UNIX и UNIX-подобных системах, используется для перемещения или переименования файлов.
Синтаксис:
mv [опции...] исходный_файл целевой_файл
mv [опции...] исходный_файл... каталог
Примечание. Часто утилиту mv называют командой, опции — ключами, а файлы/каталоги — аргументами. В этом случае синтаксис будет следующим:
mv [ключи...] аргумент_1 аргумент_2
Если в качестве аргументов заданы имена двух файлов, то имя первого файла будет изменено на имя второго: mv file_1 file_2
.
Если последний аргумент является именем существующего каталога, то mv перемещает все заданные файлы в этот каталог: mv file_1 ./dir/
(перемещает file_1
в dir/file_1
относительно текущего каталога). Если последний аргумент не является каталогом и задано более чем два файла, то будет выдано сообщение об ошибке.
Наглядные примеры с файлами и каталогами:
1. $ mv plain.txt plain_2.txt
— переименовать файл plain.txt в plain_2.txt.
2. $ mv tmp tmp_2
— переименовать каталог tmp в tmp_2. Если существует каталог tmp_2, то вместо переименования произойдёт перемещение каталога tmp в каталог tmp_2.
3. $ mv plain.txt tmp
— переместить файл plain.txt в каталог tmp. Если каталога tmp не существует, то вместо перемещения файл plain.txt переименуется в tmp.
4. $ mv /home/user/plain.txt /home/user/tmp
(где user — ваше имя в Linux) — то же, что и предыдущая команда, но с использованием абсолютного пути.
5. $ mv plain.txt ../
— переместить файл plain.txt в родительский каталог текущего каталога.
6. $ mv ../plain.txt .
— переместить из родительского каталога (../
) файл plain.txt в текущий каталог (.
).
7. $ mv ../plain.txt plain_2.txt
— переместить файл plain.txt из каталога на один уровень выше текущего в текущий и переименовать этот файл в plain_2.txt.
8. $ mv plain.txt /tmp_1/tmp_2/tmp_3/plain_2.txt
— переместить файл plain.txt из текущего каталога в каталог tmp_3 и переименовать этот файл в plain_2.txt.
Утилита mv имеет ключи, с помощью которых можно задать дополнительные функции для команды.
-i
, --interactive
— интерактивный режим. Предупреждает, что выбранный файл будет записан поверх уже существующего в каталоге назначения.Примеры:
1. $ mv -i plain.txt tmp
— переместить файл plain.txt в каталог tmp, в котором возможно уже находится файл plain.txt. Если в каталоге действительно находится файл plain.txt, в терминале появится запрос:
$ mv -i plain.txt tmp
mv: переписать 'tmp/plain.txt'? yes
Подтверждают, введя слово yes или да (можно одной буквой — y или д). Любой другой ввод пропустит файл.
2. $ mv -i /tmp/images/*.jpg .
— перемещает все изображения с расширением .jpg из каталога tmp/images/ в текущий каталог (.
). Если в текущем каталоге встретятся изображения с расширением .jpg, mv выдаст запрос на перезапись. В этой команде используется звёздочка (*) — это подстановочный знак (см. ниже главу «Подстановочные знаки»).
-f
, --force
— перезаписывать существующие файлы не спрашивая (не выдавать запрос на подтверждение операции). Опция может быть полезной, когда происходит перезапись нескольких файлов с правами для чтения. Например, есть каталог tmp, в котором находится файл plain.txt с правами для чтения; нужно перезаписать этот файл другим файлом plain.txt без лишних вопросов:$ mv -f plain.txt tmp
Если бы не было ключа -f
, то в терминале появился бы вопрос, примерно, следующего содержания:
mv: заместить 'tmp/plain.txt', несмотря на права доступа 0464 (r--rw-r--)?
-n
, --no-clobber
— не перезаписывать существующий файл.Пример:
1. $ mv -n plain.txt tmp
— переместить файл plain.txt в каталог tmp. Если в каталоге tmp уже есть файл plain.txt, то ничего не делать (не перемещать, не перезаписывать и не спрашивать).
Примечание для вышеперечисленных ключей. В случае ошибочной или преднамеренной записи, когда опции -f
, -i
и n
заданы вместе, срабатывает только последняя. Примеры:
1. $ mv -fi plain.txt tmp
— то же, что и mv -i
. Опция -f
игнорируется.
2. $ mv -if plain.txt tmp
— то же, что и mv -f
. Опция -i
игнорируется.
3. $ mv -fn plain.txt tmp
— то же, что и mv -n
. Опция -f
игнорируется.
-v
, --verbose
— режим дополнительных сообщений. Выводить на экран сообщение о каждой выполняемой операции.Примеры:
1. $ mv -v plain.txt tmp
— переместить файл plain.txt в папку tmp и вывести сообщение о проделанной операции. В терминале отобразится следующее:
$ mv -v plain.txt tmp
renamed 'plain.txt' -> 'tmp/plain.txt'
Совместное использование опций -f
и -i
с -v
:
1. $ mv -vf plain.txt tmp
— переместить файл plain.txt в папку tmp, без вопроса на перезапись, и вывести сообщение о проделанной операции.
2. $ mv -vf plain* text/ tmp/
— переместить без запроса подтверждения все файлы из текущего каталога с именами, начинающимися с plain, вместе со всем каталогом text в каталог tmp, и показать порядок выполнения каждой операции.
3. $ mv -vi plain.txt tmp
— переместить файл plain.txt в папку tmp и если в этой папке находится файл с таким же именем, спросить подтверждение на перезапись, а после вывести сообщение о проделанной операции. В терминале будет следующее:
$ mv -vi plain.txt tmp
mv: переписать 'tmp/plain.txt'? yes
renamed 'plain.txt' -> 'tmp/plain.txt'
-t
, --target-directory=КАТАЛОГ
— переместить все исходные файлы в КАТАЛОГ.Примеры:
1. $ mv -t tmp plain.txt plain_2.txt
— переместить файлы plain.txtи plain_2.txt в каталог tmp.
2. $ mv plain.txt plain_2.txt tmp
— то же, что и предыдущая команда.
T
, --no-target-directory
— считать НАЗНАЧЕНИЕ обычным файлом, а не каталогом.
-u
, --update
— не перезаписывать файлы, если они более новые. Перемещение произойдёт только в том случае, если исходный файл новее чем целевой, или когда целевой файл не существует.
-Z
, --context
— задать контекст безопасности SELinux файлу назначения как у типа по умолчанию. Для системы SELinux.
--strip-trailing-slashes
— удаляет все конечные косые черты (слеши) из каждого исходного файла, заданного в качестве аргумента. Опция может пригодиться, когда исходный файл имеет косую черту на конце и указывает на каталог в виде символьной ссылки.
--
— завершает список опций. Первый знак -
— признак опции, второй — начало опции. Применяется для использования с файлами, имена которых начинаются со знака минус (-).
Например, если сразу после команды mv или опции идёт файл, имя которого начинается на -
, в терминале появится ошибка, что такой опции не существует (invalid option, неверный ключ):
$ mv -plain.txt tmp
mv: неверный ключ - «p»
В данном случае команда не распознаёт опцию, начинающуюся с буквы p, за которой следуют символы plain.txt. В результате команда не знает, как поступить. Для исправления ошибки предваряют имя файла опцией --
и дают понять команде mv, что следующие за ней данные должны восприниматься не как опция, а как имя файла:
$ mv -- -plain.txt tmp
Примечание. Можно вместо опции --
использовать точку как часть пути к файлу и тем самым устранить ошибку, которая ввела в заблуждение команду mv. Например:
$ mv ./-plain.txt tmp
Опции:
--backup[=КОНТРОЛЬ]
— создание резервных копий существующих файлов, используя способ контроля версий. Если КОНТРОЛЬ опущен, --backup
ведёт себя так же, как -b
.
-b
— похож на --backup
, но не использует способ контроля версий. Вместо этого используются параметры, указанные в переменной окружения VERSION_CONTROL.
S
, --suffix=СУФФИКС
— указывает суффикс имени файла, который будет использоваться для всех резервных копий. Значением по умолчанию является тильда (~).
При использовании опции -b
или --backup
, mv переименовывает целевой файл, если он существует, добавив суффикс к его имени. Тем самым сохраняется копия исходного файла, а не его перезаписанный вариант.
Существует два типа резервных копий — простые и нумерованные:
Простые резервные копии удаляют существующий файл резервной копии. Сохраняется только одна копия. Суффиксом по умолчанию для простых резервных копий является тильда (~). Например, файл plain.txt будет сохранён как plain.txt~. Можно изменить этот суффикс с помощью опции --suffix
или установить переменную окружения SIMPLE_BACKUP_SUFFIX.
Нумерованные резервные копии сохраняют существующие файлы резервных копий, создавая дополнительные резервные копии с возрастающим номером в имени файла. Резервные файлы не удаляются. Суффикс для нумерованных резервных копий: .~n~
, где n — целое число. Например, файл plain.txt будет сохранён в виде файла plain.txt.~1~, затем plain.txt.~2~ и т. д.
Доступны дополнительные правила для создания резервных копий с помощью контроля версий. Способ контроля версий устанавливается опцией --backup
или переменной окружения VERSION_CONTROL. Значения:
none
, off
— никогда не создавать резервных копий, даже если указан ключ --backup
.numbered
, t
— создавать нумерованные резервные копии.existing
, nil
— если существуют нумерованные копии, то создавать нумерованные (numbered) иначе создавать простые (simple).simple
, never
— всегда создавать простые резервные копии.Примеры:
1. $ mv -b plain.txt plain_2.txt
— если plain_2.txt существует, он будет переименован в plain_2.txt~.
2. $ mv -b --suffix=.bak plain.txt plain_2.txt
— если plain_2.txtсуществует, он будет переименован в plain_2.txt.bak.
3. $ mv --backup=numbered plain.txt plain_2.txt
— если plain_2.txtсуществует, он будет переименован в plain_2.txt.~1~. Если plain_2.txt.~1~ существует, он будет переименован в plain_2.txt.~2~ и т. д.
4. $ VERSION_CONTROL=numbered mv -b plain.txt plain_2.txt
— то же, что и в предыдущем примере. Переменная окружения определяется только для этой команды.
5. $ export VERSION_CONTROL=numbered; mv -b plain.txt plain_2.txt
— при экспорте переменной окружения VERSION_CONTROL все команды mv -b
для текущего сеанса будут использовать нумерованные резервные копии.
6. $ export VERSION_CONTROL=numbered; mv plain.txt plain_2.txt
— даже если переменная VERSION_CONTROL установлена, резервные копии не создаются, потому что -b
не было указано. Если файл plain_2.txt существует, он перезаписывается.
1. $ mv My\ plain.txt My\ plain\ 2.txt
— переименовать файл My plain.txt в My plain 2.txt. Здесь пробелы в имени файла экранируются косой чертой; если этого не сделать, Linux будет рассматривать что-либо после пробела как опцию или дополнительную команду.
2. $ mv "My plain.txt" "My plain 2.txt"
— то же, что и предыдущая команда. В качестве экрана выступают двойные кавычки.
3. $ mv "My plain.txt" tmp
— если tmp каталог, My plain.txtперемещается в него. Если tmp является файлом, My plain.txtпереименовывается в tmp, а исходный tmp перезаписывается. Если tmp не существует, My plain.txt переименовывается в tmp.
Знак звёздочки
1. $ mv My*.txt tmp
— в команде используется подстановочный знак *
. Если tmp является каталогом, все файлы с расширением .txt, чьё имя начинается с My, будут перемещены в tmp (например, My plain.txt, Myself.txt и т. п.). Если tmp не существует или не является каталогом, mv сообщает об ошибке и ничего не делает.
2. $ mv -i tmp/images/*.png tmp/img/
— перемещает все изображения с расширением .png из каталога tmp/images/ в каталог tmp/img/. Если в текущем каталоге встретятся изображения с расширением .png, mv выдаст запрос на перезапись.
Знак вопроса
1. $ mv plain??.txt tmp
— здесь подстановочный знак ?
и в этой команде используется дважды, а значит может соответствовать максимум двум символам. Если tmp является каталогом, то любой файл с двумя символами между plain и .txt в их имени перемещается в tmp (например, plain_2.txt, plain03.txt и т. п.). Если tmp не существует или не является каталогом, mv сообщает об ошибке и ничего не делает.
2. $ mv My\ plain?.txt tmp
— в этой команде всего один подстановочный знак ?
. Если tmp является каталогом, то любой файл с одним символом между My plain и .txt в их имени перемещается в tmp (например, My plain1.txt, My plain2.txt и т. п.).
--help
— справочная информация о программе: $ mv --help
--version
— информация о версии программы: $ mv --version
Получить информацию о ключах mv можно с помощью утилиты man:
$ man mv
Для выхода из man используют клавишу q
.
1. Для того чтобы гарантировать, что каталог, например, tmp — это каталог, желательно указать после него косую черту. Тогда команда примет следующий вид:
$ mv plain.txt tmp/
Если окажется, что tmp — не каталог, команда не переместит файл. Так можно предотвратить перезапись файла.
2. Если перемещается ссылка, указывающая на каталог, то нужно внимательно следить за вводимыми данными. Например, в рабочем каталоге лежит ссылка cats, которая указывает на каталог /home/user/images/cats, и нужно переместить эту ссылку в каталог /home/user/barsik. Следующая команда перемещает лишь саму ссылку:
$ mv cats ~/barsik
А вот эта команда перемещает каталог, на который эта ссылка указывает:
$ mv cats/ ~/barsik
Различие между ними лишь в косой черте, которая вводится после ссылки. Если символ /
отсутствует, перемещается лишь сама ссылка. Включив этот символ, mv переместит каталог, а не ссылку.
3. Утилита mv не интерпретирует регулярные выражения (regex). Если нужно переименовать много файлов, используя сложное или детальное сопоставление старых и новых имён, следует использовать утилиту rename (установка утилиты для ОС на основе Ubuntu и Debian: sudo apt install rename
). Rename принимает регулярные выражения Perl. Примеры:
$ rename 's/plain(..)/document$1/' plain*
— переименовать файлы plain.txt и plain_2.txt в document.txt и document_2.txt.
$ rename 's/My\ plain(..)/doc$1/' My*
— переименовать файлы My plain.txt и My plain 2.txt в doc.txt и doc 2.txt.
Перемещение файла внутри одной файловой системы в действительности равнозначно его переименованию: данные самого файла при этом остаются на тех же секторах диска, а изменяются каталоги, в которых произошло перемещение.
Перемещение предполагает удаление ссылки на файл из того каталога, откуда он перемещён, и добавление ссылки на этот самый файл в тот каталог, куда он перемещён. В результате изменяется полное имя файла — полный путь, т. е. положение файла в файловой системе.
Дополнение к этой главе (из других источников):
1. Когда исходный и целевой файлы находятся на одной файловой системе, они являются одним и тем же файлом (изменяется только имя файла; владелец, права доступа, временные штампы остаются неизменными).
Если же они находятся на разных файловых системах, то исходный файл копируется и затем удаляется. mv будет копировать время последней модификации, время доступа, идентификаторы пользователя, группы и права доступа к файлу если это возможно. Если копирование идентификаторов пользователя и/или группы закончилось неудачно, то в копии файла сбрасываются биты setuid и setgid.
2. Различия утилит cp и mv. Операции копирования (cp) и перемещения/переименования (mv) выглядят сходными, однако по сути своей глубоко различны. Начать с того, что команда mv не совершает никаких действий с перемещаемыми или переименовываемыми файлами, она модифицирует каталоги, к которым приписаны имена этих файлов. Это имеет два важных следствия.
Во-первых, при перемещении/переименовании файлы сохраняют первозданными атрибуты доступа, принадлежности и даже времени изменения метаданных (ctime) и модификации данных (mtime): ведь ни те, ни другие при перемещении/переименовании файла не изменяются.
Во-вторых, для выполнения этих действий можно не иметь никаких вообще прав доступа к файлам, достаточно иметь право на изменение каталогов, в которых они переименовываются или перемещаются: ведь имя файла фигурирует только в составе каталога и нигде более.
Список всех портов с помощью команды Netstat -a
# netstat -a | more Active Internet connections (servers and established) Proto Recv–Q Send–Q Local Address Foreign Address State tcp 0 0 localhost:30037 *:* LISTEN udp 0 0 *:bootpc *:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I–Node Path unix 2 [ ACC ] STREAM LISTENING 6135 /tmp/.X11–unix/X0 unix 2 [ ACC ] STREAM LISTENING 5140 /var/run/acpid.socket |
Список всех портов TCP с помощью netstat -at
# netstat -at Active Internet connections (servers and established) Proto Recv–Q Send–Q Local Address Foreign Address State tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN tcp 0 0 localhost:webcache 0.0.0.0:* LISTEN tcp 0 0 andreyex.ru:domain 0.0.0.0:* LISTEN tcp 0 0 localhost:domain 0.0.0.0:* LISTEN |
Перечисление всех UDP-портов с помощью netstat -au
# netstat -au Active Internet connections (servers and established) Proto Recv–Q Send–Q Local Address Foreign Address State udp 0 0 andreyex.ru:49419 google–public–dn:domain ESTABLISHED udp 0 0 andreyex.ru:39293 google–public–dn:domain ESTABLISHED udp 0 0 andreyex.ru:50053 google–public–dn:domain ESTABLISHED |
Список только прослушивающих портов с помощью netstat -l
# netstat -l Active Internet connections (only servers) Proto Recv–Q Send–Q Local Address Foreign Address State tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN tcp 0 0 localhost:webcache 0.0.0.0:* LISTEN tcp 0 0 andreyex.ru:domain 0.0.0.0:* LISTEN tcp 0 0 localhost:domain 0.0.0.0:* LISTEN |
Список только прослушивающихся TCP портов с помощью netstat -lt
# netstat -lt Active Internet connections (only servers) Proto Recv–Q Send–Q Local Address Foreign Address State tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN tcp 0 0 localhost:webcache 0.0.0.0:* LISTEN tcp 0 0 andreyex.ru:domain 0.0.0.0:* LISTEN tcp 0 0 localhost:domain 0.0.0.0:* LISTEN |
Список только прослушивающихся UDP портов с помощью netstat -lu
# netstat -lu Active Internet connections (only servers) Proto Recv–Q Send–Q Local Address Foreign Address State udp 0 0 andreyex.ru:domain 0.0.0.0:* udp 0 0 localhost:domain 0.0.0.0:* udp 0 0 andreyex.ru:ntp 0.0.0.0:* |
Список только прослушивающихся портов UNIX с помощью netstat -lx
# netstat -lx Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I–Node Path unix 2 [ ACC ] STREAM LISTENING 19693 tmp/core.adm.internal unix 2 [ ACC ] SEQPACKET LISTENING 8723 /run/udev/control unix 2 [ ACC ] STREAM LISTENING 12566 /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 16948 /var/run/fail2ban/fail2ban.sock unix 2 [ ACC ] STREAM LISTENING 19702 tmp/core.sock |
Показать статистику для всех портов с использованием netstat -s
# netstat -s Ip: 190566 total packets received 0 forwarded 0 incoming packets discarded 189618 incoming packets delivered 170462 requests sent out 16 dropped because of missing route Icmp: 74 ICMP messages received 0 input ICMP message failed. ICMP input histogram: destination unreachable: 22 echo requests: 52 ..... |
Показать статистику для TCP (или) UDP портов с использованием netstat -st (или) -su
# netstat -st # netstat -su |
Опция netstat -p может быть объединена с любым другим вариантом netstat. Это добавит «PID/Название программы» на выходе netstat. Это очень полезно при отладке, чтобы определить, какая программа работает на определенном порту.
# netstat -pt Active Internet connections (w/o servers) Proto Recv–Q Send–Q Local Address Foreign Address State PID/Program name tcp 0 0 localhost:56642 localhost:46846 TIME_WAIT – tcp 0 0 localhost:56642 localhost:46748 TIME_WAIT – |
Если вы не хотите отображать имя хоста, порт или пользователя, используйте netstat с опцией -n. Это будет отображаться в цифрах, и не разрешать имя хоста, имя порта, имя пользователя.
Это также ускоряет выход, так как netstat не выполняет какие-либо просмотров.
# netstat -an |
Если вы не хотите один из этих трех пунктов (порт или хост, или пользователя), используйте следующие команды.
# netsat -a –numeric-ports # netsat -a –numeric-hosts # netsat -a –numeric-users |
netstat будет печатать информацию непрерывно каждые несколько секунд.
# netstat -c Active Internet connections (w/o servers) Proto Recv–Q Send–Q Local Address Foreign Address State tcp 0 0 localhost:37840 localhost:webcache ESTABLISHED tcp 0 0 andreyex.ru:vlsi–lm 213.132.93.178:24080 ESTABLISHED tcp 0 0 localhost:56642 localhost:47258 TIME_WAIT tcp 0 0 localhost:56642 localhost:47150 TIME_WAIT ^C |
Выход из печати: Ctrl+C.
В конце концов, вы будете иметь что-то вроде этого.
netstat: no support for `AF IPX‘ on this system. netstat: no support for `AF AX25′ on this system. netstat: no support for `AF X25‘ on this system. netstat: no support for `AF NETROM’ on this system. |
# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default gw.msk.ispsyste 0.0.0.0 UG 0 0 0 eth0 213.159.208.0 0.0.0.0 255.255.254.0 U 0 0 0 eth0 |
Примечание:
Используйте netstat -rn для отображения маршрутов в цифровом формате без разрешения хост-имени.
# netstat -ap | grep ssh (Not all processes could be identified, non–owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 0.0.0.0:28456 0.0.0.0:* LISTEN 779/sshd tcp 0 0 andreyex.ru:28456 213.132.93.178:13430 ESTABLISHED 2893/sshd: andreyex tcp 0 0 andreyex.ru:28456 213.132.93.178:13106 ESTABLISHED 2393/sshd: andreyex tcp6 0 0 [::]:28456 [::]:* LISTEN 779/sshd |
Узнайте, какой процесс использует определенный порт:
# netstat -an | grep ‘:80’ |
# netstat -i Kernel Interface table Iface MTU RX–OK RX–ERR RX–DRP RX–OVR TX–OK TX–ERR TX–DRP TX–OVR Flg eth0 1555 2765202 0 0 0 86602 0 0 0 BMRU lo 65536 93149 0 0 0 93149 0 0 0 LRU |
Отображение расширенной информации об интерфейсах (по аналогии с ifconfig) с использованием netstat -ie:
# netstat -ie Kernel Interface table eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1550 inet 213.159.209.228 netmask 255.255.254.0 broadcast 213.159.209.255 inet6 fe80::5054:ff:fe80:19a4 prefixlen 64 scopeid 0x20<link> ether 52:54:00:80:19:a4 txqueuelen 1000 (Ethernet) RX packets 2772322 bytes 189451708 (180.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 86767 bytes 137897931 (131.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
sudo netstat -ntulp
Вывод
Активные соединения с интернетом (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:50455 0.0.0.0:* LISTEN 1375/rpc.statd
tcp 0 0 0.0.0.0:17823 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:9300 0.0.0.0:* LISTEN 3508/docker-proxy
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 1023/named
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 976/cupsd
tcp 0 0 0.0.0.0:464 0.0.0.0:* LISTEN 1327/samba: task[kd
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1323/samba: task[ld
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 1340/smbd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3610/docker-proxy
tcp 0 0 0.0.0.0:88 0.0.0.0:* LISTEN 1327/samba: task[kd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/init
tcp 0 0 0.0.0.0:49154 0.0.0.0:* LISTEN 1355/samba: task[rp
tcp 0 0 0.0.0.0:49153 0.0.0.0:* LISTEN 1355/samba: task[rp
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 1317/samba: task[rp
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 1076/inetd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1007/sshd: /usr/sbi
tcp 0 0 0.0.0.0:135 0.0.0.0:* LISTEN 1355/samba: task[rp
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 1340/smbd
tcp 0 0 0.0.0.0:41147 0.0.0.0:* LISTEN 1088/rpc.mountd
sort - UNIX‐ утилита, сортирует содержимое указанных файлов, с учётом установленной в среде переменных локализации.
Утилиту sort можно использовать для сортировки текста из одного или нескольких файлов или c помощью нее может быть выполнена сортировка вывода linux для какой-либо команды, например использования утилиты sort для обнаружения DoS-атак.
Параметры запуска:
-b, –ignore-leading-blanks игнорировать начальные пропуски
-d, –dictionary-order рассматривать только пропуски, буквы и цифры
-f, –ignore-case игнорировать регистр букв
-i, –ignore-nonprinting рассматривать только печатные знаки
-n, –numeric-sort сравнивать численные значения строк
-h, –human-numeric-sort сравнивать численные значения с учетом сокращения степени (2K, 1G)
-r, –reverse обратить результаты сравнения; обратный порядок
-u, –unique с -c, проверять порядок строго; без -c, выводить только первое среди нескольких равных
-c, –check проверять, сортированы ли входные файлы; не сортировать
-k, –key=Поз1[,Поз2] начинать ключ в Поз1 и завершать на Поз2 (отсчет от 1)
-o, –output=ФАЙЛ выводить в ФАЙЛ, а не на стандартный вывод
-t, –field-separator=РАЗДЕЛИТЕЛЬ использовать при поиске ключевых полей РАЗДЕЛИТЕЛЬ, а не переход от непробельных знаков к пробельным
Строки с цифрами размещаются выше других строк
Строки, начинающиеся с букв нижнего регистра размещаются выше
Сортировка выполняется в соответствии алфавиту
Строки сначала сортируются по алфавиту, а уже вторично по другим правилам.
Прямая сортировка файл, по принципам описанным выше, происходит по умолчанию. Просто вызовите команду sort и укажите нужный файл. Например, мы хотим отсортировать по алфавиту файл служб Linux (/etc/services), который хранит информацию о многочисленных службах, которые клиентские приложения могут использовать на компьютере. Внутри файла services находятся имя службы, номер порта и протокол, который он использует, и любые применимые псевдонимы.
$ sort /etc/services acr-nema 104/tcp dicom # Digital Imag. & Comm. 300 afbackup 2988/tcp # Afbackup system afbackup 2988/udp afmbackup 2989/tcp # Afmbackup system afmbackup 2989/udp afpovertcp 548/tcp # AFP over TCP afs3-bos 7007/tcp # basic overseer process afs3-bos 7007/udp afs3-callback 7001/tcp # callbacks to cache managers ...
Для обратной сортировки используйте ключ r, команда будет выглядеть так:
$ sort -r /etc/services
В этом примере мне нужно вывести все лог файлы и отсортировать их по колонке с названием месяца. Колонка указывается опцией -k, номер колонки для вывода команды ls седьмой. Итого получим такую команду для запуска:
$
ls -l /var/log/ | sort -k7 ... drwxr-xr-x 2 root root 4096 Sep 5 2019 openvpn -rw-r----- 1 root adm 14721 Mar 6 18:47 vsftpd.log.2 -rw------- 1 root root 10723 Mar 6 23:53 dovecot.log.2.gz -rw-r----- 1 root adm 281146 Mar 6 23:59 fail2ban.log.2.gz -rw-r----- 1 syslog adm 1190971 Mar 7 00:00 auth.log.2.gz
Для сортировки по числовому значению используется опция -n:
$ ls -l /var/log/ | sort -nk6
Мы можем сортировать данные по нескольким полям, например, отсортируем вывод ls по второму первично и вторично девятому полях:
$ ls -l /var/log/ | sort -t "," -nk2,5 -k9
Команда sort Linux позволяет не только сортировать строки, но и удалять дубликаты, для этого есть опция -u.
$ sort -u yourfile.txt
Или такой вариант
$ cat old.txt | sort | uniq > new.txt
Для начала необходимо убедиться, что ssh установлен в системе. Для этого нужно накатить актуальные обновления и инсталлировать утилиту.
Все действия проворачиваем на ноде-источнике(те на хосте, с которого планируем подключаться по ssh на другой хост)
sudo apt-get update && sudo apt-get upgrade
sudo apt install openssh-server
sudo systemctl enable sshd #включаем
sudo systemctl status sshd #проверяем
ssh-keygen #Генерируем свой ключ и прописываем путь до него ~/.ssh/id_rsa
ssh-keygen -t rsa или ssh-keygen -t ed25519 # также можно задать свой рандомный алгоритм шифрования для повышения безопасности
Структура ключа
~/.ssh/id_rsa.pub — открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa — закрытый ключ. Его нельзя никому показывать. Если вы в письмо/чат скопипастите его вместо pub, то нужно генерировать новый ключ.
ssh-copy-id -i $HOME/.ssh/id_rsa.pub
ssh-copy-id [email protected] #копируем публичный ключ на destination-ноду(необходимо знать пароль удаленного юзера на ней)
Если ssh крутится на рандомном порту, прописываем
ssh-copy-id '-p 443 [email protected]'
Ключ сохраняется в ~/.ssh/known_hosts
Если нужно, удаляем сохраненный ключ сервера -
ssh-keygen -R server-ud3l.lab.home
Так же нужно удалить ip-ключ -
ssh-keygen -R 192.168.0.106
Ключи на сервере хранятся в /etc/ssh/ssh_host_rsa_key и /etc/ssh/ssh_host_rsa_key.pub Их можно:
а) скопировать со старого сервера на новый.
б) сгенерировать с помощью ssh-keygen. Пароля при этом задавать не надо (т.е. пустой). Ключ с паролем ssh-сервер использовать не сможет.
Заметим, если вы сервера клонируете (например, в виртуалках), то ssh-ключи сервера нужно обязательно перегенерировать.
Старые ключи из know_hosts при этом лучше убрать, иначе ssh будет ругаться на duplicate key.
Модуль scp
Позволяет копировать файлы через ssh-соединение с локальной ноды на удаленную (так же работает и в обратную сторону)
scp /path/to/file [email protected]:/home/sc0rch/backup/
# c локальной на удаленную
scp [email protected]:/home/sc0rch/backup/file /path/to/
# c удаленной на локальную
sshfs
Через ssh можно монтировать рандомно заданные директории удаленного хоста локально, используя псевдофайловую систему fuse.
Пример
sshfs [email protected]:/home/server/ /media/sshfs -o idmap=user,reconnect
-o idmap=user. Работает она следующим образом: если мы коннектимся как пользователь server@server-ud3l, а локально работаем как пользователь john, то мы говорим «считать, что файлы server, это файлы john». ну или «root», если мы коннектимся как root.
fusermount -u /media/sshfs #размонтировать подключенную fuse-систему
sudo fusermount -u /media/sshfs # если работаем из-под рута
Можно настроить автомонтирование через /etc/fstab :
[email protected]:/home/server/ /media/sshfs fuse.sshfs defaults,allow_other,_netdev 0 0
Когда используется автомонтирование через fstab, файловая система будет монтироваться от суперпользователя.
Пример конфига с автомонтированием от определенного пользователя:
[email protected]:/home/server/ /media/sshfs fuse.sshfs noauto,x-systemd.automount,_netdev,user,idmap=user,follow_symlinks,identifyfile=/home/server/.ssh/id_rsa,allow_other,default_permissions,uid=1000,gid=1000 0 0
Опции:
allow_other - позволяет другим пользователям, отличным от монтирующего (то есть обычным пользователям), получать доступ к тому, что монтируется.
default_permissions - позволяет ядру проверять права, иначе говоря использовать актуальные права на удаленной файловой системе. А также запрещает доступ всем, кроме объявленных в allow_other.
uid, gid - устанавливает владельца файлов в соответствии с переданными значениями; uid - это числовой идентификатор пользователя, gid - числовой идентификатор группы пользователя.
ssh-туннелирование
При помощи него можно безопасно передавать данные через зашифрованное соединение, перенапралять трафик, обходить ограничения(файрволлы) и получать доступ к закрытым сервисам(бд,веб-серверам и тд)
Основные типы
1.Локальное перенаправление (Local Port Forwarding)
ssh -L 8080:django-cms.tk:80 [email protected]
#пробрасываем удаленный сервис на локальный сервер
Теперь при заходе на localhost:8080 мы попадем на django-cms.tk через server
2. Удалённое перенаправление (Remote Port Forwarding)
ssh -R 9000:localhost:3000 [email protected]
Теперь если подключиться к django-cms.tk мы попадаем на наш локальный сервис на порту 3000
Так же , если мы хотим использовать адрес django-cms.tk, то нам нужно разрешить GatewayPorts в настройках сервера
3. Динамическое перенаправление (SOCKS-прокси)
ssh -D 1080 [email protected]
Теперь можно настроить браузер (или систему) на SOCKS5://localhost:1080 и весь трафик пойдёт через server.
Современные улучшения ssh-туннелирования
1.autossh
Обычный SSH-туннель рвётся при обрыве сети. autossh автоматически переподключается.
sudo apt-get install autossh
autossh -M 0 -L 3306:localhost:3306 server@sql-server -N
-M 0 — отключает встроенный мониторинг (можно указать порт, например, -M 50000).
-N — не открывать интерактивную сессию.
2.Подключение через jump host(-J)
Если сервер доступен только через промежуточный хост (например, корпоративный VPN).
ssh -J user@jump_host -L 8080:target_internal_host:80 user@target_host
3.Мультиплексирование ssh (ControlMaster)
Использует одно соединение ssh для нескольких сессий(экономит ресурсы)
nano /etc/ssh/sshd_config
Host *
ControlMaster auto
ControlPath /etc/ssh/control:%h:%p:%r
ControlPersist 1h
Теперь при первом подключении создаётся мастер-сессия, а последующие используют её.
4.sshuttle
Гибрид ssh-туннеля и vpn, который перенаправляет весь сетевой трафик (или его часть) через SSH-соединение
sudo apt install sshuttle
sshuttle -r john@server 0.0.0.0/0 # весь трафик через удаленный сервер(после ввода пароля весь интернет будет идти через server)
sshuttle -r john@server 192.168.0.0/24 #все машины 192.168.0.0/24 теперь доступны локально, как если бы вы были в той же подсети
sshuttle -r john@server --ssh-cmd="ssh -i ~/.ssh/id_rsa" 0.0.0.0/0 #используем ключ вместо пароля
Оптимизированная конфигурация sshd_config
-----------------------------------------------------------
# --- Базовые параметры ---
Port 2222 # Меняем стандартный порт (22 → 2222)
ListenAddress 0.0.0.0 # Слушать все интерфейсы (можно ограничить, например, ListenAddress 192.168.1.100)
Protocol 2 # Только SSHv2 (устаревший v1 небезопасен)
HostKey /etc/ssh/ssh_host_ed25519_key # Приоритетный ключ (Ed25519 безопаснее RSA)
HostKey /etc/ssh/ssh_host_rsa_key # Резервный ключ
# --- Аутентификация ---
PermitRootLogin no # Запретить вход под root
PasswordAuthentication no # Только по ключам (отключаем пароли)
PermitEmptyPasswords no # Блокировать пустые пароли
PubkeyAuthentication yes # Разрешить аутентификацию по ключу
AuthorizedKeysFile .ssh/authorized_keys # Путь к файлу ключей
# --- Защита от bruteforce ---
MaxAuthTries 3 # Макс. попыток ввода пароля/ключа
LoginGraceTime 30s # Время на авторизацию
ClientAliveInterval 300 # Проверять соединение каждые 5 мин
ClientAliveCountMax 2 # Закрывать сессию после 2 пропущенных проверок
# --- Ограничения сессий ---
MaxSessions 5 # Макс. одновременных сессий с одного IP
MaxStartups 10:30:60 # Лимит параллельных подключений (10: начинать отклонять, 30: % отклонения, 60: макс. очередь)
# --- Разрешение туннелей ---
AllowTcpForwarding yes # Разрешить локальные/удалённые туннели (-L/-R)
GatewayPorts clientspecified # Позволяет открывать -R туннели для внешних подключений (например, -R 0.0.0.0:8080:localhost:80)
PermitTunnel yes # Разрешить VPN-поверх-SSH (sshuttle)
# --- Мультиплексирование (для ускорения) ---
TCPKeepAlive yes # Поддерживать соединение
Compression delayed # Сжатие данных (уменьшает трафик)
# --- Пользовательские алиасы ---
Match User admin # Для пользователя "admin"
PermitRootLogin prohibit-password # Разрешить root-вход только по ключу
AllowAgentForwarding yes # Позволить проброс SSH-агента
X11Forwarding yes # Проброс графических приложений (X11)
Match User deploy # Для пользователя "deploy"
ChrootDirectory /var/www # Изолировать в chroot
ForceCommand internal-sftp # Только SFTP (без shell)
AllowTcpForwarding no # Запретить туннели
# --- Настройки для групп ---
Match Group developers # Для группы "developers"
AllowStreamLocalForwarding yes # Разрешить Unix-socket проброс
PermitOpen 192.168.1.*:3389 # Разрешить проброс только для RDP (3389)
# --- Логирование ---
SyslogFacility AUTH # Логировать попытки входа
LogLevel VERBOSE # Детальные логи (можно сменить на INFO)
# --- Современные алгоритмы ---
KexAlgorithms [email protected] # Безопасный обмен ключами
Ciphers [email protected],[email protected] # Шифрование
MACs [email protected] # Защита от подделки пакетов
# --- Поддержка IPv6 ---
AddressFamily any # Разрешить и IPv4, и IPv6
----------------------------------------------------------
sudo sshd -t # проверить синтаксис
sudo systemctl restart sshd #рестарт сервиса
sudo tail -f /var/log/auth.log #проверка логов
Использованные материалы - https://habr.com/ru/articles/122445/
https://wiki.archlinux.org/title/SSHFS_(Русский)
При управлении процессами менеджер systemd оперирует так называемыми модулями или юнитами. По сути, юнит — текстовое описание сервиса, в котором перечислены операции для выполнения до и после запуска службы.
Все модули можно найти в трёх каталогах:
Список всех запущенных модулей можно посмотреть, использовуя команду systemctl
. В терминале вы увидите таблицу со статусом каждой службы. Разберём, что означает каждый из столбцов:
Модули делятся на категории по типу. Тип каждого модуля можно узнать из названия файла — он указан через точку. Все типы модулей:
Некоторые полезные опции
systemctl list-units --all - просмотреть все модули
systemctl list-units --all --state=inactive - только неактивные
systemctl list-units --type=service - просмотреть только service-юниты
systemctl cat sshd.service - прочитать файл модуля
systemctl list-dependencies sshd.service - просмотреть лист зависимостей конкретного модуля
systemctl list-dependencies --reverse sshd.service - показать все модули, которые зависят от указанного юнита
systemctl edit sshd.service - изменить содержимое модуля
systemctl mask apache2.service - маскировка, удаление возможности запустить модуль
systemctl unmask apache2.service - снять маскировку
systemctl restart apache2.service - перезапустить модуль
systemctl reload apache2.service - перечитать файл конфигурации
systemctl status apache2.service - показать статус модуля
bash и systemd поддерживают работу с несолькими модулями одновременно, например
systemctl status {smbd,nmbd,winbind}.service
systemctl restart {smbd,nmbd,winbind}.service
systemctl daemon-reload - перезагрузить процесс systemd
Пример юнит-файла /etc/systemd/system/rclocal.service
[Unit] Description=/etc/rc.local Compatibility ConditionFileIsExecutable=/etc/rc.local [Service] Type=simple ExecStart=/etc/rc.local Restart=always StandardOutput=journal # WorkingDirectory=/tmp # Environment=TERM=LD_LIBRARY_PATH="/usr/local/lib" [Install] WantedBy=multi-user.target
С настройками по умолчанию журналы systemd склонны пожирать все свободное место на диске, обязательно нужно настраивать!
Можно сделать так /etc/systemd/journald.conf
:
[Journal] Compress=yes SystemMaxUse=500M SystemMaxFileSize=100M MaxRetentionSec=30day
после чего перезапустить демон
systemctl restart systemd-journald
Очистка логов вручную:
journalctl --vacuum-size=50M
Пример таймера
При помощи systemd так же можно осуществлять периодический запуск юнитов по таймеру
nano /usr/lib/systemd/system/logrotate.timer
[Unit]
Description=Daily rotation of log files
Documentation=man:logrotate(8) man:logrotate.conf(5)
[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true
[Install]
WantedBy=timers.target
Запускает logrotate.service каждый день( осуществляет ежедневную ротацию логов )
Здесь AccuracySec означает произвольный сдвиг запуска по времени( от 1с до 1часа в данном случае), чтобы таймеры не накладывались друг на друга при запуске
Использованы материалы https://timeweb.cloud/tutorials/linux/kak-ispolzovat-systemctl-dlya-upravleniya-sluzhbami-systemd
UFW(Uncomplicated Firewall (ufw) (с англ. — «незамысловатый межсетевой экран»)) предназначен для легкого, интуитивно понятного управления межсетевым экраном Ubuntu. Он поддерживает общие задачи, такие как разрешение или блокирование предварительно настроенных, общих P2P, или отдельных портов. Gufw работает на UFW, запускается на Ubuntu, а также на любой платформе, где доступны Python, GTK+ и UFW.
sudo apt-get install ufw - установка
sudo ufw status - текущий статус
sudo ufw default deny incoming - запрещаем все входящие (по умолчанию)
sudo ufw default allow outgoing - разрешаем все исходящие
sudo ufw allow ssh - разрешаем ssh
sudo ufw allow 2222 - открываем 2222 порт
sudo ufw enable - включаем ufw
sudo ufw allow 21/tcp - открываем ftp
sudo ufw allow 3000:3100
sudo ufw allow 3000:3100/tcp
sudo ufw allow 3000:3100/udp - диапазоны портов
sudo ufw allow from 123.45.67.89/24
sudo ufw allow from 123.45.67.89/24 to any port 22 - разрешаем доступ к 22 порту из определенного сегмента сети
sudo ufw app list - показать лист доступных приложений
sudo ufw allow in on eth0 to any port 80 - разрешаем доступ с определенного интерфейса
sudo ufw allow proto tcp from 192.168.0.2 to any port 1080 - разрешаем доступ к порту при определенном протоколе
sudo ufw allow in proto tcp from any to any port 80,443 - разрешаем все входящие соединения HTTP и HTTPS с любого хоста на любом сетевом интерфейсе
sudo ufw allow in proto tcp from 192.168.110.0/24 to 192.168.110.2 port 5901 - разрешаем доступ со всех IP-адресов подсети по протоколу TCP
к нашему IP-адресу 192.168.110.2
на порту 5901
:
sudo ufw insert 1 allow proto tcp from 37.73.96.0/20 to any port 1080 - правила могут быть добавлены с использованием нумерованного формата
sudo ufw delete deny proto tcp from any to any port 1080 - удаляем правило
ufw delete 3 - можно по номеру строки
sudo ufw logging on - включаем логи(/var/log/ufw)
sudo ufw reset - сбрасываем правила
sudo ufw disable - отключаем фаерволл
sudo ufw status | grep '[0-9]' | grep -n '' пронумеровать строки в статусе файрволла, начиная с 1го правила
Файлы конфигурации расположены в файле /etc/default/ufw
и директории /etc/ufw
/etc/default/ufw
— основная конфигурация для политик по умолчанию, поддержки IPv6 и модулей ядра/etc/ufw/before[6].rules
— правила в этих файлах выполняются до добавления каких-либо правил с помощью команды ufw
/etc/ufw/after[6].rules
— правила в этих файлах выполняются после любых правил, добавленных с помощью команды ufw
/etc/ufw/sysctl.conf
— параметры сети ядра/etc/ufw/ufw.conf
— устанавливает, включен ли ufw
при загрузке, и устанавливает LOGLEVEL
Более подробную инфу см на tokmakov.msk
Команда usermod в Linux используется для изменения свойств учетной записи пользователя. С помощью этой команды можно изменить имя пользователя, домашний каталог, тип оболочки, идентификатор пользователя (UID) и группу, к которой принадлежит пользователь.
usermod - изменяет учётную запись пользователя
usermod [параметры] УЧЁТНАЯ_ЗАПИСЬ
Команда usermod изменяет системные файлы учётных записей согласно переданным в командной строке параметрам.
Параметры команды usermod: -a, --append Добавить пользователя в дополнительную группу(ы). Использовать только вместе с параметром -G. -c, --comment КОММЕНТАРИЙ Новое значение поля комментария в файле пользовательских паролей. Обычно его изменяют с помощью программы chfn(1). -d, --home ДОМАШНИЙ_КАТАЛОГ Домашний каталог нового пользователя. Если указан параметр -m, то содержимое текущего домашнего каталога будет перемещено в новый домашний каталог, который будет создан, если он ещё не существует. -e, --expiredate ДАТА_УСТАРЕВАНИЯ Дата, когда учётная запись пользователя будет заблокирована. Дата задаётся в формате ГГГГ-ММ-ДД. Пустое значение аргумента ДАТА_УСТАРЕВАНИЯ отключает устаревание учётной записи. Для этого параметра требуется файл /etc/shadow. При отсутствии в /etc/shadow создаётся необходимая запись. -f, --inactive ДНЕЙ Количество дней, которые должны пройти после устаревания пароля, чтобы учётная запись заблокировалась навсегда. Если указано значение 0, то учётная запись блокируется сразу после устаревания пароля, а при значении -1 данная возможность не используется. Для этого параметра требуется файл /etc/shadow. При отсутствии в /etc/shadow создаётся необходимая запись. -g, --gid ГРУППА Имя или числовой идентификатор новой первичной группы пользователя. Группа с таким именем должна существовать. Все файлы в домашнем каталоге пользователя, принадлежавшие предыдущей первичной группе пользователя, будут принадлежать новой группе. Группового владельца файлов вне домашнего каталога нужно изменить вручную. -G, --groups ГРУППА1[,ГРУППА2,...[,ГРУППАN]]] Список дополнительных групп, в которых числится пользователь. Перечисление групп осуществляется через запятую, без промежуточных пробелов. На указанные группы действуют те же ограничения, что и для группы указанной в параметре -g. Если пользователь — член группы, которой в указанном списке нет, то пользователь удаляется из этой группы. Такое поведение можно изменить с помощью параметра -a, при указании которого к уже имеющемуся списку групп пользователя добавляется список указанных дополнительных групп. -l, --login НОВОЕ_ИМЯ Имя пользователя будет изменено с ИМЯ на НОВОЕ_ИМЯ. Больше ничего не меняется. В частности, вероятно, должно быть изменено имя домашнего каталога и почтового ящика, чтобы отразить изменение имени пользователя. -L, --lock Заблокировать пароль пользователя. Это делается помещением символа «!» в начало шифрованного пароля, чтобы приводит к блокировке пароля. Не используйте этот параметр вместе с -p или -U. Замечание: если вы хотите заблокировать учётную запись (не только доступ по паролю), также установите значение EXPIRE_DATE в 1. -m, --move-home Переместить содержимое домашнего каталога в новое место. Этот параметр можно использовать только с параметром -d (или --home). Команда usermod пытается изменить владельцев файлов и копирует права, ACL и расширенные атрибуты, но после неё всё равно могут потребоваться некоторые ручные действия. -o, --non-unique При использовании с параметром -u, этот параметр позволяет указывать не уникальный числовой идентификатор пользователя. -p, --password ПАРОЛЬ Шифрованное значение пароля, которое возвращает функция crypt(3). Замечание: Этот параметр использовать не рекомендуется, так как пароль (или не шифрованный пароль) будет видим другими пользователям в списке процессов. Пароль будет записан в локальный файл /etc/passwd или /etc/shadow. Это может вызвать расхождения с базой данных паролей, настроенной в PAM. Вы должны проверить, что пароль соответствует политике системных паролей. -R, --root КАТ_CHROOT Выполнить изменения в каталоге КАТ_CHROOT и использовать файлы настройки из каталога КАТ_CHROOT. -s, --shell ОБОЛОЧКА Имя новой регистрационной оболочки пользователя. Если задать пустое значение, то будет использована регистрационная оболочка по умолчанию. -u, --uid UID Новый числовой идентификатор пользователя (UID). Оно должно быть уникальным, если не используется параметр -o. Значение должно быть неотрицательным. Для почтового ящика и всех файлов, которыми владеет пользователь и которые расположены в его домашнем каталоге, идентификатор владельца файла будет изменён автоматически. Для файлов, расположенных вне домашнего каталога, идентификатор нужно изменять вручную. Никаких проверок по UID_MIN, UID_MAX, SYS_UID_MIN или SYS_UID_MAX из /etc/login.defs не производится. -U, --unlock Разблокировать пароль пользователя. Это выполняется удалением символа «!» из начала шифрованного пароля. Не используйте этот параметр вместе с -p или -L. Замечание: если вы хотите разблокировать учётную запись (не только доступ по паролю), также установите значение EXPIRE_DATE (например, в to 99999 или равным значению EXPIRE из файла /etc/default/useradd). -v, --add-sub-uids FIRST-LAST Add a range of subordinate uids to the users account. This option may be specified multiple times to add multiple ranges to a users account. No checks will be performed with regard to SUB_UID_MIN, SUB_UID_MAX, or SUB_UID_COUNT from /etc/login.defs. -V, --del-sub-uids FIRST-LAST Remove a range of subordinate uids from the users account. This option may be specified multiple times to remove multiple ranges to a users account. When both --del-sub-uids and --add-sub-uids are specified remove of all subordinate uid ranges happens before any subordinate uid ranges are added. No checks will be performed with regard to SUB_UID_MIN, SUB_UID_MAX, or SUB_UID_COUNT from /etc/login.defs. -w, --add-sub-gids FIRST-LAST Add a range of subordinate gids to the users account. This option may be specified multiple times to add multiple ranges to a users account. No checks will be performed with regard to SUB_GID_MIN, SUB_GID_MAX, or SUB_GID_COUNT from /etc/login.defs. -W, --del-sub-gids FIRST-LAST Remove a range of subordinate gids from the users account. This option may be specified multiple times to remove multiple ranges to a users account. When both --del-sub-gids and --add-sub-gids are specified remove of all subordinate gid ranges happens before any subordinate gid ranges are added. No checks will be performed with regard to SUB_GID_MIN, SUB_GID_MAX, or SUB_GID_COUNT from /etc/login.defs. -Z, --selinux-user SEUSER Новый пользователь SELinux для пользовательского входа. При пустом значении SEUSER пользовательское сопоставление SELinux для пользователя LOGIN удаляется (если есть).
Вы должны убедиться, что от указанного пользователя не запущено никаких процессов, если при выполнении этой команды изменяется числовой пользовательский ID, имя пользователя или домашний каталог пользователя. В Linux команда usermod выполняет такую проверку, но на других архитектурах проверяется только присутствие пользователя в системе согласно данным utmp. Вы должны вручную изменить владельца всех файлов crontab или заданий at. Вы должны сделать все изменения NIS на сервере NIS самостоятельно.
Примеры
sudo usermod -l newusername oldusername - изменить имя пользователя "oldusername" на "newusername"
sudo usermod -aG newgroup username - добавить пользователя "username" в группу "newgroup"
usermod -d /new/home/dir username - Изменение домашнего каталога пользователя
usermod -g newgroupname username - изменение группы, в которую входит пользователь
usermod -u newuid username - изменение uid
usermod -s /bin/bash username - изменение оболочки пользователя