MyTetra Share
Делитесь знаниями!
Большая шпаргалка по командам Bash
Время создания: 11.06.2025 12:14
Текстовые метки: linux, bash, shell, команда, шпаргалка, памятка, консоль, утилита
Раздел: Компьютер - Linux - Bash - Команды и скрипты
Запись: xintrea/mytetra_syncro/master/base/1749633297ciry9r5fm8/text.html на raw.github.com

Основы bash

  • Переменные

text="(ip a)" передает текст
echo $text
ipaddr=$(ip a) передает вывод команды
echo $ipaddr
echo '$ipaddr' в одинарных кавычках не происходит подстановка переменных
var=$((5+5))
echo $var
read -p "Enter: " enter ручной ввод переменной echo $enter
read -s -p "Enter password: " pass ввод пароля
echo $pass
echo -e "text\ntext" экранирование
echo -e "# comment\nparam comment" > ~/test.txt записать в файл
cat ~/test.txt | grep -v "^#" прочитать без комментариев в начале строки

original_value="Это длинная строка, которую нужно сократить до 50 символов."
shortened_value="${original_value:0:50}" обрезаем до 50 символов

true ; echo $? код возврата 0 (успех)
false ; echo $? код возврата 1 (ошибка)

  • Массивы

range={1..254} создать срез от 1 до 254
array=(1 2 3 4 5) создать массив
array=($(ls /)) передает вывод команды $(command) разделенных через пробел
echo ${array[@]} отобразить содержимое всего массива @/*
echo ${array[0]} отобразить первый индекс в массиве
echo ${array[-1]} отобразить последний индекс
echo ${array[@]:1:3} вывести 3 элемента (срез)
echo ${#array[@]} отобразить кол-во (#) элементов в массиве
echo ${#array[0]} отобразить длинну (#) первого элемента в массиве
array[1]="22" изменить значение по номеру индекса

declare -A dict=(

["key 1"]=1

["key 2"]="text"

)

echo ${dict[key 1]}

echo ${dict[key 2]}

  • Цикл for

for ((i=1; i <= 10; i++)); do

echo $i

done


array=($(ls /))

for arr in ${array[@]}; do

echo $arr

done

break прерывает цикл
continue прерывает текущую интерацию в цикле и переходит к следующей

array=(1 2 3 4 5)

for var in ${array[@]}; do

if [ $var -gt 4 ]; then

break

elif [ $var -gt 3 ]; then

echo "Last number: $var"

continue

fi

echo "Number: $var"

done

  • Цикл while

p=1

while [ $p -le 101 ]; do

# если условие истинно, выполнять цикл в блоке do, пока не станет ложным

echo "Значение переменной: $p"

# ((p++)) # увеличить на +1

# p=$(($p+10)) # прибавлять +10

p+=0 # добавить текст в конец переменной

done

  • Построчная передача вывода через pipe

num=0

ps | sed 1d | while read line; do

((num++)) # ((num+=1))

echo "Line $num : $line"

done

  • Условия

if [] если
then условие истинно
elif [] дополнительное условие
then дополнительное условие истинно
else условие ложно
fi больше нет условий

-z строка пуста
-n строка не пуста
=, (==) строки равны
!= строки неравны
-eq равно
-ne неравно
-lt, (<) меньше
-le, (<=) меньше или равно
-gt, (>) больше
-ge, (>=) больше или равно
! отрицание логического выражения
-a, (&&) логическое «и» (первая команда исполняется всегда, вторая — только в случае успешного завершения первой)
-o, (||) логическое «или» (первая команда исполняется всегда, вторая — только в случае неудачного завершения первой)

if [[ -z "$variable" ]]; then

echo "Переменная пустая"

else

echo "Переменная не пустая"

fi

  • Функции

function calc {

if [ $2 = "+" ]

then

echo $(( $1 + $3 ))

elif [ $2 = "-" ]

then

echo $(( $1 - $3 ))

fi

}

calc 3 + 2
calc 3 - 2

  • Параметры командной строки

nano script.sh

#!/bin/bash

if [ -n "$1" -a "$2" ]; then

echo Имя исполняемого файла: $0

echo Первый переданный параметр: $1

echo Второй переданный параметр $2

echo Кол-во переданных параметров: $#

echo Значение последнего переданного параметра: ${!#}

echo Массив: $@

else

echo "Параметры не заданы"

fi

chmod +x script.sh сделать скрипт исполняемым
bash script.sh 1 2 3 4 5 передать параметры в скрипт

-e file проверяет, существует ли файл
-d file проверяет, существует ли файл, и является ли он директорией
-f file проверяет, существует ли файл, и является ли он файлом
-r file проверяет, существует ли файл, и доступен ли он для чтения
-w file проверяет, существует ли файл, и доступен ли он для записи
-x file проверяет, существует ли файл, и является ли он исполняемым
-s file проверяет, существует ли файл, и не является ли он пустым

# Получить список директорий и исполняемых файлов в дочерних директориях

path="/etc/*"

for folder in $path; do

echo "$folder:"

for file in $folder/*; do

if [ -x $file ]; then

echo "- $file"

fi

done

done

  • case

read -rsn1 key

case $key in

"1")

echo выполнить действия, если $key равно 1 ;;

"2")

echo выполнить действия, если $key равно 2 ;;

*)

echo выполнить действия по умолчанию, если значение $key не соответствует ни одному условию

;;

esac


Работа с файлами

file Console-Performance.sh узнать тип файла (текстовый, исполняемый файл, архив или другой)
stat Console-Performance.sh узнать размер файла, количество блоков, занятых файлом на диске, количество жестких ссылок, права доступа и временные метки
pwd текущая директория
ls -lh * отобразить содержимое каждого подкаталога отдельно
ls -lhaF отобразить скрытые директории (-a) с точкой и выделит директории (/)
which top узнать путь до исполняемого файла
stat $(which top) узнать дату последнего доступа к файлу
cat -n /etc/passwd просмотр содержимого файла с отображением номеров строк
mkdir создать директорию
mktemp -d создать временный файл/каталог (-d)
touch -t 202106222200.15 test.file создать файл и указать дату создания
cp test.file test.file2 копировать файла/каталог
mv test.file2 test.file3 переименовать/переместить файл/каталог
rm -r test.file удалить каталог с файлами (-r)

ln

echo "test" > testfile
ln /test/testfile /test/testlink создать жестку (hard) ссылку, которая указывает на один и тот же inode, т.е. они делят одно и то же физическое местоположение на диске
rm testfile при удалении одного из файлов не приводит к удалению содержимого, пока существует хотя бы одна жесткая ссылка
ln -s /test/testfile /test/testlink создать символическую (-s - soft) ссылку, которая ссылается на файл testfile
echo "test" >> testfile при добавлении в оригинальный файл, все изменения будут отражены в testlink
rm testfile при удалении исходного файла у ссылки будет ошибка (No such file or directory)

zip

rar a test.rar filename filename2 создать архив test.rar и добавить туда два файла (файлы копируются в архив)
unrar x test.rar разархивировать
zip -r test.zip filename архивировать (файлы копируются в архив)
unzip test.zip разархивировать
bzip2 filename архивировать в filename.bz2 (файлы перепещаются в архив)
bunzip2 filename.bz2 разархивировать
gzip filename архивировать в filename.gz (файлы перепещаются в архив)
tar --totals -cvf archive.tar file1 file2 file3 архивировать три файла
wget https://github.com/librespeed/speedtest-cli/releases/download/v1.0.10/librespeed-cli_1.0.10_linux_amd64.tar.gz загрузить архив
gunzip librespeed-cli_1.0.10_linux_amd64.tar.gz извлечь из gz в tar
tar -tf librespeed-cli_1.0.10_linux_amd64.tar отобразить содержимое архива
tar -xvf librespeed-cli_1.0.10_linux_amd64.tar разархивировать
./librespeed-cli --help
./librespeed-cli --json

gpg

gpg -c filename зашифровать данные
gpg filename.gpg расшифровать данные
gpg --gen-key создавать пару ключей (публичный и приватный ключи)
gpg --export -a 'User Name' > publickey.asc экспорт публичного ключа
gpg --import publickey.asc импорт на второй стороне
gpg --encrypt --recipient 'Recipient Name' filename зашифровать данные с использованием публичного ключа получателя, только владелец приватного ключа сможет расшифровать эти данные
gpg --decrypt encryptedfile.gpg расшифровать данные можно с помощью приватного ключа
gpg --sign filename подписывать данные с использованием приватного ключа для подтверждения их подлинности и целостности
gpg --verify signedfile.gpg проверка подписи с использованием публичного ключа отправителя

api

curl

curl ifconfig.me узнать внешний ip
curl -v telnet://192.168.3.100:22 првоерить доступность порта и отобразить кому он принадлежит
curl -s -o /dev/null http://google.com подавить весь вывод (статистику --silent и --output)
curl -s -o /dev/null --show-error --fail http://google.com оставить вывод ошибок
curl http://192.168.3.101:8081/api/ --connect-timeout 5 задать timeout ожидания ответа в секундах
curl -IL https://github.com/Lifailon/hwstat/archive/refs/tags/hwstat-0.0.8.zip получить информацию о файле перед скачиванием (--head/--location)
curl -O https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh скачать файл
curl -o /tmp/hwstat.sh https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh указать путь
curl -Ik https://192.168.3.104:9443/ игнорировать ошибку самоподписанного сертификата SSL (--insecure)
curl -u <user:password> https://test.com/endpoint авторизация
curl -x "http://Proxy:Proxy@192.168.3.100:9090" "https://kinozal.tv/rss.xml" использовать Proxy-сервер
curl --insecure --ssl-reqd "smtps://smtp.yandex.ru" --mail-from "src@yandex.ru" --mail-rcpt "dst@yandex.ru" --user "src@yandex.ru" --upload-file out.txt отправка email через SMTPS (SMTP over SSL/TLS) сервер

influxdb

ip="192.168.3.104"

db="dbash"

table="icmp_metrics_table"

server="google.com"

host=$(hostname)

date=$(echo $EPOCHREALTIME | sed -E "s/\..+//")"000000000"

ping=$(ping $server -c 1)

loss=$(printf "%s\n" "${ping[@]}" | grep -Eo "[0-9]+%" | sed "s/%//")

if (( $(echo "$loss != 100" | bc) )); then

status="true"

rtt=$(printf "%s\n" "${ping[@]}" | grep rtt | awk -F"/" '{print $5}')

else

status="false"

rtt="0"

fi

curl -i -XPOST "http://$ip:8086/write?db=$db" --data-binary "$table,host=$host,server=$server status=$status,rtt=$rtt $date"

wget

wget --spider https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 проверить (--spider) работоспособность URL и узнать размер файла (Length)
wget -O nextcloud.tar.bz2 https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 скачать с указанным именем (-O)
wget -P /tmp https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 скачать в указанную директорию (-P)
wget -b -o ~/wget.log https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 загрузить в фоновом режиме (-b) и записать вывод в лог-файл (-o)

curlie

curl -sS https://webinstall.dev/curlie | bash альтернатива curl и httpie (https://github.com/rs/curlie )
curlie get https://jsonplaceholder.typicode.com/posts возвращает заголовки ответа и отформатированный вывод JSON
curlie get https://jsonplaceholder.typicode.com/posts/1
curlie get https://jsonplaceholder.typicode.com/posts -H "Authorization: Bearer YOUR_TOKEN"
curlie post https://jsonplaceholder.typicode.com/posts -d '{"title": "foo", "body": "bar", "userId": 1}'

httpie

sudo snap install httpie HTTP-клиент командной строки (https://github.com/httpie/cli )
https httpie.io/hello
https POST pie.dev/post X-API-Token:123 name=John

json

jq

apt install jq установить jq (https://github.com/jqlang/jq )
nodes=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/ips) получить список node
echo $nodes | jq обработка входных данных командой jq (вывод отображается в правильно структурированном формате, а все элементы подсвечиваются соответствующим цветом)
echo $nodes | jq '.nodes | length' количество дочерних объектов в блоке node[]
echo $nodes | jq -r .nodes[1] получить значение второго объекта массива в формате raw string (not JSON)
echo $nodes | jq -r .nodes[-1] получить значение последнего объекта массива
hosts=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts) получить список всех хостов
echo $hosts | jq -r '.nodes | to_entries[].key' получить список всех вложенных ключей (адреса хостов) из объека (не является массивом)
echo $hosts | jq -r '.nodes | to_entries[].value' получить только значения всех вложанных ключей
echo $hosts | jq '.nodes."bg1.node.check-host.net"' получить значение дочернего ключа nodes по имени
echo $hosts | jq '.nodes | [.[]] | last' преобразовать отдельные объекты внутри nodes в массив, и передать полученный вывод в функцию last для получения значений последнего объекта
echo $hosts | jq '.nodes | to_entries[].value.location[0] == "ru"' проверить каждый элемент объекта в условии на true/false (вернет массив)
echo $hosts | jq '.nodes | to_entries[] | {Host: .key, Country: .value.location[1], City: .value.location[2]}' получить данные key-value из объекта nodes и пересобрать массив с новыми значениями ключей
echo $hosts | jq -r '.nodes | to_entries[] | "\(.key) (\(.value.location[1]), \(.value.location[2]))"' собрать массив строки из содержимого ключей
var="-" && echo $hosts | jq --arg v "$var" -r '.nodes | to_entries[] | "\(.key) \($v) \(.value.location[1]) \($v) \(.value.location[2])"' передать внешнюю переменную, которая будет использоваться внутри запроса
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru") | .key' произвести фильтрацию (select), что бы получить только нужные объекты
echo $hosts | jq '.nodes | to_entries[] | select(.value.location[0] != "ru") | .key' вывести объекты, которые не равны значению
echo $hosts | jq '.nodes | length' вывести общее количество объектов
echo $hosts | jq '.nodes | to_entries | map(select(.value.location[0] != "ru")) | length' создать массив функцией map() (объеденяет отдельные объекты {}{} группируются в один массив [{},{}]) только из тех объектов, которые соответствуют условию select() и вывести количество найденных объектов
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru" or .value.location[0] == "tr") | .key' проверить два условия через or или and (для проверяемого типа данных int кавычки не используются)
echo $hosts | jq -r '.nodes | to_entries[] | select(.key | index("jp")) | .key' вывести список хостов региона Japan, которые в названии ключа содержат ключевое слово jp (частичное совпадение в значении)

host="yandex.ru"

protocol="ping"

host="yandex.ru:443"

protocol="tcp" # udp/http/dns

# Забрать id для получения результатов

check_id=$(curl -s -H "Accept: application/json" "https://check-host.net/check-$protocol?host=$host&max_nodes=3" | jq -r .request_id)

# Функция получения результатов проверки по id

function check-result {

curl -s -H "Accept: application/json" https://check-host.net/check-result/$1 | jq .

}

# Получить суммарное количество хостов, с которых производится проверка

hosts_length=$(check-result $check_id | jq length)

while true; do

check_result=$(check-result $check_id)

# Забираем результат и проверем, что содержимое всех проверок не равны null

check_values_not_null=$(echo $check_result | jq -e 'to_entries | map(select(.value != null)) | length')

if [[ $check_values_not_null == $hosts_length ]]; then

echo $check_result | jq

break

fi

sleep 1

done

echo '{"iso": [{"name": "Ubuntu", "size": 4253212899}, {"name": "Debian", "size": 3221225472}]}' | jq '.iso[] | {name: .name, size: (.size / 1024 / 1024 / 1024 | tonumber * 100 | floor / 100 | tostring + " GB")}' получить ГБ из байт и округлить вывод до 2 символом после запятой
echo '{"iso": [{"name": "Ubuntu", "progress": 0.333}]}' | jq '.iso[] | {name: .name, progress: (.progress * 100 | floor / 100 * 100 | tostring + " %")}' получить процент из дробной части (33%)
echo '[{"name": "Ubuntu", "added_on": 1625072400}, {"name": "Debian", "added_on": 1625158800}]' | jq '.[] | {name: .name, date: (.added_on + 3 * 3600 | strftime("%H:%M:%S %d.%m.%Y"))}' получить дату

netcheck

sudo curl -s https://raw.githubusercontent.com/Lifailon/Check-Host/rsa/netcheck/netcheck.sh -o /usr/bin/netcheck

sudo chmod +x /usr/bin/netcheck

netcheck -t ping yandex.ru
netcheck -n
netcheck -t ping yandex.ru ru1.node.check-host.net
netcheck -t dns yandex.ru
netcheck -t http yandex.ru:443 5
netcheck -t tcp yandex.ru:443

jc

apt install jc установить jc (https://github.com/kellyjonbrazil/jc ) для преобразования вывода популярных инструментов командной строки, типов файлов и общих строк в JSON, YAML или словари Python, что позволяет передавать вывод в инструменты, такие как jq
dig google.com | jc --dig
dig example.com | jc --dig | jq -r '.[].answer[].data'
jc --pretty /proc/meminfo
systemctl list-units --all --plain --no-legend --no-pager | jc --systemctl -p

brew

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" установить менеджер пакетов brew (https://github.com/Homebrew/brew ) для macOS/Linux
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew --version

fx

brew install fx || snap install fx установить fx (https://github.com/antonmedv/fx ) TUI интерфейс для JSON на GoLang
hosts=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts)
echo $hosts | fx доступна навигация с раскрытием блоков и отображает ключи доступа для jq
source <(fx --comp bash) добавить autocomplete в интерпритатор bash
echo $hosts > hosts.json
fx hosts.json .nodes .\[\"ru1.node.check-host.net\"\] .ip происходит автоматический вывод ключей и подстановка

jid

brew install jid установить jid (https://github.com/simeji/jid ) для интерактивной фильтрации JSON данных с использованием автозавершения на GoLang
echo '{"info":{"date":"2016-10-23","version":1.0},"users":[{"name":"simeji","uri":"https://github.com/simeji","id":1},{"name":"simeji2","uri":"https://example.com/simeji","id":2},{"name":"simeji3","uri":"https://example.com/simeji3","id":3}],"userCount":3}}' | jid .users[1].uri

jqp

brew install noahgorstein/tap/jqp установить jqp (https://github.com/noahgorstein/jqp ) TUI интерфейс для отображения jq запросов на GoLang
curl -s https://api.github.com/repos/Lifailon/PS-Commands/contents | jqp слева отображается исходный файл, справа отфильтрованный вывод
curl -s https://check-host.net/nodes/hosts | jqp # пример для фильтрации: .nodes | to_entries[] | select(.value.location[0] == "ru") | .key

xmllint

apt-get install libxml2-utils || snap install libxml2 || brew install libxml2
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xmllint --xpath '//rss/channel/item/link/text()' -
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xmllint --xpath '//rss/channel/item[1]/link/text()' -

dasel

brew install dasel установить dasel (https://github.com/TomWright/dasel ) для обработки JSON, YAML, TOML, XML и CSV (поддерживает преобразование между форматами) на GoLang
echo '{"name": "Tom"}' | dasel -r json 'name'
echo '{"name": "Tom"}' | dasel -r json -w yaml конвертировать json в yaml
echo '{"name": "Tom"}' | dasel -r json -w xml конвертировать json в xml
echo '{"name": "Tom"}' | dasel put -r json -t string -v 'contact@tomwright.me' 'email' добавить свойство
echo '{"email": "contact@tomwright.me","name": "Tom"}' | dasel delete -r json '.email' удалить свойство

tee users.json <<EOF

{

"users": [

{

"name": "Иван Иванов",

"email": "ivan.ivanov@example.com"

},

{

"name": "Мария Петрова",

"email": "maria.petrova@example.com"

}

]

}

EOF

dasel -f users.json -r json ".users.[0].email"

tee users.yaml <<EOF

users:

- name: Иван Иванов

email: ivan.ivanov@example.com

- name: Мария Петрова

email: maria.petrova@example.com

EOF

dasel -f users.yaml -r yaml ".users.[1].email"

tee users.toml <<EOF

[[users]]

name = "Иван Иванов"

email = "ivan.ivanov@example.com"

[[users]]

name = "Мария Петрова"

email = "maria.petrova@example.com"

EOF

dasel -f users.toml -r toml ".users.[1].email"

tee users.xml <<EOF

<users>

<user>

<name>Иван Иванов</name>

<email>ivan.ivanov@example.com</email>

</user>

<user>

<name>Мария Петрова</name>

<email>maria.petrova@example.com</email>

</user>

</users>

EOF

dasel -f users.xml -r xml ".users.user.[0].email"

xq

apt-get install xq || brew install xq установить xq (https://github.com/sibprogrammer/xq ) для XML и HTML на GoLang
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xq -nx /rss/channel/item вывод содержимого дочерних элементов с тегами
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | xq -x /rss/channel/item/link вывести только содержимое (массив ссылок)
curl -s https://kinozal.tv -x kinozal:proxy@192.168.3.100:9090 | xq -nq "head" вывести блок head целиком (с тегами)
curl -s https://kinozal.tv -x kinozal:proxy@192.168.3.100:9090 | xq -q "head" вывести только текст из дочерних элементов выбранного тега (содержимое title)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | xq -nq "body > div > div > div > div > table > tbody > tr > td"
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | xq -q a -a href забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)

htmlq

brew install htmlq установить htmlq (https://github.com/mgdm/htmlq ) like jq for HTML
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | htmlq table tr td a -t получить содержимое таблицы (вывести только текст содержимого)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:proxy@192.168.3.100:9090 | htmlq table tr td a -a href получить только ссылки
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | htmlq a -a href забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)

yq

snap install yq установить yq (https://github.com/mikefarah/yq ) для YAML, JSON, XML, CSV и TOML
cat /etc/netplan/*.yaml | yq .network.ethernets список адаптеров netplan
cat /etc/netplan/*.yaml | yq .network.ethernets.eth0.nameservers.addresses[] вывести массив dns адресов, настроенные на адаптере
curl -s https://kinozal.tv/rss.xml -x kinozal:proxy@192.168.3.100:9090 | yq -p xml .rss.channel.item[1].link вывести ссылку из первого элемента
curl -s https://raw.githubusercontent.com/JingWangTW/dark-theme-editor/main/hugo.toml | yq -p toml .params.footer.socialLink прочитать конфигурацию Hugo

yamllint

apt install yamllint установить yamllint (https://github.com/adrienverge/yamllint ) для проверки синтаксических ошибки YAML-файла
yamllint /etc/netplan/*.yaml

jsonlint

apt-get install -y nodejs установить Node.js
npm install jsonlint -g установить jsonlint (
https://github.com/zaach/jsonlint ) для проверки синтаксических ошибок JSON
echo '{"name":"example","value":"test",}' | jsonlint
echo '{"name":"example","value":"test"}' | jsonlint

csv

brew install csvlens установить csvlens (https://github.com/YS-L/csvlens ) для взаимодестия в csv через TUR на Rust
pwsh -Command "Get-Process | ConvertTo-Csv | Out-File process.csv"
csvlens process.csv

sttr

snap install sttr установить sttr (https://github.com/abhimanyu003/sttr ) для конвертации и работы данными на GoLang
curl -s curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts | sttr json-yaml конвертировать JSON в YAML
cat /etc/netplan/*.yaml | sttr yaml-json | jq конвертировать YAML в JSON
curl -s https://raw.githubusercontent.com/Lifailon/hwstat/rsa/README.md | sttr markdown-html конвертировать Markdown в HTML
echo "test" | sttr hex-encode кодировать в HEX формат
echo "74657374" | sttr hex-decode декодировать HEX
echo "Test" | sttr upper поднять регистр (TEST)
echo "Test" | sttr lower опустить регистр (test)
echo -e "test1\ntest1\ntest2" | sttr unique-lines получить уникальные строки
echo -e "a\nz\nb" | sttr sort-lines сортировать строки по алфавиту
echo -e "test1 \ntest2" | sttr remove-newlines удалить новые строки
echo -e "test1\ntest2" | sttr count-chars посчитать количество символов
echo -e "test1\ntest2" | sttr count-lines посчитать количество строк

grep

cat /var/log/auth.log | grep sshd логи всех SSH-подключений
cat /etc/passwd | grep -w sys поиск целого слова, окруженное пробелами (-w)
cat /etc/ssh/sshd_config | grep -win port не учитывать регистр (-i) и отобразить номера строк (-n)
ss -n | grep -P ":22|:80|:443|:8080" искать по нескольким шаблонам, использовать Regex (-E)
ss -n | grep -Pc ":22|:80" вывести кол-во (--count) совпадений
ss -n | grep "192.168.3...:" поиск любых двух символов (.)
ss -n | grep "192.168.3.*:" поиск любого кол-ва (*)
cat /etc/ssh/sshd_config | grep -v "#" вывести значения, не подходящие под критерии поиска (-v)
cat /etc/zabbix/zabbix_agentd.conf | grep -v "^#" отсеить только в начале строки (^)
cat /etc/zabbix/zabbix_agentd.conf | grep "=$" найти строки, которые кончаются $ на символ = (получить все параметры)
cat /etc/zabbix/zabbix_agentd.conf | grep -Pv "^$|^#" удалить пустые строки ^$ и комментарии (^#)
cat /etc/zabbix/zabbix_agentd.conf | grep -E "#+{5}" регулярное выражение (-E), где последний символ # повторяется 5 или более раз
echo -e "Test\ntest\n123-45" | grep -E "[a-zA-Z\-]" искать только текст (где есть буквы и тире)
echo 'test<version>1.2.3</version>test' | grep -P -o "(?<=<version>).*(?=</version>)" найти неизвестное значение (.*) между известными и вывести только найденное (-o)
echo "test<version>3.6.4</version>test" | grep -Eo '[0-9.]+' найти любую цифру и точку на конце, которые повторяются любое кол-во раз подряд
echo $(lshw -class bus) | grep -P -o "(?<=Motherboard product: ).*(?=serial)" с применение группировки (-P)
zabbix_path=$(systemctl status zabbix-agent | grep -Po "(?<=-c ).*(?=.conf)" | sed "s/$/.conf/") забрать путь до конфигурационного файла Zabbix агента
cat $zabbix_path | grep -E "^Server=|^ServerActive=" найти имя сервера
cat $zabbix_path | grep -Po "(?<=^Server=).+" вывести только имя сервера
resolvectl | grep "DNS Servers" -m 1 напечатать только первое совпадение (-m int)
networkctl status | grep -A 3 "DNS:" найти строку и напечатать три строки после нее (-A)
networkctl status | grep -B 3 "DNS:" найти строку и напечатать три строки до нее (-B)
networkctl status | grep -C 1 "DNS:" найти строку и напечатать одну строки до нее и одну после (-C)
resolvectl | grep -Ex ".+DNS Servers:.+" вывести строки с точным совпадение (-x/like), сопоставлять только целые строки
if echo "GET" | grep -Eq "^GET"; then echo da; else echo net; fi подавлять вывод (-q) для проверки условия
curl https://api.github.com/repos/PowerShell/PowerShell/releases/latest | grep -Eom 1 "https://.+.deb" забрать только первый подходящий под поиск

ripgrep

apt-get install ripgrep установить ripgrep (https://github.com/BurntSushi/ripgrep ), аналог grep на Rust
cat /var/log/auth.log | rg sshd вывести журнал логов аудентификации фильтрацией по названию
cat /var/log/auth.log | rg "Accepted password for \w+ from \d+\.\d+\.\d+\.\d+" вывести строки, где указано Accepted password for, далее любое слово (имя пользователя) и IP-адрес в формате x.x.x.x
cat /var/log/auth.log | rg "user \w+\(uid=\d+\)" вывести строки с текстом user, затем имя пользователя (любое слово), и далее uid с числовым значением в скобках
cat /var/log/auth.log | rg "192\.168\.\d+\.\d+" вывести строки, где первые два октета соответствуют 192.168
cat /var/log/auth.log | rg "sshd\[\d+\]: .* port \d+" вывести строки, содержащие sshd с идентификатором процесса (например, sshd[4188420]), а затем текст port и номер порта
cat /var/log/auth.log | rg "\b12:\d{2}:\d{2}\b" фильтрация по времени за последние 12 часов (время начинается с 12:, затем две цифры для минут и две для секунд)

sig

brew install ynqa/tap/sigrs установить sig (https://github.com/ynqa/sig ) интерактивный grep на Rust
curl -s https://raw.githubusercontent.com/Lifailon/hwstat/rsa/README.md > README.md
cat README.md |& sig -a

sed

cat /etc/passwd | sed -n "1,5p" отобразить с первой по пятую строку (p)
cat /etc/passwd | sed "$ d" удалить (d) последнюю строку
cat /etc/passwd | sed "1,3d" удалить c первой по третью строку (2,3d)
echo "One 1" | sed "s/One/Two/; s/1/2/" заменить One на Two и 1 на 2
cat /etc/zabbix/zabbix_agentd.conf | sed "s/127.0.0.1/192.168.3.102/" # > /etc/zabbix/zabbix_agentd.conf заменить (s) ip-адрес
cat /etc/zabbix/zabbix_agentd.conf | sed "/^#\|^$/d" удалить пустые строки ^$ и комментарии ^#
timedatectl | grep zone | sed -E "s/.+zone: //" удалить любое кол-во лимволов до слова "zone: " включительно, используя Regex (-E/-r)
echo -e "test\ntest" | sed "2s/test/test2/" заменить во второй строке (2s)
echo -e "test\ntest\ntest\ntest" | sed "2,3s/test/test2/" заменить во второй и третей строке (2,3s)
echo -e "test\ntest\ntest\ntest" | sed "2ctest2" заменить вторую строку (2c)
echo "The test and test" | sed "s/test/test2/g" заменить для каждого совпадения (/global)
echo "The test and test" | sed "s/test/test2/2" заменить для второго совпадения (/2)
echo "line2" | sed "i\line1" добавить строку в начало (i)
echo "line1" | sed "a\line2" добавить строку в конец (a) или в после указанной строки (2a)
echo "11 22 33 34" | sed "y/123/234/" заменить 1 на 2, 2 на 3, 3 на 4 (y)
ls -R | grep ':' | sed "s/:$//; s/[^\/]*\// - /g" удалить : в конце и заменить вначале строки "/любое кол-во символов между/" на " - " для всех (/g global)
echo "test<version>3.6.4</version>test" | sed -r 's/[^<]*<(.*)>.*/\1/;s/<.*//;s/.*>//' использовать regex (-r)
ps aux | grep -E "^zabbix .+ -c" | sed -E "s/^zabbix.+-c //" найти процесс zabbix с ключем -c и оставить путь conf
echo "MPEG-H HEVC, 88.5 Мбит/с, 3840x2160, 23.976 кадр/с, 10 бит" | sed -nr 's/.* ([0-9]+x[0-9]+).*/\1/p' выводить только найденные строки (-n) с заменой (s/), ищем только цифры [0-9] где одно или более вхождений (+) и между ними x, вывести только первую группу поиска (то, что в скобках) на печать (/p)

awk

cat /etc/passwd | awk -F: '{print "name: " $1 " \t Dir: " $NF}' вывести содержимое первого и последнего $NF элемента в строке, используя разделитель ":" и табуляцию (\t)
echo 'one two three four' | awk '{print $(NF-1)}' вывести содержимое преподследнего элемента
echo 'one two three four five' | awk '{print $((NF/2)+1)}' вывести содержимое из середины
echo "One Two Three" | awk '{$3="Four"; print $0}' заменить третье значение/переменную в строке
cat /etc/passwd | awk 'BEGIN{FS=":"; OFS=" - "} {print $1,$7}' указать разделитель послей (элементов) на вход (FS) и заменить его на выходе (OFS)
uptime | awk 'BEGIN{RS=" "; ORS="\n"} {print $0}' указать разделитель записей (строк) на входе (RS) и заменить его на выходе (ORS)
echo -e "12345\n54321" | awk 'BEGIN{FIELDWIDTHS="2 3"}{print $1,$2}' указать фиксированное кол-во символов для разделения
lsof | awk '{if($7=="REG")print $0}' условие для выборки по столбцу
cat /etc/ssh/sshd_config | awk '/Port / {print $2}' условие поиска для вывода
cat /etc/ssh/sshd_config | awk 'length $0 > 1' вывести строки, которые длиннее, чем 1 символ (удалить пустые строки)
cat /var/log/syslog | grep "$date" | awk '{print length($6)}' вывести длинну значения
awk 'BEGIN{x = "low"; print toupper(x)}' использовать функцию для перевода в вверхний регистр
awk 'BEGIN{x = "LOW"; print tolower(x)}' использовать функцию для перевода в нижний регистр
echo "1 2 3 4:5:6" | awk '{item=$4; split(item,array,":"); print array[2]}' разбить 4 значение на массив (используя функцию split) и забрать значение по 2-му индексу
free | awk '{if (NR == 2) print $0}' вывести только вторую строку
free | awk '{if (NR >= 2) print $0}' вывести втроую и последующие строки
free | awk '{if (NF >= 5) print $0}' вывести строки, где 5 или больше значений
cat /etc/passwd | awk '{ if (NR >= 10 && NR <= 20) print $0}' вывести с 10 по 20 строки
last | sed -n 1p | awk '$2=" ",$4=" "{print $0}' вывести все, кроме 2 и 4 значения (заменить)
ps -A | awk '{sum=""; for(i=1;i<=NF;i++) { if (i != 2) {sum=sum" "$i} } print sum}' вывести все, кроме 2-го значения

cut -d',' -f2,4 file.csv взять второй и четвертый столбцы
awk -F',' '{if (NF >= 4) print $2, $4}' file.csv

grep "Error" logs.txt
awk '/Error/' logs.txt
awk '/^Error [0-9]{3}:/' logs.txt

grep -c "Success" logs.txt посчитать количество совпадений
awk '/Success/ {count++} END {print count}' logs.txt

sed 's/Error/Success/g' file.txt замена слов
awk '{gsub(/Error/, "Success"); print}' file.txt

sort file.txt | uniq
awk '!seen[$0]++' file.txt заполняем уникальный массив строк

wc -w file.txt посчитать количество слов в файле
awk '{count += NF} END {print count}' file.txt

sed -n '10,20p' file.txt вывести с 10 по 20 строку
awk 'NR>=10 && NR<=20' file.txt

awk '{sum += $1} END {print sum/NR}' numbers.txt получить среднее значение чисел в первом столбце
awk '{ if ($2 > 50000) print $1, "> 50K"; else print $1, "< 50K" }' data.txt вывести значение первого столбца, если значение второго столбца выше или ниже 50 тысяч
awk '{ sum = 0; for (i = 1; i <= NF; i++) sum += $i; print "сумма:", sum }' data.txt посчитать сумму числе в каждой строке
awk '{ for (i = 1; i <= NF; i++) sum[i] += $i } END { for (i in sum) print "Столбец", i, "сумма:", sum[i] }' data.txt посчитать сумму числе в каждом столбце

printf

top=$(top -bn1)
printf "%s\n" "${top[@]}" вывести вывод массива построчно
printf "%.2f \n" 1.1111 округлить до 2 символов после запятой
printf "%.0f \n" 1.6 удалить дробную часть (округлить до 2)
printf "Arg1: %s\nArg2: %s\n" "10" "20" принимает и выводит аргументы (%s) в виде строки

cut

echo "1 2 3" | cut -c 1,5 вывести первый и пятый симов (--bytes/--characters)
echo "1 2 3" | cut -c 1-3 вывести с первой по третий символ
echo "1 2 3" | cut -c3- удалить первые 2 символа
echo -e "test1,test2,test3\ntest1,test2,test3" | cut -d , -f 2-100 указать разделитель полей/столбцов (--delimiter) и какие столбцы вывести (--fields) с 2 по 100
echo -e "test1,test2,test3\ntest1,test2,test3" | cut -d , -f 1,3 | sed "s/,/ /" вывести 1 и 3
echo -e "test1,test2,test3\ntest1 test2 test3" | cut -d , -f 1,3 -s печатать строки, где есть разделитель (-s)

rev

echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | rev | cut -d \\ -f 1 | rev забрать последний элемент в пути (вначале разворачивает всю строку, забирает первый элемент и разворачивает строку обратно)
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | sed -r 's/.+\\//' удалить все до последнего слеша
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | sed 's/.*\\\(.*\)/\1/' удаляет все до последнего слеша и забирает одну группу захвата, что остается после удаления, и заменяет вывод на первую группу (1)
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | awk -F '\\' '{print $NF}' забрать последний элемент массива (NF)

tr

echo "10 20 100 200" | tr 1 2 translate заменяет 1 на 2 для всех подходящих сомволов (20 20 200 200)
echo "1 2 3" | tr " " "," заменить пробелы на запятые (1,2,3)
echo "1 2 3" | tr -d " " удалить пробелы (123)

debug

trap 'echo "$BASH_COMMAND"' DEBUG построчная отладка скриптов bash, команда trap перехватывает сигнал DEBUG, посылаемый перед выполнением команды и выводит команду на экран
trap 'echo "$BASH_COMMAND";read' DEBUG read ожидает ввода с клавиатуры (Enter или Ctrl+C) перед выполнением каждой командой
bash -x script.sh отладка (печать команд и их аргументов по мере их выполнения)
bash -x -c "ls -l" | grep *.sh | awk '{print $5,$NF}' запуск команды через интерпритатор bash и вывод отладки
bash --debug script.sh проверка на ошибки
apt-get install shellcheck установить shellcheck
shellcheck -S error hwstat.sh error/warning/info/style
pip3 install thefuck установить thefuck
bas hwstat.sh запустить команду с ошибкой
fuck автоматически исправляет последнюю ошибочную команду из выпадающего списка (up/down)

tools

pip install toolong
tl /var/log/auth.log интерактивный просмотр логов в консоли с фильтрацией
tl access.log* --merge просмотр нескольких файлов

apt install bat аналог cat (https://github.com/sharkdp/bat ) с подсветкой синтаксиса bat /etc/netplan/*.yaml

tree /var/log/ древовидный просмотр директорий и дочерних файлов

cargo install --locked broot установить broot (https://github.com/Canop/broot ), аналог tree
broot kinozal-bot/

echo 'deb http://cz.archive.ubuntu.com/ubuntu jammy main universe' >> /etc/apt/sources.list && apt update
apt install exa установить аналог ls (
https://github.com/ogham/exa )
exa $(pwd) -l --icons отобразить иконки с подсветкой прав доступа

cargo install eza аналог ls (https://github.com/eza-community/eza ) на базе exa
eza -l --icons
eza --tree kinozal-bot/

cargo install lsd аналог ls (https://github.com/lsd-rs/lsd )
lsd -l kinozal-bot/

column /etc/passwd -t -s ":"
netcheck -t ping yandex.ru us1.node.check-host.net | sed -r 's/"//g; s/,$//; s/\{|\}|\[|\]//' | column -t -s ":" распарсить JSON и добавить отступ (табуляцию) для колонок

ls /home | wc -l word count выводит количество строк (--line)
ls /home | wc -w количество слов (--words)
ls /home | wc -m количество символом (--chars)
ls /home | wc -c количество символов/байт (--bytes)

echo "(5.5-2.2)" | bc математические вычисления
echo "(5.5-2.2)" | bc | sed -E "s/\..+//" удалить дробную часть
echo "1 < 2" | bc возвращает булевое значение (1 - да или 0 - нет)
echo "1 > 2" | bc false (0)
icmp_ignore=$(cat /proc/sys/net/ipv4/icmp_echo_ignore_all) забрать значение
if (( $(echo "$icmp_ignore == 1" | bc) )); then echo "true"; else echo "false"; fi проверить в условии арефметическое значение на равенство (возвращает 0 - false или 1 - true)

a=1
b=0.55
echo $(bc <<< "scale=2; $a+$b")
echo "print $a+$b" | perl
echo "print($a+$b)" | python3
echo "print($a+$b)" | lua
echo "puts $a+$b" | ruby
pwsh -Command $a+$b

echo -e "key1\nkey2\nkey3" > 1.txt
echo -e "value1\nvalue2\nvalue3" > 2.txt
paste 1.txt 2.txt -d : объединяет два файла в один многоколоночный вывод
cat /etc/passwd | paste -s -d + объеденить (join) многострочный файл, используя указанный delimiter

echo -e "test1\ntest2" > 1.txt \ echo -e "test\ntest2\ntest3" > 2.txt
diff 1.txt 2.txt -c ! есть изменения, + есть новая строка
diff 1.txt 2.txt -yi сравнивает в две колонки (| есть изменения, + есть новая строка) и игнорировать регистр (-i)
diff 1.txt 2.txt -u объеденяет два файла в один вывод с отображением изменений (+/)
diff 1.txt 2.txt -ibBEt не учитывать пробелы (-b) и пустые строки (-B), игнорировать изменения в табуляциях (-E) и заменить табуляции на пробелы в выводе (-t)
diff -c <(echo "$predu") <(echo "$du") сравнить содержимое переменных

snap install diff-so-fancy
diff -u file-1.txt file-2.txt | diff-so-fancy

apt install jdupes
jdupes . поиск дубликатов

cat /etc/passwd | sort -r отсортировать вывод по алфовиту в обратном порядке (-r)
du -h ~ | sort -n сортировать по арифметическому значению (-n) размер файлов и директорий
ls -l | sed 1d | sort -nk5 сортировка по пятой колонке (-k)
cat $tmp | sort -t "." -nk4 сортировать по четвертой колонке, используя разделитель (-t) точку

echo -e "1 2\n1 2\n2 1\n1 2" | uniq удаляет соседние одинаковые строки
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq удалить все дубликаты
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq -c добавляет в начало каждой строки кол-во повторений
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq -u отобразить только уникальные строки, без строк с повторениями

ls -l | fold -w 50 задать ширину вывода каждой строки, выпадающее за указанный предел переносится на новую строку
ls -l | fold -w 50 -s разбивать строки только на символах пробела (--space)

cat /var/log/syslog | head -n 5 выводит первые 5 строк файла

cat /var/log/syslog | tail -n 5 просмотр последних 5 строк файла
tail -f /var/log/syslog просмотр содержимого файла в реальном времени

apt install multitail
multitail -f /var/log/auth.log -f /var/log/kern.log
multitail -l "journalctl -fu ssh" -l "journalctl -fu cron"

less /var/log/dmesg вывести лог ядра с возможностью пролистывания

watch df -h выводит на экран и обновляет состояния подключенных устройств каждые 2 секунды

echo "line1" | tee test.txt перезаписать файл (>)
ls > /dev/null перенаправить вывод в null
echo "line2" | tee -a test.txt добавить (>>) текст новой стройокй в конец файла
echo -e "line3\nline4" >> test.txt добавить две новые строки

du -a /var/log | awk '{print $2}' | xargs fincore передать вывод первой команды построчно в аргументы следующей

split -l 100 input_file.txt output_prefix разделить файл на части по 100 строк в каждой
split -b 10M input_file.txt output_prefix разделить файл на части по указанному размеру (например, 10MB)

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

find

find / -name "*.sql" найти файлы, начать поиск с корня (/)
find / -iname "mysql" найти файлы не учитывая регистр (-i)
find ~ -name "test.*" -not -name "*.conf" найти все файлы с наименование test, которые имеют любое расширение, за исключением (-not) расширения .conf
find ~ -amin -10 поиск файлов по дате последнего чтения (-amin) которые просматривались (cat/nano) за последние 10 минут
find ~ -type f -mmin -10 найти файлы (-type f), которые были модифицированны за последние 10 минут (-nmin)
find ~ -type f -mtime +1 -mtime -7 найти все файлы, модифицированные между 1 и 7 днями назад
find ~ -type d -mtime +1 -mtime -7 поиск директорий
find ~ -size +50M -size -100M поиск файлов в Linux по их размеру, от 50 до 100 мегабайт
find / -perm 444 поиск файлов по режиму доступа (только чтение для всех)
find /home/lifailon/ -user root поиск файлов по владельцу
find /home/lifailon/ -group root поиск по группе
find /root/ -empty поиск пустых файлов или директорий

Утилита find и опция exec

touch -t 202306222200.15 /tmp/test.txt создать файл с указанной датой создания
find /tmp -type f -mtime +30 -exec rm -f {} \; удалить все файлы, котоыре не изменялись больше 30 дней
find /tmp -type f -name "*.txt" -exec rm -f {} \; удалить все текстовые файлы в директории tmp
dd if=/dev/zero of=/var/log/test.log count=11 bs=1M создать файл заполненный нулями указанного размера
find /var/log -type f -name "*.log" -size +10M -exec rm -f {} \; удалить все лог-файлы, объёмом больше 10 Мбайт

Поиск через locate

apt install plocate
updatedb обновить индексы базы данных
locate .torrent найти по частичному совпадению в имени или расширению
locate .torrent -c отображает количество найденных результатов
locate -n 10 .torrent вывести 10 результатов
locate -i Kinozal-Bot игнорировать регистр
locate -r "\.log$" использовать регулярные выражения

sudo curl -s https://github.com/pr4k/locate/releases/download/v0.1.1/locate-linux -o /usr/bin/locate -o /usr/bin/locate

sudo chmod +x /usr/bin/locate

locate-linux -p /home/lifailon/ -q /qbittorrent
locate-linux -p /home/lifailon/.bash_history -q /qbittorrent

dmesg

dmesg -Tx прочитать логи буфера сообщений ядра (/var/log/dmesg), используется для записи во время загрузки системы пока сервис Syslog ещё не запущен
dmesg -Tx -l crit,err отфильтровать вывод
dmesg -E включить логирвоание ядра в консоль (--console-on)
dmesg -D отключить (--console-off)
dmesg -n 1 изменить уровень логирования для печати в консоль
dmesg -u отображать вывод из программ окружения пользователя
dmesg -w выводить журнал в реальном времени (ждать новых сообщений)

hardware

systemd-analyze отображает статистику времени загрузки ОС (Kernel - время загрузки ядра) и userspace
systemd-analyze blame отобразить все процессы и отсортировать по времени загрузки
systemd-analyze blame | grep zabbix
systemd-analyze plot > graph.svg создать векторный отчет в формате Scalable Vector Graphics описанный XML

history история команд
history -c очистить историю

who -b время последнего включения
last история авторизации
last -n 5 reboot история перезагрузки
last shutdown история выключений

arch архитектура системы
lsb_release -a версия дистрибутива
uname -srv версия ядра
cat /proc/version версия ядра и дистрибутива
cat /etc/os-release описание дистрибутива и версия ОС
hostnamectl подробная информация (Operating System, Kernel, Architecture, Hardware Vendor/Model)

uptime время работы системы, кол-во залогиненных пользователей, Load average - средняя загрузка системы за последние 1, 5 и 15 минут (2.00 - это 100% на два ядра)
dmidecode -t bios информация о системе (system/baseboard/processor/memory)
dmidecode -s bios-vendor информация о системе (bios-version/bios-release-date/baseboard-manufacturer/system-manufacturer/processor-version)
dmidecode -t baseboard версия материнской платы, Video и Sound и их статус

nproc кол-во ядер
lscpu информация о процессоре
cat /proc/cpuinfo информация о процессоре
cat /proc/cpuinfo | grep "core id" | wc -l количество уникальных ядер (без учета потоков)
cat /proc/partitions перечисляет все устройства хранения и разделы на этих устройствах хранения
cat /proc/asound/cards Audio PCI
cat /proc/cmdline содержит имя файла образа ядра и его параметры запуска, которые были указаны в приглашении загрузчика GRUB (позволяет идентифицировать параметры загрузки, которые были введены вручную)
cat /etc/default/grub содержит конфигурацию, которую использует команда update-grub для создания файла /boot/grub/grub.cfg
cat /boot/grub/grub.cfg команда update-grub генерирует этот файл автоматически в соответствии с настройками, заданными в файле /etc/default/grub
cat /proc/loadavg среднее количество процессов или потоков, которые выполняются, находятся в очереди на выполнение или ждут завершения операций ввода/вывода за последние 1, 5 и 15 минут. 4-е значение, это количество процессов выполняемых в данный момент/общее количество процессов в системе. Последнее значение, это PID последнего созданного процесса.

lspci информация о устройствах, подключенные к материнской плате компьютера по шине PCIe
lspci | grep -i vga узнать какая используется видеокарта (VGA controller)
lspci | grep -i audio Audio controller
lspci | grep -i ethernet Ethernet controller
lspci | grep -i scsi SCSI storage controller
lspci | grep -i sata SATA storage controller
lspci | grep "USB controller"
lspci | grep 02:00.0 фильтровать информацию по слоту устройства
lspci -vv | grep -iE "driver" отобразить список загруженных драйверов ядра для устройств
lsusb -vt информация о USB устойствах (принтеры, Bluetooth адаптер, мышка, клавиатура)

lshw -short информацию по каждому устройству
lshw -class bus Motherboard/USB
lshw -class display VGA controller
lshw -class network
lshw -class disk информация о жестком диске (product, vendor, size, capabilities: 7200rpm)
lshw | grep product

ls /sys/class/net список сетевых интерфейсов
cat /proc/net/dev список сетевых интерфейсов и их статистика (bytes, packets, errs, drop) для Receive (Прием) и Transmit (Передача)
ethtool -S ens33 статистика сетевого интерфейса (для сброса статистики нужно ip down и выгрузить модуль ядра с драйверов modprobe -r module и вернуть обратно)
ethtool ens33 | grep -Ei "wake-on|speed" поддержка Wake-on-Lan и скорость сетевого интерфейса
ethtool -i ens33 драйвер сетевой карты
ethtool ens33 -p 100 включить светодиод на сетевой карте на 100 секунд

cat /sys/block/sda/stat статистика диска sda
lsmod список всех загруженных модулей ядра вместе с зависимостями
/proc/modules содержится список всех загруженных модулей ядра
modinfo ip_tables информация о конкретном модуле
ls /etc/*modprobe* содержит конфигурационные файлы со списками модулей ядра
cat /etc/modprobe.d/mdadm.conf \ /etc/modules-load.d/` директория, которая содержит файлы со списками модулей, которые должны быть загружены при запуске системы

ls -l /var/lib/apt/periodic/update-success-stamp дата последнего выполнения apt update
ls -l /var/cache/apt/pkgcache.bin местоположение кэша пакетов apt
HISTTIMEFORMAT="%d/%m/%y %T " history | grep "apt update" история команды обновления с точкой времени

cat /etc/hostname имя хоста
cat /etc/services | grep -iE "ntp|zabbix" список всех сервисов и сопоставленных им портов в системе
cat /etc/mime.types | grep -Ew "json|csv" список сопосталвения файлов и их программ для открытия в системе

cat /etc/hosts локальная таблица преобразовани ip в имя
cat /etc/hosts.allow && cat /etc/hosts.deny ограничить доступ к внешним сервисам
cat /etc/hosts.{allow,deny} | grep -Pv "^$|^#"
echo "in.telnetd: 192.168.3., .domain.ru" >> /etc/hosts.allow разрешить соединение только для указанной подсети и домена

ls -l /dev | grep sd вывести список всех дисков и разделов в файловой системе
ls -l /dev | grep -wo sd. вывести только список дисков
cat /proc/diskstats статистика дисков
cat /proc/stat cpu user/nice/system/idle/iowait/irq/softirq/steal_time, ctxt - общее количество переключений контекста на всех процессорах, btime - время загрузки системы в секундах с начала эпохи unix, processes - указывается количество созданных процессов и потоков, включая (но не ограничиваясь ими) те, которые созданы вызовами системных вызовов fork() и clone(), procs_blocked - количество процессов, заблокированных в данный момент и ожидающих завершения ввода-вывода
stat -f /dev/sda
cat /proc/buddyinfo информация о фрагментации памяти в ядре Linux, спользуется для диагностики проблем с фрагментацией памяти
cat /proc/cgroups система контейнеризации и управления ресурсами доступными для процессов cgroups, позволяет ограничить доступ к любым ресурсам для процесса, а также контролировать его поведение в системе


Контроль ядра и системы через утилиту sysctl

sysctl -a отобразить все параметры/настройки ядра Linux (Kernel), где представленны все параметры в виде переменных, имена переменных соответствуют пути файла в директории /proc/sys (вместо слеша в переменной используется точка)
sysctl net.ipv6.conf.all
sysctl net.ipv6.conf.all.disable_ipv6=1 отключить протокол IPv6 (> /proc/sys/net/ipv6/conf/ens33/disable_ipv6)
sysctl net.ipv6.conf.ens33.disable_ipv6=1 для интерфейса ens33
sysctl --system обновление информации из файлов/вернуть значения переменных до состояния сохраненного в файлах (удалить временные изменения из sysctl)
sysctl -w net.ipv6.conf.ens33.disable_ipv6=1 сохранить настройку после перезагрузки (-w записать в файл)
sysctl fs.file-nr кол-во открытых файловых дескрипторов в текущий момент, открытые файлы которые сейчас не используются, максимальное количество для открытия
sysctl -a | grep fs.file-max максимальное количество открытых файлов (дескрипторов), которые могут быть открыты в файловой системе всеми процессами на уровне ядра ОС
nano /proc/sys/fs/file-max изменить значение кол-ва дескрипторов
echo "fs.file-max=500000" >> /etc/sysctl.conf добавить в конфигурацию sysctl.conf
sysctl -p применить настройки
sysctl fs.nr_open лимит открытия файлов для каждого процесса отдельно
ls /proc/1/fd/ | wc -l узнать кол-во открытых дескрипторов у процессора с PID 1
sysctl fs.aio-nr количество асинхронных операций ввода и вывода файловой системе в масштабе всей системы (Asynchronous IO number requests)
sysctl fs.aio-max-nr максимальное количество асинхронных операций ввода-вывода, рекомендуемое минимальное значение для fs.aio-max-nr — 1048576, но в загруженной среде ASE со многими ядрами может потребоваться настроить большее число
sysctl fs.inotify.max_queued_events подсистема ядра inotify позволяет следить за изменениями в файловой системе, устанавливает максимальное количество событий, которые могут находиться в очереди, перед тем как их обработает программа
sysctl fs.inotify.max_user_watches максимальное количество файлов и директорий, за которыми может наблюдать один объект inotify
sysctl fs.inotify.max_user_instances максимальное количество объектов inotify, которые может создать один пользователь
sysctl fs.mqueue.queues_max максимальное количества очередей сообщений POSIX, разрешенных в системе, которые позволяют процессам (и их потокам) обмениваться данными в виде сообщений (создаются и открываются с помощью функции mq_open)
sysctl fs.mqueue.msg_max максимального количества сообщений в значении очереди
sysctl fs.mqueue.msgsize_max максимальный размера сообщения
sysctl vm.min_free_kbytes минимальный размер свободной оперативной памяти который необходимо поддерживать
sysctl vm.swappiness процент свободной памяти, по достижении которого данные начинают переноситься на SWAP раздел
sysctl -w vm.swappiness=80 при 80% свободной памяти (свыше 20% занятой оперативной памяти) начнет использоваться SWAP, в котоый помещяются неиспользуемые процессами страницы памяти на текущий момент, если приложению потребуются эти страницы, процесс их перенесения из раздела подкачки обратно в оперативную память (данные нужно обратно считать с диска в память)
sysctl -w vm.swappiness=10 файл подкачки (выгрузка в виртуальную память) активируется только в том случае, если свободно 10% оперативной памяти
sysctl vm.vfs_cache_pressure скорость удаления dentry и inode из кэша (100 по умолчанию)
sysctl vm.dirty_background_ratio процент от общей оперативной памяти который может быть заполнен страничным кэшем, по достижении которой демон pdflush (dirty page flush) начинает сбрасывать данные из кэша оперативной памяти на диск. Когда объем свободной памяти становится меньше этого порога, ядро вызывает функцию wakeup_bdflush() для перевода в состояние выполнения потока pdflush, который выполняет функцию обратной записи измененных страниц памяти background_writeout() на диск, эта функция получает один параметр количества страниц, которые функция должна попытаться записать на диск.
sysctl -w vm.dirty_background_ratio=5
sysctl vm.dirty_ratio вернхний предел объема оперативной памяти в процентах от free Available который может быть выделен под PageCache до их записи на диск, на этом уровне все новые операции ввода-вывода приостанавливаются до тех пор, пока на диск не будут записаны грязные (Dirty) страницы, значение должно быть выше чем dirty_background_ratio
sysctl vm.dirty_expire_centisecs время хранения грязных (Dirty) страниц в кэше в сотых долях секунд (3000 = 30 секунд) для их записи на диск с целью. Функция wb_kupdate() демона pdflush выполняет обратную запись данных на диск, которые были изменены более чем dirty_expire_centisecs для синхронизации страничного кэша с данными на диске, т.к. при сбое, т.к. содержимое памяти после перегрузки не сохраняется.
sysctl vm.dirty_writeback_centisecs интервал процесса проверки данных, которые подлежат записи на диск (500 - 5 секунд)
sysctl abi.vsyscall32 разрешает выполнение 32 битных программ в 64 битной системе (по умолчанию 1 - разрешает)
sysctl kernel.hostname изменить имя компьютера без перезагрузки
sysctl kernel.printk уровень логирования
sysctl -w kernel.printk="2 4 1 7"
sysctl net.ipv4.ip_default_ttl значение по-умолчанию для величины Time To Live исходящих пакетов (продолжительность жизни пакета в Internet - каждый раз, когда пакет попадает на очередной роутер, брандмауэр и т.п. величина TTL пакета уменьшается на 1)
sysctl net.ipv4.ip_no_pmtu_disc запрещает поиск Path Maximum Transfer Unit (максимальный размер пакета для выбранного пути, это не MTU), когда система будет пытаться определить максимальный размер пакета, при котором не потребуется выполнять их фрагментацию, для передачи на заданный хост
sysctl net.ipv4.tcp_mem векторная переменная (минимум, режим нагрузки, максимум), которая cодержит общие настройки потребления памяти для протокола TCP, измеряется в страницах (обычно 4Кб), а не байтах. Пока общий размер памяти для целей протокола TCP ниже минимального количества страниц, операционная система ничего не делает с памятью используемой различными TCP сокетами, в режиме нагрузки TCP начинает быстро освобождать память, и последний максимальный - объем памяти, который может использоваться для нужд TCP и при его достижении, начинаются потери пакетов.
sysctl net.ipv4.tcp_rmem векторная величина размера буфера сокетов TCP для приема. Каждый сокет TCP имеет право использовать минимальную память по факту своего создания (по умолчанию – 4096 байт, 4 Кб) и его не стоит увеличивать, т.к. при высокой нагрузки займут много памяти. Значение по умолчанию применяется взамен параметра rmem_default (который используется другими протоколами), второй параметр - по умолчанию имеет удвоенное значение, 87380 * 2 bytes, или 174760 байт (170 Кб). Максимально возможный размер приемного буфера, это значение не отменяет максимума, заданного в rmem_max
sysctl net.ipv4.tcp_wmem векторная величина размера буфера сокетов TCP для передачи
sysctl net.core.rmem_default значение по умолчанию (имеет ниже приоритет, чем tcp_rmem)
sysctl net.core.wmem_default значение по умолчанию
sysctl net.core.rmem_max максимальный размер буфера на сокете получения данных в байтах (глобальный параметр, имеет выше приоритет, чем tcp_rmem)
sysctl net.core.wmem_max максимальный размер буфера на сокете передачи данных в байтах
sysctl net.core.optmem_max максимальный объём опциональных буферов памяти
sysctl -w net.core.rmem_max=26214400 && sysctl -w net.core.rmem_default=26214400 увеличить до 25 МБайт
sysctl -w net.core.wmem_max=26214400 && sysctl -w net.core.wmem_default=26214400 увеличить до 25 МБайт
sysctl net.ipv4.tcp_no_metrics_save по умолчанию (0) TCP сохраняет различные метрики соединения в кэше маршрута при закрытии соединения, при включении (1) TCP не будет кэшировать метрики при закрытии соединений
sysctl net.ipv4.icmp_echo_ignore_all если включено, ядро будет игнорировать все icmp запросы (рекомендуется для защиты от DOS атак)
sysctl net.ipv4.icmp_echo_ignore_broadcasts игнорировать запросы ICMP ECHO, переданные широковещательными пакетами
sysctl net.ipv4.icmp_ignore_bogus_error_responses игнорировать ошибочные ICMP запросы
sysctl net.ipv4.conf.all.accept_source_route разрешать маршрутизацию от источников, при включении, позволяет отправителю определить путь, по которому пакет должен пройти по сети Internet, чтобы достигнуть пункта назначения. Это удобно для изучения и отладки работы сети, но нарушитель получает возможность подмены адресов компьютеров локальной сети и может попытаться подсунуть поддельные маршруты для того, чтобы перенаправить весть трафик через узел, который он контролирует (атака Man In The Middle).
sysctl net.ipv4.conf.all.accept_redirects запретить(0)/разрешить(1) принимать и отправлять ICMP пакеты перенаправления
sysctl net.ipv4.conf.all.send_redirects
sysctl net.ipv4.conf.all.secure_redirects
sysctl net.ipv4.ip_forward разрешает (1) или запрещает (0) маршрутизацию пакетов через текущий хост
sysctl net.ipv4.conf.default.forwarding включить форвардинг пакетов - разрешить ядру операционной системы осущетсвлять проброс трафика с одного интерфейса на другой
sysctl net.ipv4.ip_local_port_range диапазон локальных портов, доступных для установки исходящих подключений (создания локальных клиентских сокетов)
sysctl net.ipv4.tcp_max_tw_buckets максимальное число сокетов, находящихся в состоянии TIME-WAIT одновременно, для предотвращения простейших разновидностей DoS-атак
sysctl net.ipv4.tcp_tw_recycle разрешает/запрещает быструю утилизацию сокетов, находящихся в состоянии TIME-WAIT
sysctl net.ipv4.tcp_tw_reuse позволять повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным
sysctl net.ipv4.tcp_rfc1337 защита от TIME-WAIT атак
sysctl net.ipv4.tcp_max_orphans максимальное число "осиротевших" TCP сокетов, не связанных каким-либо идентификатором пользовательского файла (user file handle), при достижение этого значения, соединения сбрасываются. Этот порог помогает предотвращать простые атаки DoS и увеличение параметра влияет на ОЗУ, каждое orphan-соединение поглощает около 64 Кбайт не сбрасываемой на диск (unswappable) памяти и не может быть сброшена в SWAP. При возникновении проблем, связанных с этим ограничением – в системный журнал будет подобное сообщение: TCP: too many of orphaned sockets, и это может служить поводом пересмотреть значения tcp_fin_timeout или tcp_orphan_retries.
sysctl -w net.ipv4.tcp_max_orphans=65536
sysctl net.ipv4.tcp_orphan_retries число попыток закрыть соединение перед тем как оно будет разорвано принудительно и уничтожается TCP соединение, закрытое на локальной стороне сервера. По умолчанию используется значение 7, соответствующее приблизительно периоду от 50 секунд до 16 минут в зависимости от RTO (Retransmission Timeout).
sysctl net.ipv4.tcp_fin_timeout задает максимальное время пребывания сокета в состоянии FIN-WAIT-2 и используется если другая сторона не закрыла соединение со своей стороны. Каждый сокет занимает в памяти 1.5 Кб, что может привести к значительным утечкам памяти в некоторых случаях.
sysctl net.ipv4.tcp_syncookies помогает защититься от атак SYN flood, срабатывает только при достижении значения net.ipv4.tcp_max_syn_backlog, если количество SYN пакетов забивает всю очередь, включается механизм Syn cookies. SYN cookies вообще не использует очередь SYN, вместо этого ядро отвечает на каждый SYN пакет, как обычно SYN/ACK, но туда будет включено специально сгенерированное число на основе IP адресов и портов источника и получателя, а также времени посылки пакета. Атакующий никогда не получит эти пакеты, а поэтому и не ответит на них. При нормальном соединении, будет послан третий пакет, содержащий число, а сервер проверит был ли это ответ на SYN cookie и, если да, то разрешит соединение даже в том случае, если в очереди SYN нет соответствующей записи.
sysctl net.ipv4.tcp_fastopen помогает уменьшить задержки в сети, позволяя начать передачу данных сразу при отправке клиентом первого TCP SYN (3 - включает для входящих и исходящих)
sysctl net.ipv4.tcp_max_syn_backlog размер очереди (максимальное число) запоминаемых запросов на попытку установки TCP соединений (SYN-пакета в состоянии Waiting Acknowledgment) при отправки клиентом TCP SYN пакета, для которых не было получено сервером подтверждения от клиента (полуоткрытых соединений)
sysctl -w net.ipv4.tcp_max_syn_backlog=4096 увеличить, если на сервере возникают перегрузки
sysctl net.core.somaxconn размер очереди (максимальное число) полуоткрытых соединений (открытых сокетов) ожидающих установки соединения. Если в ответ на SYN-пакета (synchronize) клиентом был получен от сервера пакет SYN-ACK (acknowledges), сервер ожидает от клиента отправки ACK пакета, после чего соединение считается установленным.
sysctl net.ipv4.tcp_syn_retries количество попыток передачи SYN-пакета при установлении нового соединения, на каждую попытку отводится примерно 30-40 секунд. Значение по-умолчанию 5 = 180 секундам.
sysctl net.ipv4.tcp_synack_retries количество попыток передачи SYN-ACK-пакета в ответ на SYN-запрос для установки пассивного TCP-соединение, инициированное другим хостом, если уменьшить до одного, будет примерно 9 секунд
sysctl net.core.netdev_max_backlog регулирует размер очереди пакетов между сетевой картой и ядром, если ядро не успевает обрабатывать пакеты (если сетевой интерфейс получает пакеты быстрее, чем ядро может их обработать) и очередь переполняется, то новые пакеты отбрасываются, если увеличить значение, можно справиться с пиковыми нагрузками
sysctl -a | grep net.ipv4.tcp_keepalive после неактивности сокета посылает пакет keepalive на второую сторону, содержащий нулевые данные, после отправки первого пакета через время, указанное в tcp_keepalive_time отправляет повторно пакеты через каждые tcp_keepalive_intvl секунд tcp_keepalive_probes раз, если другая сторона не отвечает, сокет автоматически закрывается
tcp_keepalive=$(sysctl -a | grep net.ipv4.tcp_keepalive | grep -Po "(?<=\=\s)[0-9]+") забрать массив значений
echo $tcp_keepalive | awk '{print $3+($1*$2)}' 7200+(75*7)
sysctl net.ipv4.conf.all.rp_filter 1 - строгий режим проверки и 2 - свободный режим проверки, включает фильтр обратного пути (reverse path filter) или защита от подмены адресов (спуфинга), все что поступает на сервер, проходит проверку на соответствие исходящего адреса с таблицей маршрутизации и такая проверка считается успешной, если принятый пакет предполагает передачу ответа через тот же самый интерфейс. Например, когда входящий трафик идет через один маршрутизатор, а исходящий через другой, могут теряться пакеты, поскольку обратный маршрут в таблице маршрутизации, задан через другой интерфейс.
sysctl -w net.ipv4.conf.ens33.rp_filter=1 включает строгую проверку на интерфейсе ens33
sysctl net.ipv4.conf.all.log_martians включает/отключает логирование пакетов
sysctl net.ipv4.tcp_window_scaling разрешает/запрещает масштабирование TCP-окна, как определено в RFC 1323. При передаче TCP-пакетов по толстым каналам возникают потери пропускной способности из-за того, что они не загружены полностью во время ожидания подтверждения о приеме предыдущего TCP-окна. Основная проблема состоит в том, что окно не может иметь размер больше, чем 216 байт (65 Кб). Разрешая масштабирование TCP-окна можно увеличить его размер и таким образом уменьшить потери пропускной способности.
sysctl net.ipv4.tcp_retries2
sysctl net.ipv4.tcp_abort_on_overflow заставляет ядро отвергать новые соединения, если их поступаемое количество выше, с чем система в состоянии справиться
sysctl net.ipv4.ip_nonlocal_bind позволяет отдельным локальным процессам выступать от имени внешнего (чужого) IP адреса, может потребоваться, когда необходимо прослушивать внешние IP адреса, например, сниффинг чужого траффика
net.ipv4.ipfrag_low_thresh максимальный объем памяти, выделяемый под очередь фрагментированных пакетов в диапазоне от 0 до 2147483647, когда длина очереди достигает этого порога, то обработчик фрагментов будет отвергать все фрагментированные пакеты и после уменьшения очереди они должны быть повторно переданы узлом-отправителем.
sysctl net.ipv4.netfilter.ip_conntrack_max максимальное количество соединений для работы механизма connection tracking (используется в iptables)

ssh

w отобразить активные сессии и их активность (время/дата входа, IDLE время простоя и последняя выполняемая команда)
who отобразить активные сессии, время/дата входа и ip с которого подключен пользователь
last -a история всех последних входов пользователей в систему
lastlog дата последнего входа каждого пользователя в систему
last reboot история перезагрузки
id -G получить список id крупп в которых состоит текущий пользователь

apt install xclip xsel буфер обмена
cat /etc/ssh/sshd_config | xclip
xsel > sshd_config.bak
nano /etc/ssh/sshd_config
Port 2121 изменить порт
PermitRootLogin yes включить возможность подключения пользователем root
PasswordAuthentication no отключить аудентификацию по паролю
X11Forwarding yes включить X11
TCPKeepAlive yes отвечает за проверку активности соединения (отправка пустых keep-alive пакетов для сохранения соединения)
ClientAliveInterval 60 задать интервал ожидания в секундах, через который sshd запросит ответ от клиента
ClientAliveCountMax 3 количество запросов без ответа до завешрения сеанса (ClientAliveInterval * ClientAliveCountMax = 180 секунд)
systemctl restart sshd
systemctl status sshd

keygen

ssh-keygen -t rsa -b 4096 сгенерировать пару ключей
id_rsa приватный/закрытый ключ хранится на клиенте, от кого происходит подключение (для подключения без пароля имя файла должно быть по умолчанию)
cat ~/.ssh/id_rsa.pub | xclip публичный/открытый ключ, для передачи на сервер, куда будем подключаться3
xsel > ~/.ssh/authorized_keys передать содержимое публичного ключа (id_rsa.pub) на сервер, куда подключаться

x11

apt-get install virt-manager ssh-askpass
virt-manager
export DISPLAY=username-VirtualBox:10.0 && firefox

scp

ssh-copy-id root@192.168.3.105 -p 2121 скопировать публичный ключ на удаленный сервер (добавить новой строкой), утилита будет искать в директории текущего локального пользователя файл публичного ключа и скопирует содержимое файла ключа ~/.ssh/id_rsa.pub указанному при подключение пользователю на удаленный компьютер в файл authorized_keys
scp -P 2121 /home/lifailon/files/* lifailon@192.168.3.105:/home/lifailon/downaload/ скопировать содержимое каталога files на удаленный компьютер в директорию downaload
scp -P 2121 -r kup@192.168.3.105:/home/lifailon/downaload /home/lifailon/files/ скачать (-r) данные с удаленного сервера на локальный

sshpass

hosts=(192.168.3.101 192.168.3.102 192.168.3.103 192.168.3.104)

username="lifailon"

port=2121

read -s -p "Введите пароль пользователя $username: " password

echo

for host in ${hosts[@]}; do

sshpass -p $password ssh -p $port $username@$host "echo $(uname -n) $(free -m | grep Mem: | awk '{print $3"/"$2}')"

done

sudoers

cat /etc/sudoers конфигурационный файл настройки прав доступа утилиты sudo
visudo открыть sudoers в режиме проверки синтаксиса
Defaults env_reset, timestamp_timeout=10 задать ограничение времени для sudo на 10 минут
echo "lifailon ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/lifailon создать конфигурацию пользователя для использования sudo без пароля
chmod 644 /etc/sudoers.d/lifailon
lifailon ALL=NOPASSWD: /usr/bin/service memcahched restart, /usr/bin/apt-get update, /usr/bin/apt-get upgrade разрешить перезапуск определенного сервиса, обновление списка пакетов и установку обновлений системы
%powerusers ALL=NOPASSWD: /usr/bin/service memcahched restart доступ на группу
visudo --check проверка синтаксиса и всех прав доступа (0440)
sudo -l проверка прав доступа (выводит список команд, которые текущий пользователь может выполнять с использованием sudo)

strace

strace -c top -n 1 > /dev/null показывает статистику системных вызовов программы (time - процент от времени общего выполнения, call - кол-во обращений и ошибки)
pid=$(pidof dd) узнать pid процесса по имени
strace -p $pid показывает системные вызовы процесса (читает данные из одного места с помощью вызова read и записывает в другое через write)
strace -f -p $(pgrep -o sshd) -o ~/passwd.txt -v -e trace=write -s 64 следим за всеми процессами sshd (-f), ищем все PID sshd процессов (-p), триггер только на запись данных (-e) и ограничиваем вывод 64 байтами
cat ~/passwd.txt | grep "[1-32][1-32]) = [1-32][1-32]"

apt

apt-mark showauto список установленных автоматически пакетов
apt-mark showmanual список установленных пакетов вручную
echo $(($(apt-mark showauto | wc -l) + $(apt-mark showmanual | wc -l))) количество всех установленных пакетов
apt list --installed список установленных пакетов apt (Advanced Package Tool)
apt update обновить список всех установленных пакетов системы из источников, указанных в файле конфигурации /etc/apt/sources.list
cat /etc/apt/sources.list | grep -Ev "^#" список источников
apt list --upgradable отобразить список, для каких пакетов доступны обновления
apt list --upgradable -a upgradable from, installed и все доступные версии
apt install --only-upgrade powershell обновить один выбранный пакет
apt --fix-broken install исправить проблемы и ошибки с зависимостями
apt full-upgrade обновляет все пакеты, которые уже установлены в системе, доставляет новые пакеты зависимости и удаляет пакеты, которые устанавливались в систему и уже не используются
apt install net-tools установить пакет
apt download net-tools скачать пакет без установки
apt install net-tools --reinstall переустановить пакет
apt remove net-tools удалить пакет (конфигурационные файлы, которые были изменены в системе удалены не будут)
apt purge net-tools полностью удалить пакет, вместе со всеми его конфигурационными файлами
apt policy net-tools какая версия установленна и какие доступны
apt install net-tools=number ver. установить конкретную версию
apt autoremove очистить ненужные пакеты, которые система не использует
apt autoclean очистить кэш пакетов

dpkg

dpkg -i spark.deb установить пакет
dpkg -l список установленных deb-пакетов
dpkg -l | wc -l количество установленных пакетов
dpkg -l spark проверить, установлен ли пакет в системе и его версию
dpkg -s spark проверить статус пакета
dpkg -r spark удалить (--remove) .deb пакет
dpkg -P spark удалить пакет вместе с фаилами конфигурации
dpkg -L spark куда установлен пакет (opt/Spark)

ntp

time

timedatectl текущее время
timedatectl set-timezone 'Europe/Moscow' изменить временную зону на MSK, +0300 (изменится Local time)
timedatectl list-timezones список часовых поясов
timedatectl set-ntp no отключить NTP service
timedatectl set-time "13:00:00" после отключения NTP указать время в ручную
timedatectl set-ntp yes включить NTP service (NTP service: active)

language

locale установленные в системе локализации
update-locale LANG=en_US.UTF-8 изменить локализацию
apt-get install language-pack-en language-pack-en-base установить пакет локализаций
nano /etc/default/locale
LANG=en_US.UTF-8
dpkg-reconfigure locales

timesyncd

systemctl status systemd-timesyncd
systemctl status systemd-timesyncd | grep "Status": | sed -E "s/^.+server //; "s/.\"//"" узнать адрес сервера синхронизации времени
apt install systemd-timesyncd установить службу, если unit не запускается
apt-get remove ntp ntpstat --purge && apt autoremove удалить ntpd (если был установлен)
nano /etc/systemd/timesyncd.conf
NTP=192.168.3.233 DC (Domain Controller)
NTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
FallbackNTP=ntp.ubuntu.com резерв
systemctl restart systemd-timesyncd
timedatectl set-ntp true включить использование systemd-timesyncd для синхронизации времени (вместо ntpd)
timedatectl status

ntpd

apt install ntp установить NTP-сервер/клиент, при установке будет удален пакет systemd-timesyncd
systemctl status ntp
sntp --version
ufw allow 123/udp && ufw reload
timedatectl set-ntp false отключить синхронизацию через systemd-timesyncd на клиенте
nano /etc/ntp.conf
pool 0.ubuntu.pool.ntp.org указать пул серверов
server 0.ru.pool.ntp.org указать на конкретный сервер (если это pool, возьмет один)
restrict default kod notrap nomodify nopeer noquery limited настройки/ограничения для локального NTP сервера
systemctl restart ntp
systemctl status ntp
timedatectl status
ntpq -p проверка синхронизации времени (+ сервер можно использовать для сверки часов, * синхронизирует сейчас, - не рекомандован, st - уровень stratum, when — когда последний раз сверялось время, delay - время задержки, offset - разница между локальным временем и временем на сервере - отстают от сервера или спешат)

kill

kill -INT (-2) PID прерывания с терминала, bash пошлёт сигнал SIGINT процессу (аналогично CTRL+C)
kill -KILL (-9) PID принудительно завершить процесс
kill -STOP (-19) PID остановить процесс, bash пошлёт сигнал SIGSTOP процессу (аналогично CTRL+Z)
kill -CONT (-18) PID продолжить остановленный процесс

procs

snap install procs современная замена ps, написанная на Rust (https://github.com/dalance/procs )
procs

jobs

(ping google.com) & запустить задачу в фоне (отображается [job] - номер задачи и PID процесса)
jobs отобразить список фоновых задач (+ задача активна)
jobs -l | wc -l получить список всех запущенных заданий
fg 1 открыть задачу по номеру
disown завершить все фоновые задачи (удалить/очистить всю очередь заданий)
disown %1 завершить последнию (если она первая) запущенную задачу
kill %1 завершить последнию запущенную задачу

nohub

nohup ping ya.ru > ping.log & используется для запуска процесса, который продолжает работать, даже если пользователь выйдет из сеанса (например, при закрытии терминала)
ps -ef | grep "ping ya.ru" найти процесс
kill $(pgrep ping) завершить процесс

mem

free -m объем оперативной памяти и SWAP в МБайт
swapon точка монтирования SWAP, type, size, used, priority (берет информацию из /proc/swaps)
ipcs -lm объем страниц разделяемой памяти (shared memory)
cat /proc/meminfo | grep Dirty отобразить объем грязных (Dirty) страниц в кэше (еще не записанных на диск)
sync записать все кэшированные, но еще не записанные данные на диск (вместо кэша данные будут читаться из диска)
cat /proc/meminfo | grep -iE "^cache|^buff" объем кэша и буфера
echo 1 > /proc/sys/vm/drop_caches отправить сигнал на вход drop_caches для очистки страничного кэша (free buff/cache) - PageCache (сигнал 1)
echo 2 > /proc/sys/vm/drop_caches очистка кэша структуры файловой системы - inode, dentrie (сигнал 2)

lsof

PID идентификационный номер процесса, который открыл файл
TID идентификационный номер задачи/потока, пустой столбец означает, что это не задача а процесс
FD файловый дескриптор файла (r - доступ для чтения, w - доступ для записи, u - доступ для чтения и записи, -r - режим неизвестен и есть символ блокировки на чтение часть файла, R - на весь файл)
TYPE тип узла, связанного с файлом (REG - обычный файл файловой системы, DIR - директория, CHR - символьный файл, BLK - блочный файл, INET - Интернет-сокет, unix - доменный сокет UNIX, IPv4 - IPv4 сокет, sock - неизвестный сокет, DEL - указатель Linux для удалённого файла, LINK - файл символьной ссылки, PIPE: — способ обмена данными между процессами)
SIZE/OFF размер файла или смещение файла в байтах
lsof | sed 1d | wc -l кол-во открытых файлов/дескрипторов
cat /proc/sys/fs/file-nr кол-во открытых файловых дескрипторов в текущий момент, открытые файлы которые сейчас не используются, максимальное количество для открытия
lsof +D /var/log/ отобразить каким процессом и пользователем используются файлы в каталоге (+D dir) FD: r/w/u
dd if=/dev/zero of=~/dd-zero-file занять файл процессом dd и Ctrl+Z остановить процесс (отправить в jobs)
ls -lh ~/dd*
lsof ~/dd-zero-file отобразить каким процессом занят файл (List Open Files)
lsof -c dd отобразить все файлы запущенные по имени процесса/команды (в формате wildcard)
lsof -p 1832509 отобразить все открытые файлы по номеру PID-процесса (-p)
lsof -c mysql отобразить все файлы которые держит открытыми процесс по названию процесса (-c)
lsof -c bash | grep "\.sh" найти все запущенные скрипты
kill -9 $(lsof -t ~/dd-zero-file) отфильтровать для вывода уникальных номеров PID-процесса (-t) использующие файл, для их завершения (kill)
kill -9 $(lsof -t +D /smb/backup) убить все процессы использующие файлы в директории для дальнейшего umount /smb/backup
lsof -u root отобразить все файлы открытые пользователем
lsof -u^root | wc -l исключить пользователя (^) из поиска и отобразить кол-во открытых файлов
lsof -i:8080 проверить открыт ли порт (-i:)

descriptor

lsof -a -p $$ -d 0,1,2 отобразить дескрипторы текущего интерпритатора ps $$
0u STDIN — стандартный поток ввода (с клавиатуры)
1u STDOUT — стандартный поток вывода (на экран/в файл)
2u STDERR — стандартный поток ошибок
cat test.txt 1> out.txt 2> error.txt перенаправить успешный вывод (если файл существует) в out.txt, если ошибка в error.txt
cat test2.txt 2> /dev/null не выводить ошибки
cat=$(cat test 2>&1) используется для перенаправления стандартного вывода ошибок (stderr - standard error) в стандартный вывод (stdout - standard output) с указанием файлового дескриптора (&) вместо файла

iostat

iostat -h выводить данные в kb/mb/gb (avg-cpu: %user %system %idle, tps - количество запросов на чтение и запись к устройству в секунду)
iostat -hp вывести статистику по устройству и всех его разделам (-p)
iostat -ky /dev/sd* 1 1 | grep -w sd. выводить статистику в КБайт (-k), при отображении нескольких записей с заданным интервалом первый отчет со статистикой с момента загрузки системы опускается (-y)
iostat -h /dev/sda3 -o JSON вывод в формате JSON

mpstat

mpstat отобразить подробную статистику по использованию процессора по каждому ядру, и куда используются ресурсы
mpstat -P ALL отобразить отдельно для каждого ядра.
mpstat 2 10 отобразить 10 раз с обновлением каждые 2 секунды
%user процент использования процессора программами, запущенными на уровне пользователя
%nice процент использования процессора программами запущенными в пространстве пользователя, с изменённым приоритетом
%system процент использования процессора ядром
%iowait процент времени затраченного на ожидание завершения операций ввода/вывода, если значение параметра слишком большое, значит много времени тратится на ожидание завершения ввода/вывода
%steal процент простоя виртуального процессора, пока гипервизор отдаёт мощность другому виртуальному процессору
%idle процент времени пока процессор не занят ничем

pidstat

pidstat используется для мониторинга родительских и дочерних процессов и текущих потоков
pidstat -p ALL вывести все активные и неактивные задачи

stress

stress --cpu 2 --timeout 10 загрузить выбранное количество ядер в течении 10 секунд
stress -v N нагрузить виртуальную память
stress --io 100 & количество процессов нагрузки на ввод-вывод
iostat -d /dev/sda 1
stress --hdd 100 & нагрузка на диск
vmstat 1 100

stress-ng

apt-get install stress-ng
stress-ng --sequential 0 --class io --timeout 60s --metrics-brie тест ввода вывода
stress-ng --hdd 5 --hdd-ops 100000 будет запущено 5 стрессоров для жёстких дисков, которые будут остановлены по завершении 100 тыс. bogo-операций
stress-ng --cpu 1 --cpu-method matrixprod --metrics --timeout 60
stress-ng --sequential 0 --class memory --timeout 60s --metrics-brief
stress-ng --cpu 2 --io 4 --vm 1 --vm-bytes 1G --timeout 60s --metrics-brief

smart

smartmontools

apt install smartmontools
smartctl -a /dev/sda тест диска и информация о модели и температуре
smartctl -H /dev/sda SMART Health Status

sensors

apt install lm-sensors
sensors-detect сканировать датчики температуры
sensors отобразить датчики

badblocks

badblocks -s /dev/sda тест на наличие нечитаемых/битых блоков/секторов на диске

hdparm

hdparm -I /dev/sda | grep -i model модель жесткого диска (Model Number, Serial Number, Firmware Revision)
hdparm -v /dev/sda кол-во секторов и настройки
hdparm -tT /dev/sda тест скорости работы без кэша (-t) и с кэшем (-T)
hdparm -D /dev/sda включение/отключение управления дефектами дисков
hdparm -r /dev/sda включает режим read only для диска
hdparm -A /dev/sda включает режим read-look-ahead, когда диск просматривается перед чтением, включена по умолчанию
hdparm -a /dev/sda включает режим read-ahead, когда чтение выполняется в первую очередь, позволяет улучшить производительность чтения больших объемов данных
hdparm -b /dev/sda остановить жесткий диск до следующего к нему обращения
hdparm -S 1 /dev/sda остановить вращение мотора диска до следующего к нему обращения
hdparm -B 120 /dev/sda настройка управления питанием Advanced Power Management (APM), чем ниже значение, тем лучше энергосбережение (255 - для отключения)
hdparm -Z /dev/sda отключает режим энергосбережения
hdparm -M 128 /dev/sda управление уровнем шума (принимает значения от 128 - более тихую работу, до 254 - высокую)

disk

du -sh /home отобразить общий размер указанной директории (-s)
du -Sh /home отобразить общий размер всех дочерних (-S) директорий по пути
du -h /home отображает общий размер указанной директории и подкаталогов внутри директории
du -ah /home отобразить общий размер директории и всех дочерних файлов (-a) и директорий

lsblk отображает список всех подключенных блочных устройств (/dev), их SIZE, TYPE (disk/part/lvm) и точку монтирования (MOUNTPOINTS)
lsblk -e7 вывод без loop
lsblk -f отображает используемую FSTYPE, UUID, FSAVAIL - сколько свободно на диске и FSUSE - сколько занято на диске в процентах
lsblk -o NAME,MODEL,SERIAL,SIZE,STATE --nodeps | grep running отображает модель, размер и статус без структуры разделов/lvm (--nodeps)
lsblk -E NAME исключить дублирование вывода по колонке
lsblk -S вывод информации о SCSI-устройствах (--scsi)
lsblk -b выводить SIZE в байтах (--bytes)
lsblk -J вывод в формате JSON (--json)
lsblk -P использовать формат вывода key="value"
lsblk -m выводить информацию о правах доступа

df -h выводит информацию примонтированных файловых системах. Отображает общий объём (Size), занятого (Used) и свободно (Avail) пространства
df -h -T отобразить Type файловой системы (ext4/cifs)

apt install duf установить duf
duf аналог df

mount | grep /dev/ отобразить все примонтированные файловые системы
mount | grep -P "mapper|lv|vg" примонтированные lvm

findmnt отобразить список смонтированных файловых систем в древовидном формате
findmnt -l в формате списка
findmnt -t ext4

e2label /dev/sda3 узнать метку диска
blkid отобразить список подключённых дисков, их UUID и TYPE
lsscsi отобразить параметры SCSI устройств подключенных к системе

parted

parted -l отобразить список всех разделов на дисках
parted -l | grep -i model
dd if=/dev/zero of=/tmp/disk.img count=1000 bs=1M создать образ диска заполненный нулями размером 1Гб
parted /tmp/disk.img передать parted созданный файл-образ для управления ФС
parted /dev/sdc передать parted диск
mktable gpt создать таблицу разделов GPT
print отобразить тип таблицы (Partition Table: GPT) и список разделов на устройстве, если они были созданы
print free отобразить свободное место и все разделы
mkpart primary ext4 0 500M создать первый, первичный (primary) раздел с ФС ext4 размером 500Мб.
mkpart primary ext4 500 1000M создать второй раздел (начало и конец)
resizepart 2 600M уменьшить 2-й раздел до 100МБ (указывается end-конец)
resizepart 2 100% увеличить до всего свободного размера
rm 2 удалить раздел

fdisk

fdisk -l отображает список всех подключенных устройств построчно с размером секторов для каждого раздела
fdisk -x подробный вывод (узнать UUID разделов)
fdisk -l | grep /dev/sd
fdisk -l | grep -E "/dev/sd.[1-9]"
fdisk -l | grep -E "lv|vg"
fdisk /dev/sdc
m список команд
p отобразить размер диска и список разделов (/dev/sdc1)
n создать новый раздел (p), указать номер раздела - partition number (4-128, default 4), начало и конце сектора - enter (оставить по умолчанию)
i информация о выбранном разделе разделе (начало, конец, общий размер сектора и размер диска)
t задать тип раздела - 30/8E (Linux LVM) или 20/83 (Linux filesystem)
l отобразить список всех типов
w сохранить
q выход
partprobe /dev/sdc информирует ядро ОС об изменениях таблицы разделов, запрашивая у системы, чтобы она перечитала таблицу разделов

sfdisk

sfdisk -d /dev/sdc > sdc.partition.table.txt backup (аналогично dump cfdisk)
sfdisk -f /dev/sdc < sdc.partition.table.txt восстановить

sfdisk -d /dev/sda | sfdisk -f /dev/sdd для восстановления MD RAID1 (sda в sdd)
mdadm --manage /dev/md1 --add /dev/sdd1 восстановление копирования
watch cat /proc/mdstat отображать прогресс синхронизации

  • Новый диск для расширения LVM:

ls /dev/sd* отобразить все диски в файловой системе
fdisk -l отобразить все диски через fdisk
cfdisk /dev/sda разметка диска на разделы (новый вариант)
cfdisk /dev/sdb инициализировать новый диск, выбрать таблицу разделов (gpt)
new - sda4 создать новый раздел sda4 или sdb1
Free space - Partition size: 100G
write - yes
pvcreate /dev/sda4 создать физический виртуальный том из раздела
vgextend ubuntu-vg /dev/sda4 добавить новый раздел в группу
lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv добавить свободное место в группе для логического раздела ubuntu-lv
lsblk
df -h система будет видеть старый объем диска, необходимо выполнить команду по изменению размера файловой системы
df -T -h отобразить тип ФС
resize2fs -f /dev/ubuntu-vg/ubuntu-lv для ext*
btrfs filesystem resize +100g / для btrfs

  • Новый диск для нового раздела:

cfdisk /dev/sdс создать раздел (cfdisk/fdisk/parted)
mkfs.ext4 /dev/sdc1 форматировать раздел
mkdir /mnt/sdc1 && mount /dev/sdc1 /mnt/sdc1 примонтировать раздел, -o -r - монтировать только на чтение (--options --read-only)
df -h && lsblk раздел нового диска должен быть в статусе Mounted on или MOUNTPOINTS
chmod 0777 /mnt/sdc1 разрешить всем пользователям доступ к диску
df -h -T отображает тип файловой системы примонтированных разделов
nano /etc/fstab сохранить монтирование после перезагрузкиы
/dev/sdc1 /mnt/sdc1 ext4 rw,relatime 0 0 добавить по наименованию или UUID устройства
umount /dev/sdc1 отмантировать раздел

swap

fallocate -l 4G /swapfile.img создать файл для swap
dd if=/dev/zero of=/swapfile.img count=1024 bs=1M создать файл для swap
chmod 600 /swapfile.img дать права
mkswap /swapfile.img создать swap-пространство из файла или используя весь объём раздела (mkswap /dev/sda4)
swapon /swapfile.img активировать swap-пространство
echo '/swapfile.img none swap sw 0 0' | sudo tee -a /etc/fstab примонтировать
free -m отобразить объём
swapoff -a отключить
rm /swapfile.img удалить файл

dd

dd if=/dev/sr0 of=/tmp/cd.iso bs=2048 сохранить образ диска (if=источник) в файл (of=назначение) с указанием кол-ва байт для чтения и записи за один раз (2МБайт), по умолчанию используется размер блока - 512 байт (2b блока = 1024 байт, 1k = 1 КБайт/1024 байт, 1kB = 1000 байт, 1M = 1024 КБайт/1 МБайт)
dd if=/dev/mem bs=2048 count=100 вывести содержимое оперативной памяти на экран (не использовать файл)
dd if=/dev/zero of=/tmp/md-01 bs=4M count=256 создать файл заполненный нулями (из /dev/zero) размером 1ГБ с указанием кол-во копируемых блоков (bs*count) или очистить диск
dd if=/dev/random of=/tmp/md-02 bs=4M count=256 создать файл размером 1ГБ заполненный рандомными цифрами
dd if=/dev/sda of=/tmp/mbr.img bs=1b count=1 скопировать в файл первые 512 байт диска содержащие таблицу разделов MBR
dd if=/dev/sda of=/tmp/sda.img создать образ жесткого диска, используетася для полного backup системы (копирование раздела на двоичном уровне,включая таблицу MBR и всю пустую область диска и разделов)

iso

dd if=/dev/sda3 status=progress of=/mnt/disk_b/disk.iso bs=5M создать iso-образ (сохранить образ раздел)
dd if=путь/к/образу.iso of=/dev/sdb1 записать ISO-образ ОС на внешнее устройство
sync завершить запись этой командой (что бы при извлечении не потерять часть данных)
mount -o loop /mnt/disk_b/disk.iso /mnt/iso примонтировать файл образа только для чтения (iso - это директория, которую предварительно нужно создать), подключается как /dev/loop6
umount /mnt/iso отмантировать

rdiff

apt install rdiff-backup на базе rsync с поддержкой инкрементных архивов используя технологию hard link, чтобы вернуться назад на заданный день
rdiff-backup /usr/lifailon/ /backup/test/
rdiff-backup user@hostname::/remote-dir local-dir -v5 --print-statistics по ssh с сервера на локальный бэкап-сервер, в ней же будет находиться директория rdiff-backup-data, которая будет содержать информацию и логи о проводимых бэкапах, а также инкременты, необходимые для отката на любой прошлый выполненный бэкап
rdiff-backup list files --changed-since 5D local-dir отобразить, какие файлы изменились за последние 5 дней
rdiff-backup list files --at 5D local-dir отобразить список файлов, которые присутствовали в архиве 5 дней назад
rdiff-backup restore local-dir/rdiff-backup-data/increments.2023-10-29T21:03:37+03:00.dir /tmp/restore восстановить файлы из инкримента

users

sudo -u www-data выполнить команду от имени другого пользователя
su root войти под пользователем root
sudo su изменить пользователя на root, при этом пользователь остается в той же директории потому, что выполняется ваш .bashrc. А также .profile пользователя root поэтому вы окажетесь в окружении root
sudo -i указывает утилите что нужно переключиться в консоль от имени root, при этом перемещаясь в домашний каталог root, и будет выполнен его .bashrc и .profile
sudo /bin/bash запускает еще одну оболочку bash от имени суперпользователя. Файлы конфигурации не читаются, но выполняется только .bashrc вашего пользователя. Вы не окажетесь в окружении root, а просто останетесь в своем окружении с правами суперпользователя

cat /etc/passwd список/база данных пользователей зарегистрированных в системе
cat /etc/group список групп
cat /etc/shadow | grep -Ev "^.+:\*:" пароли пользователей хранящиеся в зашифрованном виде (заданные с помощью /usr/bin/passwd), если * или ! пользователь не сможет войти в систему с использованием аутентификации по паролю, другие методы входа, как аутентификация на основе ключей или переключение на пользователя разрешены. Синтаксис: логин:пароль:последнее изменения пароля (количество дней исчисляется с 1 января 1970 года):минимальный срок действия пароля:максимальный срок действия:период предупреждения:период бездействия:срок хранения

cat /etc/login.defs | grep -Pv "^$|^#" настройка поведения утилиты управления пользователями и параметрами входа в систему (настройки минимального и максимального id для выдачи новому пользователю/группе, количество попыток входа, таймау, что делать с директорий пользователя при создании или удалении и т.п.)
cat /etc/login.defs | grep "^PASS" максимальное кол-во дней действия пароля (PASS_MAX_DAYS), минимальное количество дней допустимое между сменами пароля (PASS_MIN_DAYS), количество дней предупреждающих об истечении срока действия пароля (PASS_WARN_AGE), ограничения длины паролей (PASS_MIN_LEN/PASS_MAX_LEN), максимальное кол-во попыток входа при вводе неправильного пароля (LOGIN_RETRIES), время на вход (LOGIN_TIMEOUT), включить логирование успешных входов (LOG_OK_LOGINS), логирование неизветных имен для системы пользователей при неудачных попытках входа (LOG_UNKFAIL_ENAB)

passwd

passwd включить учетную запись root и задать ей пароль
passwd username смена пароля пользователя
passwd -l username заблокировать уч. запись
passwd -u username разблокировать уч. запись

chage

chage -l root информация последней смене пароля и срок действия (последняя смена пароля, Срок действия пароля, Пароль неактивен, Срок действия учетной записи, Минимальное количество дней между сменой пароля, Максимальное количество дней между сменой пароля, Количество дней предупреждения до истечения срока действия пароля)
chage -E lifailon установить дату истечения срока действия пользовательской учетной записи (-E)
chage lifailon -M 30 установки минимального (-m) и максимального (-M) срока действия пароля

id

id lifailon узнать ID
uid=1000(lifailon) gid=1000(lifailon) groups=1000(lifailon),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)
usermod -u 1022 kup изменить UID
groupmod -g 1022 kup изменить GID

usermod

usermod -L lifailon заблокировать вход по паролю (перед паролем пользователя в файле /etc/shadow добавляется восклицательный знак)
usermod --expiredate 1 -L lifailon заблокировать пользователя (не будет возможности авторизоваться через su: Authentication failure)
usermod --expiredate 2023-10-25 lifailon задать дату блокировки
usermod --expiredate "" -U lifailon разблокировать пользователя
usermod -g root lifailon изменить основную группу пользователя
usermod -a -G plugdev lifailon добавить пользователя в дополнительную группу (-G), обязательно нужно использовать вместе с -a, чтобы не удалять старые
usermod -d /root lifailon изменить домашнюю директорию пользователя (-d)
usermod -m -d /root lifailon переместить домашнюю папку сохранив все содержимое (-m)
usermod -s /usr/bin/dash lifailon изменить оболочку по умолчанию (-s)
usermod -u 2002 lifailon изменить id пользователя (-u)
usermod -l lifailon failon изменить имя пользователя (-l)
usermod --password "NewPassword" lifailon изменить пароль

profile

nano /etc/bash.bashrc задать timeout для завершения бездейстующих (idle time) SSH и локальных сессий
nano /etc/profile задать на уровне профиля (приоритет ниже)

TMOUT=1440

readonly TMOUT

export TMOUT

useradd

useradd -D отобразить параметры, которые будут применены для пользователя по умолчанию
useradd -o -u 0 -g 0 -s /bin/bash newroot создать нового пользователя с правами root
useradd -G adm,wheel -p password -s /bin/bash test2 разрешить пользователю читать логи и пользоваться sudo

useradd username
-s указать командную оболочку для пользователя (по умолчанию /bin/sh - без оболочки, можно указать /bin/bash)
-b указать базовый каталог для размещения домашнего каталога пользователя (по умолчанию /home)
-d домашний каталог, в котором будут размещаться файлы пользователя
-m создавать домашний каталог пользователя, если он не существует
-c комментарий к учетной записи
-g основная группа пользователя
-G список дополнительных групп
-N не создавать группу с именем пользователя
-p задать пароль пользователя
-l не сохранять информацию о входах пользователя в lastlog и faillog
-o разрешить создание пользователя linux с неуникальным идентификатором UID
-u идентификатор для пользователя

adduser

adduser username интерактивное создание пользователя, по умолчанию будет создан домашний каталог (/home/username), можно указать данные о пользователе или пропустить и задать пароль
deluser username удалить пользователя (каталог не удаляется)

chmod

- --- --- ---

| | | |

тип файла права доступа пользователя (владельца) группы всех остальных


--- нет прав
--x разрешено только выполнение файла, как программы но не изменение и не чтение
-w- разрешена только запись и изменение файла
-wx разрешено изменение и выполнение, в случае с каталогом нельзя посмотреть его содержимое
r-- права только на чтение
r-x только чтение и выполнение, без права на запись
rw- права на чтение и запись, но без выполнения
rwx все права
--s установлен SUID или SGID бит, первый отображается в поле для владельца, второй для группы
--t установлен sticky-bit, значит пользователи не могут удалить этот файл

r чтение
w запись
x выполнение
s выполнение от имени суперпользователя (дополнительный)

u пользователь-владелец файла
g группа-владельц файла
o все остальные пользователи

+ включить
- отключить

-R поменять права на все подкаталоги и файлы указанной директории
-v выводить информацию обо всех изменениях

chmod u+x filename разрешить выполнение (x) для владельца (u)
chmod ugo+x filename разрешить выполнение (x) для всех (ugo)
chmod ug+r filename разрешить чтение (r) для владельца (u) и группы (g)
chmod o-w filename запретить запись (w) для остальных пользователей (o)
chmod -R g+rwx dir дать полный доступ (rwx) группе (g) на директорию и всем файлам в ней (-R)

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

0 никаких прав
1 только выполнение
2 только запись
3 выполнение и запись
4 только чтение
5 чтение и выполнение
6 чтение и запись
7 чтение, запись и выполнение

chmod 744 filename разрешить полные права для владельца, а остальным только чтение
chmod 664 filename чтение и запись для владельца и группы, только чтение для остальных

chown

chown lifailon tmp изменить владельца на пользователя lifailon для директории tmp
chown lifailon:lifailon tmp изменить владельца и группу
chown -R lifailon:lifailon tmp применить изменения ко всем подкаталогам (-R)
chown --from=root:root lifailon:lifailon -R ./ изменить владельца и группу только для тех каталогов и файлов, у которых владелец и группа root в текущем каталоге

groups

groups lifailon отобразить в каких группах находится указанный пользователь
touch testdir при создании файла ему назначается основная группа пользователя который его создал (ls -l testdir)
cat /etc/group список групп
chgrp testdir tmp изменить группу на testdir для директории tmp
groupadd testdir создать группу
delgroup testdir удалить группу, если ошибка 'testdir' still has testdir' as their primary group! предварительно исключить из группы всех пользователей

Опции:
-g изменить основную группу для пользователя
-G дополнительные группы, в которые нужно добавить пользователя (затирает предыдущие)
-a добавить пользователя в дополнительные группы c параметром -G, а не заменять им текущее значение
-R удалить пользователя из группы

usermod

usermod -aG sudo lifailon добавить пользователя в дополнительную группу (-aG, без затирания предыдущих групп) sudo (добавить в группу root)
usermod -aG disk lifailon пользователь будет иметь прямой доступ к ЖД без команды sudo (например монтировать)
usermod -g root lifailon изменить основную группу (-g) для пользователя на root
usermod -R ssh lifailon удалить пользователя из группы

logrotate

systemctl status logrotate.timer

nano /etc/logrotate.conf

# Ротация файлов журнала еженедельно

weekly

# По умолчанию используется группа adm, которая является владельцем группы ls -ld /var/log/syslog

su root adm

# Количество файлов (недель, если ротация еженедельно) хранения журналов

rotate 4

# Создавать новые (пустые) файлы журналов после ротации старых

create

# Использовать дату в качестве суффикса ротируемого файла

dateext

# Сжимать лог-файлы

compress

# Пакеты сбрасывают информацию о ротации журнала в этот каталог

include /etc/logrotate.d


nano /etc/logrotate.d/logrotate_remote.conf

/var/log/remote/*/*.log {

su root root

daily

copytruncate

size 10M

rotate 2

compress

dateext

}


Условия:

hourly каждый час
daily каждый день
weekly каждую неделю
monthly каждый месяц
yearly каждый год
size минимальный размер лога, меньше этого значения ротация выполняться не будет

Действия:

rotate 2 указать, сколько последних ротированных лог-файлов нужно хранить, остальные удалять
maxage 30 указать, за сколько последних дней хранить ротированные файлы, остальные удалять
copytruncate сначала создается копия файла лога, после уже обрезается действующий (нужно, когда программа должна писать лог непрерывно, возможность потери записей, если она придется на процесс усечения)
extension сохранять оригинальный лог файл после ротации
compress сжимать ротированный лог (gzip)
delaycompress не сжимать последний и предпоследний журнал (позволяет избежать ошибок, связанных с отсутствием доступа к используемому файлу)
create # 0644 root root создать пустой лог файл на месте старого
olddir /path перемещать логи в отдельную папку при срабатывании условия
dateext добавляет дату ротации перед заголовком старого лога
missingok не выдавать ошибки, если лог файла не существует
notifempty если файл пустой, не выполнять никаких действий
prerotate script.sh endscript скрипт, который необходимо выполнить перед чисткой лога
postrotate script.sh endscript скрипт, который необходимо выполнить после чистки лога
sharedscripts если был указан путь в формате wildcard (*), выполнить скрипт один раз после завершения ротации всех файлов

logrotate -d /etc/logrotate.d/logrotate_remote.conf проверить ротацию (--debug)
logrotate -fv /etc/logrotate.d/logrotate_remote.conf запустить ротацию сейчас (--force) с подробным выводом (--verbose)
cat /etc/cron.daily/logrotate задание на автоматический запуск создается по умолчанию, который читает конфигурационный файл ротации /etc/logrotate.conf, в нем указана директрия: include /etc/logrotate.d в которой лежат файлы ротации
which logrotate узнать путь до исполняемого файла
crontab -e
00 3 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logrotate_remote.conf настроить собственное ручное расписание с ежедневным запусков в 3:00


Так же в этом разделе:
 
MyTetra Share v.0.67
Яндекс индекс цитирования