Bash


Наиболее часто используемые команды и практические примеры

ARP (Address Resolution Protocol — протокол разрешения адресов) — протокол сетевого уровня (Network Link layer), предназначенный для преобразования IP- адресов (адресов сетевого уровня) в mac-адреса (адреса канального уровня) в сетях TCP/IP. Он определён в RFC826.

Утилита arp:

  • Ключи консольной утилиты arp:
    arp -a                          выводит содержимое таблицы ARP.
    arp <host>                      выводит ARP-запись для заданного хоста.
    arp -d <host>                   удаляет запись, соответствующую хосту.
    arp -d -a                       удаляет все записи таблицы.
    arp -s <host> <MAC-address>     добавляет запись.
    arp -f <file>                   добавляет записи из файла соответствия <file>.
  • В Linux полностью очистить ARP таблицу штатными средствами нельзя. Можно использовать скрипт вида, соответственно видоизменив его под свои нужды
    #!/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
  •  Эта команда для всех пунктов состояния задает failed. В дальнейшем ядро операционной системы удалит помеченные MAC адреса. 
    ip neigh flush all

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

 

AWK  состоит из операторов (правил), имеющих вид:

 шаблон {действие}
 шаблон {действие}
 . . .

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

В AWK также существует 2 предопределённых шаблона BEGIN и END. BEGIN выполняется до начала обработки входного потока. END — после обработки последней записи входного потока.

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

Используемые флаги:

{--field-separator fs | -F fs}

 Эта опция устанавливает разделитель fs в качестве разделителя полей в записи (это значение предустановленной  переменной FS). 
{--assign var=val | -v var=val}

 Присваивает значение val переменной var, перед выполнением программы. Такие переменные доступны в блоке  BEGIN AWK программы . 
{--file program-file | -f program-file}

 Читает исходный код AWK программы из файла program-file, instead of from the first command line argument. Разрешается  множественное использование опции. 
{-mf NNN | -mr NNN}

 Установка различных ограничений памяти в значение NNN. Флаг f устанавливает максимальное число записей,  а флаг r максимальный размер записи. Эти два флага и опция -m позаимствованы из Bell Laboratories research версии awk Unix. Они игнорируются gawk, так как gawk не имеет никаких предопределенных ограничений. 
{--compat | -W compat | -W traditional | --traditional}

 Запуск в режиме совместимости. В режиме совместимости, gawk ведет себя идентично с Unix awk; не поддерживая расширения  GNU. Ипользование опции --traditional, предпочтительнее других ее форм. 
{--copyleft| -W copyleft | --copyright | -W copyright }

 Выводит краткую версию сообщения информации об авторских правах GNU на стандартный вывод и завершает работу. 
{--dump-variables[=file] | -W dump-variables[=file]}

 Выводит краткий список глобальных переменных, их типов и окончательных значений в файл file. Если файл не указан,  gawk использует файл с именем awkvars.out в текущей директории. Иметь список всех глобальных переменных - это хороший метод обнаружить ошибку в Вашей программе. Вы должны также использовать эту опцию, если есть большая программа с большим количеством функций, и Вы хотите убедиться, что Ваши функции неосторожно не используют глобальные переменные, которые должны быть локальными. 
{--help | -W help | --usage | -W usage}

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

 

{--lint[=value] | -W lint[=value]}

 Выдает предупреждения о сомнительных или непортируемых конструкциях в другие AWK реализации. С дополнительным аргументом  fatal, предупреждения становятся критическими ошибками. Эта опция не обязательна, но ее использование приведет к развитию более "чистых" AWK программ. С дополнительным аргументом invalid, будут выдаваться только предупреждения о вещах, которые являются фактически недействительными. 
{--lint-old | -W lint-old }

 Выводит предупреждения о конструкциях которые не совместимы с оригинальной версией Unix awk.

 

{--gen-po | -W gen-po}

 Сканирует программу AWK, и выводит сгенерированый файл в формате GNU .po на стандартный вывод с вхождениями для  всех локализированых строк в программе. Сама программа останется не выполнена. Смотрите GNU gettext(1) для получения более детальной информации о .po файлах. 
{--non-decimal-data | -W non-decimal-data}

 Распознает восьмиричные и шестнадцатеричные значения во входящих данных.  Используйте эту опцию с большим предостережением!

 

{--posix | -W posix}

 Включает режим совместимости, с дополнительными ограничениями: 

  *  не распознаются escape-последоавтельности \x . 

  *  Только пробел и табуляция действуют как поле разделитель, когда FS установлена в одиночный пробел, символ новой  строки - нет. .br 
  *  Вы не можете продолжать строку после символов ? и :. 

  *  Не распознается синоним func для ключевого слова function

  *  Операторы ** и **= не могут использоваться вместо ^ и ^ =. 

  *  Функция fflush() недоступна.

 

{--profile[=prof_file] | -W profile[=prof_file] }

 Отправить профильные данные в файл prof_file. Если не указано иное, то по умолчанию в файл с именем  awkprof.out.  Если запускается gawk, в файле содержится "правильно форматированная" версия программы. Если запускается pgawk, то профильные данные содержат счетчики выполнения каждого утверждения в программе в левой части и счетчик вызова функции для каждой определенной пользователем функции. 
{--re-interval | -W re-interval}

 Enable the use of interval expressions in regular expression matching (see Regular Expressions, below).  Interval  expressions  
 were not traditionally available in the AWK language.  The POSIX standard added them, to make awk and egrep consistent with  each other. However, their use is likely to break old AWK programs, so gawk only provides them if they are requested with this option, or when --posix is specified. 
{--source program-text | -W source program-text}

 Использовать program-text как исходный код программы AWK. Эта опция разрешает простое объединение библиотечных  функций (подключаемых с помощю опций --file_program-file и --file_program-file с исходным кодом в командной строке. Это предназначено прежде всего для средних и больших AWK программ используемых в скриптах коммандной оболочки.

 

{ --version | -W version}}

 Выводит информацию о версии.

 

--

 Сигнализирует про окончание опций. Это полезно, если дальнейшие аргументы для программы AWK непосредственно начинаются  с символа "-".

Встроенные переменные

 

Переменная Содержание Значение по умолчанию
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

Если в качестве имени файла задать дефис («-«), 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 — вывести информацию о версии и выйти.

 

Утилита имеет несколько интересных опций, которые могут сильно помочь при нестандартных задачах копирования, поэтому давайте их рассмотрим:

  • --attributes-only - не копировать содержимое файла, а только флаги доступа и владельца;
  • -b, --backup - создать резервную копию файла назначения если он существует;
  • --copy-contents - копировать содержимое для специальных файлов (сокеты, файлы устройств);
  • -f, --force - удалить файл назначения перед попыткой записи в него если он существует;
  • -i, --interactive - спрашивать, нужно ли перезаписывать существующие файлы;
  • -n, --no-clobber - не перезаписывать существующие файлы;
  • -P--no-dereference - копировать сами символические ссылки, а не то на что они указывают;
  • -L--dereference - копировать не символические ссылки, а то, на что они указывают;
  • -l, --link - создавать жесткие ссылки вместо копирования;
  • --preserve - переносить указанные атрибуты с файла источника в файл назначения, возможные значения: mode, ownership, time‐stamps, context, links, xattr, all;
  • --no-preserve - не переносить указанные атрибуты;
  • --parents - сохранять путь, указанный в файле источнике, в папке назначения;
  • -r, --recursive - копировать папку Linux рекурсивно;
  • --reflink - использовать Copy on Write если это поддерживается файловой системой;
  • -s--symbolic-link - не выполнять копирование файлов в Linux, а создавать символические ссылки;
  • -S--suffix - указать суффикс для резервных копий файлов;
  • --sparse - настройка работы с разреженными файлами;
  • -t, --target-directory - считать файл-назначения директорией и копировать файл-источник или директорию-источник в эту директорию с оригинальным именем;
  • -T, --no-target-directory - считать директорию назначения файлом или директорией для записи данных. Если в качестве источника выбран файл, то он будет скопирован с новым именем. Если директория, то её содержимое будет скопировано в директорию назначения; 
  • -u--upgrade - скопировать файл, только если он был изменён;
  • -x--one-file-system - рекурсивное копирование не должно выходить за пределы этой файловой системы;
  • -v--verbose - максимально подробный вывод.

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

  • -p - сохранять владельца, временные метки и флаги доступа при копировании, аналогично --preserve=mode,ownership,timestamps;
  • -d - копировать символические и жесткие ссылки именно как ссылки, аналогично --no-dereference --preserve=links;
  • -a - режим резервного копирования, при котором сохраняются все атрибуты, ссылки, а также выполняется резервное копирование папок, аналогично --recursive --preserve=all, --no-dereference;

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

Параметры:

  • if: указывает на источник, т.е. на то, откуда копируем. Указывается файл, который может быть как обычным файлом, так и файлом устройства.
  • of: указывает на файл назначения. То же самое, писать можем как в обычный файл, так и напрямую в устройство. 
  • bs: количество байт, которые будут записаны за раз. Можно представлять этот аргумент как размер куска данные, которые будут записаны или прочитаны, а количество кусков регулируется уже следующим параметром. 
  • count: как раз то число, которое указывает: сколько кусочков будет скопировано. 


Таким образом, описанная команда читает 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-системах, показывающая список файловых систем по именам устройств, их размер, свободное пространство и точки монтирования.

Флаги

-h, --human-readable

[править | править код]

Отобразит размер в человеко-читаемом формате, размерностью 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
-H, --si

Отобразит размер в человеко-читаемом формате, в единицах СИ, размерностью 1000, добавив названия единиц (кб,мб,тб)

-a, --all
Включает в список файловых систем те, которые имеют размер в 0 блоков, и которые по умолчанию опускаются. Такие файловые системы обычно являются псевдо-файловыми системами специального назначения, например, для automounter. Кроме того, только если задана эта опция, будут показаны файловые системы типа «ignore» или «auto», которые поддерживаются некоторыми операционными системами[1].
-k
Используется для отображения размеров блоками по 1 килобайту, вместо установленных по умолчанию блоков в 512 байт.
-i, --inodes
Вместо информации о блоках выдаётся информация об использовании inode'ов в файловой системе. Inode содержит информацию о файле: владелец, права доступа, временные штампы и местоположение на диске. Если на диске записано множество мелких файлов и inodes оказались исчерпаны, то никакие дополнительные файлы не могут быть записаны, несмотря на наличие свободного места на диске[1].
$ df -i /
Файл.система Iнодов IИспользовано IСвободно IИспользовано% Cмонтировано в
/dev/sda2 38363136 1262071 37101065 4% /
-t тип-файловой-системы, --type=тип-файловой-системы
Показывать только файловые системы с указанным типом-файловой-системы. Можно задать несколько типов файловых систем, если использовать несколько опций -t. По умолчанию никакие типы файловых системы не опускаются.
-T, --print-type
Выдавать тип для каждой файловой системы. Тип берётся от операционной системы (и определяется системно-зависимым способом, например посредством чтения файла /etc/mtab)[1].
-x тип-файловой-системы, --exclude-type=тип-файловой-системы
Не показывать файловые системы с заданным типом-файловой-системы. Можно задать несколько типов файловых систем, если использовать несколько опций -x . По умолчанию никакие типы файловых систем не опускаются.

Утилиту 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

Основные параметры

-C, --clear
Очистить кольцевой буфер ядра
-c, --read-clear
Читать и удалять все сообщения
-D, --console-off
Отключить вывод сообщений на консоль
-E, --console-on
Включить печать сообщений на консоль
-F, --file <file>
Использовать файл вместо буфера журнала ядра
-f, --facility <list>
Ограничить вывод на определённые объекты
-H, --human
Человекочитаемый вывод
-J, --json
Использовать выходной формат JSON
-k, --kernel
Отображать сообщения ядра
-L, --color[=<when>]
Раскрашивать сообщения (авто, всегда или никогда). Цветной шрифт по умолчанию поддерживается
-l, --level <list>
Ограничить вывод до определенных уровней
-n, --console-level <level>
Установить уровень сообщений, выводимых на консоль
-P, --nopager
Не передавать вывод на пейджер
-p, --force-prefix
Принудительно выводить временную метку в каждой строке многострочных сообщений
-r, --raw
Распечатать буфер необработанных сообщений
    --noescape
Не экранировать непечатаемый символ
-S, --syslog
Заставить использовать syslog(2) вместо /dev/kmsg
-s, --buffer-size <size>
Размер буфера для запроса кольцевого буфера ядра
-u, --userspace
Отображать сообщения пользовательского пространства
-w, --follow
Ожидать новых сообщений
-W, --follow-new
Ожидать и печатать только новые сообщения
-x, --decode
Средство декодирования и уровень для читаемой строки
-d, --show-delta
Показать разницу во времени между распечатанными сообщениями
-e, --reltime
Показать местное время и дельту времени в удобочитаемом формате
-T, --ctime
Показать удобочитаемую временную метку (может быть неточной!)
-t, --notime
Не показывать метку времени с сообщениями
    --time-format <format>
Показать временную метку, используя заданный формат: [delta|reltime|ctime|notime|iso] 
    --since <time>
Отображать строки с указанного времени
    --until <time>
Отображать строки до указанного времени
-h, --help
Показать справку

sudo dmesg - вызов dmesg без каких-либо опций выводит весь буфер ядра

sudo dmesg --follow - режим реального времени

 sudo dmesg | grep -i usb - поиск определенного термина

sudo dmesg -c - очистить журнал после вывода

sudo dmesg -H - включение временных меток

sudo dmesg -f syslog - отфильтровать вывод по определенной категории(здесь syslog)

Доступные категории - 

kern
Сообщения ядра
user
Сообщения на уровне пользователя
mail
Сообщения почтовой системы
daemon
Сообщения о системных демонах
auth
Сообщения авторизации
syslog
Внутренние сообщения syslogd
lpr
Сообщения подсистемы построчного принтера
news
Сообщения подсистемы сетевых новостей

sudo dmesg -f syslog,daemon - можно по нескольким

sudo dmesg -l warn - отфильтровать по уровню журнала

emerg
Экстренные сообщения
alert
Предупреждения, требующие немедленных действий
crit
Критические условия
err
Сообщения об ошибках
warn
Предупреждающие сообщения
notice
Нормальные, но существенные условия
info
Информационные сообщения
debug
Сообщения уровня отладки

sudo dmesg --time-format=ctime - отфильтровать по выводу формата времени(доступные - ctime,notime,delta,reltime,iso)

Флаги

  • -n - не выводить перевод строки;
  • -e - включить поддержку вывода Escape последовательностей;
  • -E - отключить интерпретацию Escape последовательностей.

 

 

Использование escape-символов с командой echo

Опция -e с echo позволяет вам интерпретировать escape-символы. С помощью escape-символов вы можете отображать текст на экране другим способом по вашему выбору.

Следующие escape-символы доступны с escape:

  • \a – оповещение (воспроизводит звуковой сигнал)
  • \b – Backspace
  • \c – не печатать последний перевод строки (так же, как опция -n)
  • \f – из корма
  • \n – перевод строки
  • \r – возврат каретки
  • \t – горизонтальная вкладка
  • \v – вертикальная вкладка
  • \\ – обратная косая черта
  • \’- одинарная кавычка
  • \”- двойная цитата

В то время как опция -e просит команду echo интерпретировать escape-символы, опция -E делает обратное и игнорирует escape-символы.

Теперь давайте посмотрим, как использовать некоторые из этих escape-символов с командой echo.

echo -e "Око за оком оставляет весь мир слепым\n\t- Ганди"

 

Можете ли вы угадать, какой будет вывод команды выше? Вот:

Око за оком оставляет весь мир слепым
– Ганди

 

Давайте посмотрим некоторые другие примеры escape-символов. Символ возврата каретки печатает только текст после этого символа.

destroyer@andreyex:~$ echo -e “Привет\rМир”
Мир

 

Если вы используете символ возврата, он удалит один символ перед ним:

destroyer@andreyex:~$ echo -e “Привет \bМир”
ПриветМир

 

Вы можете играть с другими escape-символами таким же образом.

 

 Отображение текста с одинарными или двойными кавычками с помощью команды echo

Работа с одинарными и двойными кавычками часто является головной болью.

Если у вас есть одинарная кавычка в тексте, который вы хотите отобразить, вы должны заключить весь ввод в двойные кавычки:

destroyer@andreyex:~$ echo “Это мой мир”
Это мой мир

 

Если вы хотите отобразить двойные кавычки, вы должны «избежать» этого:

destroyer@andreyex:~$ echo “Это \”мой\” мир”
Это “мой” мир

 

 Показать файлы в каталоге

Вы, вероятно, используете команду ls для отображения файлов в каталоге . Вы также можете использовать команду echo для этой цели.

Чтобы отобразить содержимое текущего каталога, вы можете использовать эту команду:

echo *

 

Вы также можете использовать команду echo для отображения файлов только определенного типа:

echo *.txt

 

Используйте команду echo для очистки файла в Linux

Мы уже показали этот совет для очистки файлов журналов в Linux. Если у вас есть текстовый файл, и вы хотите очистить его содержимое, не удаляя сам файл, вы можете использовать команду echo следующим образом:

echo > filename

 

Бонусный совет: отображение вывода команды echo в цвете

Вы, вероятно, натолкнулись на какой-нибудь 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
$
    

1. Поиск в нескольких файлах

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 печатает имя файла перед соответствующей строкой, чтобы указать местонахождение шаблона.

2. Поиск без учета регистра

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.
$
    

3. Поиск всего слова

Зачастую вместо частичного совпадения необходимо полное соответствие поисковому слову. Это можно сделать, используя флаг -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.
$
    

4. Проверка количества совпадений

Иногда вместо фактического совпадения со строкой нам необходимо количество успешных совпадений, найденных grep. Этот результат можно получить, используя опцию -c:

        $ grep -c [pattern] [file]
    

Вывод:

        $ grep -c is text_file.txt
2
$
    

5. Поиск в подкаталогах

Часто требуется выполнить поиск файлов не только в текущем рабочем каталоге, но и в подкаталогах. Grep позволяет это сделать с помощью флага -r:

        $ grep -r [pattern] *
    

Вывод:

        $ grep -r Hello *
dir1/file1.txt:Hello One
dir1/file2.txt:Hello Two
dir1/file3.txt:Hello Three
$
    

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

6. Инверсивный поиск

Если вы хотите найти что-то несоответствующее заданному шаблону, 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или без него. С флагом печатается каждая строка, которая не соответствует шаблону.

7. Печать номеров строк

Если хотите напечатать номера найденных строк, чтобы узнать их позицию в файле, используйте опцию -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.
$
    

8. Ограниченный вывод

Для больших файлов вывод может быть огромным и тогда вам понадобится фиксированное количество строк вместо всей простыни. Можно использовать -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
$
    

9. Отображение дополнительных строк

Иногда необходимо вывести не только строки по некоторому шаблону, но и дополнительные строки выше или ниже найденных для понимания контекста. Можно напечатать строку выше, ниже или оба варианта, используя флаги -A-B или -C со значением num (количество дополнительных строк, которые будут напечатаны). Это применимо ко всем совпадениям, которые grep находит в указанном файле или в списке файлов.

        $ grep -A[num] [pattern] [file]
    

или

        $ grep -B[num] [pattern] [file]
    

или

        $ grep -C[num] [pattern] [file]
    

Ниже показан обычный вывод grep, а также вывод с флагами. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующих выходных данных:

  • с флагом -A1 выведется 1 строка, следующая за основной;
  • -B1 напечатает 1 строку перед основной;
  • -C1 выведет по одной строке снизу и сверху.
        $ 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.
$
    

10. Список имен файлов

Чтобы напечатать только имя файлов, в которых найден шаблон, используйте флаг -l:

        $ grep -l [pattern] [file]
    

Вывод:

        $ grep -l su *.txt
file.txt
text_file.txt
$
    

11. Точный вывод строк

Если необходимо напечатать строки, которые точно соответствуют заданному шаблону, а не какой-то его части, применяйте в команде ключ -x:

        $ grep -x [pattern] [file]
    

В приведенном ниже примере file.txt содержится слово «support», а строки без точного совпадения игнорируются.

        $ grep -x support *.txt
file.txt:support
$ 
    

12. Совпадение по началу строки

Используя регулярные выражения, можно найти начало строки:

        $ 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. Заключение в кавычки может помочь, когда шаблон содержит пробелы и т. д.

13. Совпадение по концу строки

Эта полезная регулярка способна помочь найти по шаблону конец строки:

        $ 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.
$
    

Обратите внимание, как меняется вывод, когда мы сопоставляем символ «.» и когда используем «$», чтобы сообщить утилите о строках, заканчивающихся на «.» (без тех, которые могут содержать символ посередине).

14. Файл шаблонов

Если у вас есть некий список часто используемых шаблонов, укажите его в файле и используйте флаг -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.
$
    

15. Указание нескольких шаблонов

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.
$
    

16. Расширенные выражения

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. В качестве протокола поддерживаются такие значения, как tcpudp и т.д. С полным списком поддерживаемых протоколов можно ознакомиться в файле /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

Для отображения нумерации правил воспользуемся командой:

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 [ -s сигнал | -p ] [ -a ] pid...
  • kill -l [ сигнал ]

Где:

pid …
Указать список идентификаторов процессов, которым команда kill должна послать сигнал. Каждый аргумент pid должен быть номером процесса либо его именем.
-s
Указать посылаемый сигнал. Сигнал должен быть указан по имени либо по номеру.
-p
Указывает, что команда kill должна вывести идентификаторы (pid) поименованных процессов, но не посылать им сигнал.
-l
Выводит список имён сигналов. Эти имена можно посмотреть также в файле /usr/include/linux/signal.h (или /usr/include/signal.h)

Принцип действия

Команда 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

Команда "pkill" позволяет использовать расширенные шаблоны регулярных выражений и другие критерии соответствия. Вместо использования PID вы теперь можете завершить приложение, введя имя его процесса. Например, для завершения работы Firefox просто введите команду: 

$ pkill firefox

Так как оно соответствует шаблону регулярного выражения, вы можете также ввести имя только частично, например:

$ pkill fire

Чтобы предотвратить завершение не тех приложений, которые требовалось, можно использовать команду "pgrep -l [process name]" для вывода списка всех подходящих процессов.

Killall

Killall также использует имя процесса вместо PID и завершает все экземпляры процесса с этим именем. Например, если вы запустили несколько экземпляров Firefox, вы можете завершить их все с помощью команды:

$ killall firefox

В Gnome вы можете перезапустить Nautilus с помощью команды:

$ killall nautilus

xkill

Xkill - это графический способ завершения приложений. Когда вы введете "xkill" в терминале, курсор примет вид крестика. Все, что вам требуется, кликнуть этим крестиком в окне нужного приложения и оно немедленно завершится. Если вам понравится такой способ, можно настроить для активации xkill горячие клавиши. Например, ctrl+shift+K в kubuntu по умолчанию.

 

Большинство современных оболочек имеют стандартную встроенную команду kill.

1. ls без параметров

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

2. ls с параметром -l

Здесь, 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

3. Просмотр скрытых файлов

Показ всех файлов, включая скрытые, которые начинаются с «.»

# 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        

4. Перечисление файлов с удобным отображением размера

С опцией -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

5. Перечисление файлов и директорий с символом «/» в конце

Использование опции -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/    

6. Перечисление файлов в обратном порядке

Следующая команда ls с опцией -r выводит файлы и каталоги в обратном порядке.

# ls -r

Videos     Public    Music               install.log  fbcmd_update.php  Documents  0001.pcap
Templates  Pictures  install.log.syslog  index.html   Downloads         Desktop    

7. Рекурсивный список подкаталогов

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

8. Обратный порядок вывода

С помощью комбинации -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

9. Сортировка файлов по размеру

При комбинации -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

10. Отображение inode файла или каталога

Мы можем увидеть некоторое число перед именем файла/каталога. С опцией -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

11. Версия утилиты ls

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

# 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.

12. Страница помощи

Вывести справочную страницу команды ls с опциями.

# ls --help

Usage: ls [OPTION]... [FILE]...

13. Просмотр файлов в каталоге

С помощью команды 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/

14. Отображение UID и GID файлов

Для просмотра 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

15. Команда ls и ее alias

Мы создали псевдоним для команды 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/ в текущий каталог (.). Если в текущем каталоге встретятся изображения с расширением .jpgmv выдаст запрос на перезапись. В этой команде используется звёздочка (*) — это подстановочный знак (см. ниже главу «Подстановочные знаки»).

  • -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 или --backupmv переименовывает целевой файл, если он существует, добавив суффикс к его имени. Тем самым сохраняется копия исходного файла, а не его перезаписанный вариант.

Существует два типа резервных копий — простые и нумерованные:

  1. Простые резервные копии удаляют существующий файл резервной копии. Сохраняется только одна копия. Суффиксом по умолчанию для простых резервных копий является тильда (~). Например, файл plain.txt будет сохранён как plain.txt~. Можно изменить этот суффикс с помощью опции --suffix или установить переменную окружения SIMPLE_BACKUP_SUFFIX.

  2. Нумерованные резервные копии сохраняют существующие файлы резервных копий, создавая дополнительные резервные копии с возрастающим номером в имени файла. Резервные файлы не удаляются. Суффикс для нумерованных резервных копий: .~n~, где n — целое число. Например, файл plain.txt будет сохранён в виде файла plain.txt.~1~, затем plain.txt.~2~ и т. д.

Доступны дополнительные правила для создания резервных копий с помощью контроля версий. Способ контроля версий устанавливается опцией --backup или переменной окружения VERSION_CONTROL. Значения:

  • noneoff — никогда не создавать резервных копий, даже если указан ключ --backup.
  • numberedt — создавать нумерованные резервные копии.
  • existingnil — если существуют нумерованные копии, то создавать нумерованные (numbered) иначе создавать простые (simple).
  • simplenever — всегда создавать простые резервные копии.

Примеры:

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.txtMyself.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.txtplain03.txt и т. п.). Если tmp не существует или не является каталогом, mv сообщает об ошибке и ничего не делает.

2. $ mv My\ plain?.txt tmp — в этой команде всего один подстановочный знак ?. Если tmp является каталогом, то любой файл с одним символом между My plain и .txt в их имени перемещается в tmp (например, My plain1.txtMy 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): ведь ни те, ни другие при перемещении/переименовании файла не изменяются.

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

 

1. Список всех портов (как прослушиваемые, так и не прослушиваемые порты)

Список всех портов с помощью команды 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

2. Список сокетов, которые находятся в состояние прослушивания

Список только прослушивающих портов с помощью 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

3. Показать статистику для каждого протокола

Показать статистику для всех портов с использованием 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

4. PID и названий программ в выводе netstat с помощью команды netstat -p

Опция 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   –

 

5. Не разрешать хост, порт и имя пользователя в выводе netstat

Если вы не хотите отображать имя хоста, порт или пользователя, используйте netstat с опцией -n. Это будет отображаться в цифрах, и не разрешать имя хоста, имя порта, имя пользователя.

Это также ускоряет выход, так как netstat не выполняет какие-либо просмотров.

netstat -an

Если вы не хотите один из этих трех пунктов (порт или хост, или пользователя), используйте следующие команды.

# netsat -a –numeric-ports

# netsat -a –numeric-hosts

# netsat -a –numeric-users

 

6. Непрерывная печать информации netstat

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.

7. Найти номера поддерживающей адрес семей в вашей системе

В конце концов, вы будете иметь что-то вроде этого.

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.

 

8. Отображение информации о маршрутизации ядра с помощью netstat -r

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 для отображения маршрутов в цифровом формате без разрешения хост-имени.

9. Узнайте, на каком порту работает программа

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’

10. Показать список сетевых интерфейсов

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

11. Показать список всех прослушиваемых портов в системе с привязанными к ним приложениями 

(Используя все поддерживаемые системой протоколы) 

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     

 

 
`sed` (Stream EDitor) — это мощный потоковый текстовый редактор в Linux, который позволяет выполнять базовые и сложные преобразования текста без интерактивного редактирования. В этой статье мы разберём основы `sed` и его применение с регулярными выражениями.
## 1. Основы команды sed
### Синтаксис команды:
sed [опции] 'команда' файл
 
### Основные опции:
- `-e` — добавить команду для выполнения
- `-f` — указать файл со скриптом sed
- `-i` — редактировать файл на месте (с сохранением изменений)
- `-n` — подавить автоматический вывод
## 2. Основные команды sed
### Замена текста (s)
Самый частый случай использования — замена текста:
sed 's/старое/новое/' файл.txt
 
Пример:
echo "Привет мир" | sed 's/мир/Linux/'
# Вывод: Привет Linux
 
### Глобальная замена (флаг g)
Без флага `g` заменяется только первое вхождение в строке:
echo "яблоко яблоко" | sed 's/яблоко/апельсин/'
# Вывод: апельсин яблоко
 
С флагом `g` заменяются все вхождения:
echo "яблоко яблоко" | sed 's/яблоко/апельсин/g'
# Вывод: апельсин апельсин
 
### Удаление строк (d)
sed 'Nd' файл.txt  # Удалить N-ю строку
sed '$d' файл.txt  # Удалить последнюю строку
sed '1,3d' файл.txt # Удалить строки с 1 по 3
 
Пример:
seq 5 | sed '3d'
# Вывод:
# 1
# 2
# 4
# 5
 
### Печать определённых строк (p)
С опцией `-n` и командой `p` можно выводить только нужные строки:
sed -n '1p' файл.txt  # Напечатать только первую строку
 
Пример:
seq 5 | sed -n '2,4p'
# Вывод:
# 2
# 3
# 4
 
## 3. Регулярные выражения в sed
### Базовые регулярные выражения
1. `.` — любой одиночный символ
echo "кот кит кВт" | sed 's/к.т/DOG/g'
# Вывод: DOG DOG DOG
 
2. `*` — ноль или более повторений предыдущего символа
echo "ст стст стстст" | sed 's/ст*/X/g'
# Вывод: X X X
 
3. `^` — начало строки
echo "тест\nлиния тест" | sed 's/^тест/START/'
# Вывод:
# START
# линия тест
 
4. `$` — конец строки
echo "тест\nлиния тест" | sed 's/тест$/END/'
# Вывод:
# тест
# линия END
 
### Классы символов
1. `[ ]` — любой из символов в скобках
echo "cat bat rat" | sed 's/[cbr]at/DOG/g'
# Вывод: DOG DOG DOG
 
2. `[^ ]` — любой символ, кроме указанных
echo "cat bat rat" | sed 's/[^b]at/DOG/g'
# Вывод: DOG bat DOG
 
### Экранирование специальных символов
Для использования специальных символов как обычных, их нужно экранировать `\`:
echo "Путь: /usr/local/bin" | sed 's/\/usr\/local\/bin/\/opt\/bin/'
# Или проще с другим разделителем:
echo "Путь: /usr/local/bin" | sed 's|/usr/local/bin|/opt/bin|'
 
## 4. Продвинутые примеры
### Сохранение части совпадения (группы)
Используйте `\( \)` для группировки и `\1`, `\2` для ссылок:
echo "Иванов Иван" | sed 's/\([^ ]*\) \([^ ]*\)/\2 \1/'
# Вывод: Иван Иванов
 
### Выполнение нескольких команд
sed -e 's/foo/bar/' -e 's/baz/qux/' файл.txt
# Или через точку с запятой:
sed 's/foo/bar/; s/baz/qux/' файл.txt
 
### Редактирование файла на месте
sed -i 's/старое/новое/g' файл.txt
 
### Удаление пустых строк
sed '/^$/d' файл.txt
 
### Замена только в определённых строках
sed '2,4s/старое/новое/g' файл.txt  # Замена только в строках 2-4
 
## 5. Практические примеры
### Изменение формата даты
echo "2023-12-31" | sed 's/\(....\)-\(..\)-\(..\)/\3.\2.\1/'
# Вывод: 31.12.2023
 
### Удаление HTML-тегов
echo "<b>Жирный</b> текст" | sed 's/<[^>]*>//g'
# Вывод: Жирный текст
 
### Извлечение определённых данных
echo "Ошибка: 404 Not Found" | sed 's/.*: \([0-9]*\).*/\1/'
# Вывод: 404
 
`sed` — это чрезвычайно мощный инструмент для обработки текста в командной строке. Освоив базовые команды и регулярные выражения, вы сможете эффективно выполнять сложные текстовые преобразования без использования полноценных текстовых редакторов.
Для более сложных задач можно комбинировать `sed` с другими утилитами (`grep`, `awk`) в конвейерах, что делает его незаменимым инструментом в арсенале любого пользователя Linux.
 
 

# Комбинирование `sed` с другими утилитами: практические примеры

В продолжении статьи мы рассмотрим мощные комбинации `sed` с другими Linux-утилитами для решения реальных задач. Эти примеры помогут вам автоматизировать обработку текста и файлов в командной строке.
## 1. Комбинация `sed` и `grep`
### Поиск и замена только в совпадающих строках
Часто нужно выполнить замену только в строках, которые содержат определённый паттерн:

grep "error" log.txt | sed 's/error/CRITICAL ERROR/'

Более эффективная версия (без конвейера):
sed -n '/error/{s/error/CRITICAL ERROR/;p}' log.txt

### Извлечение и преобразование данных из логов
Пример обработки логов Nginx:
grep "404" access.log | sed 's/.*\[\(.*\)\].*"GET \(.*\) HTTP.*/\1: 404 на \2/'

## 2. Комбинация `sed` и `awk`
### Сложная обработка столбцов
Когда нужно обработать определённые столбцы в табличных данных:
awk -F: '{print $1,$3}' /etc/passwd | sed 's/^/Пользователь: /; s/ / имеет UID: /'

### Многоэтапная обработка данных
Пример обработки CSV:
awk -F, '$3 > 100 {print $0}' data.csv | sed 's/,/;/g' > processed.csv

## 3. Комбинация `sed` с `find` и `xargs`
### Массовое редактирование файлов
Замена текста во всех файлах с определённым расширением:
find . -name "*.html" -type f -print0 | xargs -0 sed -i 's/old-domain.com/new-domain.com/g'

### Удаление BOM (Byte Order Mark) из файлов

find . -type f -name "*.txt" -exec sed -i '1s/^\xEF\xBB\xBF//' {} \;

## 4. Комбинация `sed` с `cut`
### Извлечение и преобразование определённых частей строки
Пример обработки вывода `ls -l`:
ls -l | cut -d' ' -f1,9 | sed 's/^/Права: /; s/ / для файла: /'

## 5. Реальные рабочие примеры
### Пример 1: Массовое переименование файлов

find . -name "*.jpg" | sed 's/\(.*\).jpg/mv "&" "\1.png"/' | sh

### Пример 2: Анализ логов с группировкой

grep "POST /api" access.log | awk '{print $1}' | sort | uniq -c | sed 's/^ *\([0-9]*\) \(.*\)/\2: \1 запросов/'

### Пример 3: Преобразование Markdown в HTML

sed 's/^# \(.*\)$/<h1>\1<\/h1>/; s/^## \(.*\)$/<h2>\1<\/h2>/' doc.md | awk '/^$/ {print "<p>"; next} {print}'

### Пример 4: Очистка и форматирование конфигурационных файлов

grep -v "^#" nginx.conf | grep -v "^$" | sed 's/^\s*//; s/;$/;/'

## 6. Советы по оптимизации
1. **Избегайте избыточных конвейеров** — иногда лучше использовать одну утилиту с более сложным выражением:
   
   # Вместо:
   grep "something" file | sed 's/.../.../'
   # Лучше:
   sed -n '/something/{s/.../.../;p}' file
   
2. **Используйте `-exec` в `find` вместо `xargs`** для сложных команд:
   
   find . -name "*.txt" -exec sed -i 's/foo/bar/g' {} +
   
3. **Для обработки больших файлов** комбинируйте `awk` и `sed` — `awk` быстрее обрабатывает большие объёмы данных.

Комбинирование `sed` с другими утилитами Unix открывает практически безграничные возможности для обработки текста. Ключевые преимущества такого подхода:
- **Мощность** — решение сложных задач одной строкой
- **Автоматизация** — возможность обработки тысяч файлов
- **Гибкость** — адаптация под любые форматы данных
- **Повторяемость** — скрипты можно сохранить и использовать многократно

 

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 сортирует строки

  1. Строки с цифрами размещаются выше других строк

  2. Строки, начинающиеся с букв нижнего регистра размещаются выше

  3. Сортировка выполняется в соответствии алфавиту

  4. Строки сначала сортируются по алфавиту, а уже вторично по другим правилам.

Пример сортировки и обратной сортировки

Прямая сортировка файл, по принципам описанным выше, происходит по умолчанию. Просто вызовите команду 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 для удаления дубликатов

Команда 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 оперирует так называемыми модулями или юнитами. По сути, юнит — текстовое описание сервиса, в котором перечислены операции для выполнения до и после запуска службы.

Все модули можно найти в трёх каталогах:

  • /usr/lib/systemd/system — юниты сервисов, установленных с помощью менеджера пакетов. Самый простой пример — веб-серверы: Apache или Nginx.
  • /run/systemd/system — юниты, которые создаются в процессе работы системы.
  • /etc/systemd/system — юниты, которые создаёт администратор системы.

Список всех запущенных модулей можно посмотреть, использовуя команду systemctl. В терминале вы увидите таблицу со статусом каждой службы. Разберём, что означает каждый из столбцов:

  1. UNIT. Название модуля
  2. LOAD. Статус загрузки конфигурации, если успешно — loaded.
  3. ACTIVE. Статус службы. Один из следующих: active, inactive, running, exited, dead, loaded, not-found, plugged, mounted, waiting, listening.
  4. SUB. Детальная информация о юните.
  5. DESCRIPTION. Краткое описание модуля — за что он отвечает.

Типы юнитов

Модули делятся на категории по типу. Тип каждого модуля можно узнать из названия файла — он указан через точку. Все типы модулей:

  1. .service — описывает, как управлять службой и приложением
  2. .socket — описывает сетевой буфер, который используется для активации сокета
  3. .device — описывает устройство как необходимое для управления systemd
  4. .mount — определяет точку монтирования в системе
  5. .automount — настраивает автоматическую установку точки монтирования
  6. .swap — описывает пространство подкачки в системе
  7. .target — обеспечивает синхронизацию устройств при загрузке системы
  8. .path — определяет путь, который используется для активации
  9. .timer — определяет задержку или активацию по плану
  10. .snapshot — делает снимок системы для последующего восстановления
  11. .slice — ограничивает узлы группы управления
  12. .scope — systemd создаёт эти модули автоматически, пользуясь информацией из интерфейса шины

Некоторые полезные опции

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

Как создать скрипт запуска 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

Настройка демона journald

С настройками по умолчанию журналы 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, а также на любой платформе, где доступны PythonGTK+ и 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 - изменение оболочки пользователя