yum/apk
MySQL
Список пользователей:
SELECT User, Host, Super_priv, Create_user_priv, Grant_priv from mysql.user WHERE Create_user_priv = 'Y' AND Grant_Priv = 'Y';
Посмотреть глобальную переменную в консоли mysql:
SELECT @@GLOBAL.log_error;
Раздамп с одного сервера на другой через pipe по ssh со сжатием:
ssh -C user@terget_ip 'mysqldump source_dbname' | pv | mysql target_dbname
Раздамп с одного сервера на другой через pipe по ssh со сжатием gzip:
ssh user@remote_ip 'mysqldump source_dbname | gzip' | gunzip | pv | mysql target_dbname
Посмотреть дату в базе (timestamp может отличаться от других временных функций):
select UNIX_TIMESTAMP();
Проверка конфига на ошибки:
/usr/sbin/mysqld --help --verbose | grep ERROR
Получить список партиций таблицы “history”:
SELECT TABLE_NAME,PARTITION_NAME FROM information_schema.partitions WHERE TABLE_SCHEMA='zabbix' AND TABLE_NAME = 'history';
Партиции в таблице:
SHOW CREATE TABLE table_name
Посмотреть параметры создания таблицы (показать table schema):
show create table zabbix.history_uint;
Удаление партиции:
ALTER TABLE history_uint DROP PARTITION p2018_09;
Информация о прогрессе импорта дампа БД:
time zcat dump.sql.gz | pv -rb | mysql database
Выбор всех таблиц в имени которых есть *b_iblock*:
show tables like "%b_iblock%";
Дать все права пользователю на базу с указанием хоста и пароля:
grant all privileges on db_tmp.* to bitrix0@localhost identified by 'password';
Посмотреть текущие кодировки:
show variables like 'char%';
Посмотреть текущие представления:
show variables like '%colla%';
Конвертирование базы и таблицы в кодировку utf8mb4 и представление utf8mb4_unicode_ci:
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Посмотреть кодировку конкретной базы:
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "db_name";
PostgreSQL
Владелец всех таблиц:
select tablename, tableowner from pg_catalog.pg_tables;
Владелец текущей БД:
SELECT
U.rolname,
D.datname
FROM
pg_roles AS U JOIN pg_database AS D ON (D.datdba = U.oid)
WHERE
D.datname = current_database();
Скопировать права имеющегося пользователя для нового:
GRANT current_user_name TO new_user_name;
Создание пользователя:
CREATE ROLE user_name WITH LOGIN ENCRYPTED PASSWORD 'm5NjNV3fBR2n8w3X';
Выборка данных (select) без лишних рамок в тихом режиме, посмотреть кол-во реплик standby (slave) серверов:
psql -qtAX -h HOST_IP -p 5432 -U zabbix -d postgres -c "SELECT count(*) FROM pg_stat_replication"
Посмотреть текущие переменные:
show all;
show statement_timeout;
Узнать расположение конфига:
SHOW config_file;
Список всех баз:
SELECT datname FROM pg_database;
Удалить БД:
drop database db_name
Дамп в текстовом формате и сжатием:
pg_dump db | gzip > db.dump.gz
Раздамп в текстовом виде:
zcat db.dump.gz | psql db || psql db_name < db.sql
Дамп в бинарном формате со сжатием (средствами pg_dump):
pg_dump -Fc db > db.bak
Раздамп в бинарном формате (-Fc для указания, что БД сжата (хотя и не обязательно указывать), -с для очистки, если БД уже есть, -j по кол-ву ядер для распараллеливания):
pg_restore -h db_address -U user_name -Fc db.bak -с -d db_name -j 2
Не генерировать команды, устанавливающие владение объектами, как в исходной базе данных (применимо и к pg_restore; удобно при переносе в уже существующую БД):
pg_dump --clean --no-owner db > db.dump
Не восстанавливать права доступа (не выполнять команды GRANT/REVOKE):
pg_restore -Fc db.dump -x -d db_name
Узнать размер БД:
SELECT pg_size_pretty( pg_database_size('DBNAME') );
Подключиться к БД из консоли:
\c DBNAME
Посмотреть таблицы и их размер:
\dt+
Список привилегий:
\l
Список пользователей (ролей):
\du
Права для схемы:
\dn+
Создание пользователя в консоли БД (сразу добавляется возможность LOGIN):
CREATE USER test WITH password 'qwerty';
Создание пользователя:
sudo -u postgres createuser --pwprompt zabbix
Дать все привилегии:
GRANT ALL ON DATABASE db_name TO test;
Дать права на все таблицы в базе:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO name_user;
Создание БД и сразу выдача прав (–owner) на неё пользователю zabbix:
sudo -u postgres createdb -O zabbix zabbix
Мягко перечитать конфигурацию pg_hba.conf:
docker exec -it -u postgres help-postgresql-1 psql -c "SELECT pg_reload_conf();"
Посмотреть статус репликации на мастере:
psql -c "select usename,application_name,client_addr,backend_start,state,sync_state from pg_stat_replication;"
InfluxDB
Аргументы для вывода запроса с экранированными кавычками в терминал:
influx -database 'db_name' -username 'grafana' -password 'password' -execute "SELECT last(\"value\") FROM \"application.\" WHERE (\"app\" = 'test'"
Consul
Создание РК:
curl -s \
--header "X-Consul-Token: ${TOKEN}" \
http://${SERVER_IP}:8500/v1/snapshot?dc=${DC_NAME} -o /backup/snapshot.tgz
Восстановление из РК, указывать DC:
curl \
--request PUT \
--data-binary @snapshot.tgz \
--header "X-Consul-Token: ${TOKEN}" \
http://${SERVER_IP}:8500/v1/snapshot?dc=${DC_NAME}
Nginx
Проверка конфигурации и мягкая перезагрузка без обрывов соединений:
nginx -t && nginx -s reload
Httpd
Проверка конфигурации:
httpd -t
Bash
Если нет ncdu, получить отсортированный список файлов по размеру:
ls | xargs -I {} du -shx {}
Дебаг скрипта:
trap 'echo "# $BASH_COMMAND";read' DEBUG
echo line1
echo line2
Передать явно аргумент команде через двойное тире (double dash). Без этого аргумент будет интепретироваться как ключ для mv:
mv -- -3.jpg normal_name.jpg
Вставить строку в начало файла с помощью echo:
(echo "some text" && cat filename) > filename1 && mv filename1 filename
Переместить все файлы из одной директории в другую, включая скрытые:
(shopt -s dotglob; mv -v old-dir/* /home/bitrix/ext_www/new-dir)
Удалить все .rpm файлы в текущей директории:
for i in *.rpm; do yum remove $(basename "$i" | sed "s/.rpm$//g"); done
Проверить все доступные версии пакета в репозитории:
yum list gitlab-runner --showduplicates | sort -r
Назначение корректных прав директориям и файлам:
find . -type d | xargs chmod -v 755 && find . -type f | xargs chmod -v 644
Посмотреть информацию о об rpm-пакете (размер, пути установки бинарников):
rpm -qli ${RPM_NAME}
Распаковка src.rpm:
rpm2cpio ../hoge.src.rpm | cpio -i
Исключить пустые строки и комментарии с grep
cat /etc/ntp.conf | egrep -v '^$|^#'
Скачивание файлов через curl:
curl https://domain.ru/tpk.tar --output tpk.tar
Вывод на экран консоли и в файл одновременно (-a — append to end like >> ) :
/opt/scripts/mfc_copy.sh | tee -a /opt/scripts/mfc_copy.log
Зависимости (библиотеки):
ldd /bin/bash
Убить все процессы по шаблону:
pkill -f <pattern>
rsync dry-run:
rsync -n ./ /home/
Проверка правильности файла fstab (dry run):
mount -f
Найти через find и удалить всё в текущей директории кроме папки nodel:
find . -name 'nodel' -prune -o -exec rm -rf {} \;
Фоновый режим процессов:
man ls &
fg &[№ процесса]
jobs # список процессов
tar директории mysql на лету:
tar cvf - mysql | ( cd /destination; tar xf - )
Список файлов в архиве верхнего уровня:
tar --exclude='*/*/*' -tvf ttt.tar.gz
Перенаправить стандартный вывод в лог-файл, а вывод ошибок – в /dev/null
command >file.log 2>&1
Посмотреть используемый MTA
alternatives --display mta
Сменить MTA:
alternatives --set mta /usr/sbin/sendmail.postfix
Обновить корневой сертификат в системе (путь /etc/pki/ca-trust/source/anchors/ в RHEL):
update-ca-trust
Очистка переменной от непечатаемых символов:
var="${var//[$'\t\r\n ']}"
Создание файла нужного размера (только на файловых системах, поддерживающих разреженные (sparse) файлы:
fallocate -l 10M out.txt
Проверка работы почты пхп в консоли:
php -r "mail('mail@google.com', 'test', 'test');"
Создание файла (или уменьшение размера):
truncate -S 10M test.txt
truncate -S 0 test.txt
truncate -s +200K test.txt
Вывод топ N процессов с сортировкой по CPU usage:
ps -Ao user,uid,comm,pid,pcpu,pmem --sort=-pcpu | head -n 30
Ручная синхронизация времени, когда ntpd уже запущен:
ntpdate -u server_name
Информация по работе ntpd (с резолвом имён):
ntpq -np
Firewalld
Вывести всю информацию:
firewall-cmd --permanent --list-all
Перезагрузить без потери соединений:
firewall-cmd --reload
Открыть порт или диапазон:
firewall-cmd --permanent --zone=public --add-port=10050-10051/tcp
Добавить маскарадинг на интерфейс:
firewall-cmd --zone=external --add-masquerade --permanent
Перенаправить входящие соединения по 80 порту на другой хост:
firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.16.0.3 --permanent
Перенаправить с одного порта на другой порт и узел:
firewall-cmd --zone=external --add-forward port=port=2245:proto=tcp:toport=22:toaddr=10.16.0.3 --permanent
Iptables
Перенаправить с одного порта на другой порт и узел:
iptables -t nat -A PREROUTING -p tcp -d 10.16.0.1 --dport 80 -j DNAT --to-destination 10.16.0.13:8080 --permanent
Вывод правил NAT:
iptables -t nat -L
Сохранить правила:
iptables-save
Удалить правило по номеру строки:
iptables -t nat -L POSTROUTING --line-numbers
iptables -t nat -D POSTROUTING <number>
Docker
Удаление промежуточных образов без тэгов:
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
Мягко перезапустить контейнер:
docker kill --signal="USR1" <yourcontainer_name>
Список контейнеров:
docker ps -a
Подключиться к контейнеру:
docker exec -it container_name bash
Остановить все контейнеры:
docker stop $(docker ps -a -q)
Удалить все контейнеры, из которых вышли:
docker rm -v $(docker ps -aq -f status=exited)
Удалить образ:
docker rmi image_name
Создать образ:
docker build -t image_name .
Удалить все неиспользуемые тома:
docker volume prune
Подключиться под рутом в контейнер Alpine:
docker exec -it --user root alpine-container bash
Systemd
Смена имени хоста без перезагрузки ОС:
hostnamectl set-hostname New_HostName
systemctl restart systemd-hostnamed
Screen
Прокрутка:
Ctrl+A Esc PgUp Esc
Просмотреть список сессий скрина:
screen -ls:
There are screens on:
27617.pts-0.web-p-3 (Detached)
2690.pts-0.web-p-3 (Attached)
Подключиться к сессии в состоянии “deattached”
screen -r 27617.pts-0.web-p-3
Подключиться к сессии в состоянии “attached”:
screen -x 27617.pts-0.web-p-3
Отключиться от сессии:
Ctrl+A D
Убить сессию:
screen -S 7617.pts-0.web-p-3 -X quit
Vim
Включить\отключить непечатаемые символы:
set list
set nolist
Включить нумерацию строк:
set num
openssl
Добавить клиентский серт + ключ + цепочку корневых сертификатов в контейнер p12:
openssl pkcs12 -export -in tmp/sber.pem -inkey tmp/sber.key -name sber -out tmp/sber.p12 -passout pass:changeit -CAfile tmp/sberca.pem -caname SberCA_Test_Ext_G2 -caname SberCA_Test_Root_Ext -caname SberCA_Test_Root_Ext -caname SberCA_Test_Ext_G2 -chain
Проверить клиентский серт с корневым и промежуточными:
openssl verify -CAfile root.pem -untrusted intermediate.pem application.pem
-CAFile is the root ca certificate
-untrusted is the intermidiate (if any) certificates
application.pem is your application certificate
Получить информацию о всей цепочке:
openssl crl2pkcs7 -nocrl -certfile tmp/chainca.pem | openssl pkcs7 -print_certs -noout
Посмотреть все сертификаты с системе:
awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
Посмотреть сертификат:
echo -n | openssl s_client -connect ldap.srv.ru:636 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
Посмотреть информацию о сертификате (кем выдан и какой срок действия, например):
openssl x509 -noout -text -in /etc/letsencrypt/livermn-lux.ru/fullchain.pem
Подключение к почтовому серверу, используя SSL:
openssl s_client -starttls smtp -crlf -connect 10.89.65.20:25
Обновить корневые сертификаты:
update-ca-trust
Запустить прослушивание на 443 порту
openssl s_server -accept 443 -cert serv.pem -key cerv.key -st
ate
Проверить все корневые сертификаты в ОС:
awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt | YOUR_SUBJ
Добавить корневой сертификат в ОС Debian (имя обязательно должно быть crt):
cp cert.cert /usr/local/share/ca-certificates/cert.crt
sudo update-ca-certificates
Создать ключ и сертификат одной командой:
openssl req -newkey rsa:1024 -x509 -nodes -sha256 -days 3650 -keyout ca.key -out ca.crt -subj "/CN=.domain.ru/emailAddress=my.addr@domain.ru"
Распаковка сертификатов из контейнера p12:openssl pkcs12 -in <имя вашего файла>.p12 -nodes -nocerts -out private.key
openssl pkcs12 -in <имя вашего файла>.p12 -clcerts -nokeys -out client_cert.crt
openssl pkcs12 -in <имя вашего файла>.p12 -cacerts -nokeys -chain -out cacerts.cer
keytool
Добавить сертификат в хранилище java:
keytool -importcert -alias ldap.domain.ru -file ~/ldaps.pem -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts
# пароль по дефолту - changeit
Сгенерировать сертификат и ключ и положить в хранилище:
keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
awk
Замена второго столбца с улсовием:
awk -v REG_URI="$REG_URI" '{ if ($2 == "mcr.microsoft.com/dotnet/aspnet:5.0") {$2 = "value_for_replace"}; print }'
Суммирование значений в столбце $1 и вывод по окончании результата:
echo "$var1" | awk '{s+=$1} END {print s}'
postfix
Обновление записей о логинах\паролях:
postmap /etc/postfix/sasl_passwd
ovftool
Экспорт виртуальной машины с ESXi в OVA (Linux):
ovftool "vi://root:pass@<ESXI-IP>/<VM-name>" /home/local-path/VM-copy-name.ova
Windows PowerShell:
& 'C:\Program Files\VMware\VMware OVF Tool\ovftool.exe' "vi://root:pass3@10.10.3.25/VM_name" fr.ova
rndc
Clear domain cache:
rndc flushname rmn-lux.ru
yum
Список зависимостей библиотек бинарника:
ldd /bin/cat
Вывод списка всех версий пакетов на примере percona:
yum -q list available --showduplicates percona-server*
Удаление старых ядер с раздела /boot:
uname -r
pm -qa | grep kernel-3
package-cleanup --oldkernels --count=2 # оставить последних 2 ядра, включая текущее
Установить пакет в alpine с указанием репозитория:
apk add swaks --update-cache --repository http://nl.alpinelinux.org/alpine/edge/testing
sed
Вывести содержимое файла в диапазоне между строкой 15 и 35:
cat file.txt | sed -n 15,35p
scp
Копирование файлов с Windows на Linux с кириллицей и пробелами в путях. 1 уровень кавычек интерпретируется scp, второй уровень позволяет использовать путь с пробелами:
scp -r user@10.10.10.1:"\"E:\Поганая винда/\"" ./
ldap
Запрос всех пользователей из группы, включая nested группы
(&(objectCategory=Person)(sAMAccountName=*)(memberOf:1.2.840.113556.1.4.1941:=cn=team,ou=Groups,ou=Resources,ou=Main,dc=hh,dc=ru))
Git
Удаленное перебазирование ветки вместо стандартного git pull origin master чтобы не было коммитов слияния:
git pull --rebase origin master
kubernetes
Вывести все API ресурсы из нужного namespace:
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <stuck_namespace>
Удаление зависшего пода в состоянии “Terminating”:
kubectl delete pod NAME --grace-period=0 --force
Проверка лимитов на кол-во подов (настраиваются в параметрах запуска kubelet), можно перезагружать на проде без простоя:
kubectl get nodes -o yaml | grep pods
Получение срока окончания сертификата из secret:
kubectl -n integration get secret SECRET_NAME -o "jsonpath={.data['tls\.crt']}" | base64 -d | openssl x509 -enddate -noout
Инфа о сертификате:
kubectl -n integration get secret SECRET_NAME -o "jsonpath={.data['tls\.crt']}" | base64 -d | openssl x509 -text