Linux: заметки

В этом посте буду для себя собирать короткие заметки касательно Ubuntu.

Содержание

  • Запуск графических приложений от имени root: откройте диалог запуска GNOME сочетанием клавиш Alt+F2 и введите "gksudo имя_приложения"
  • Установка пакета: "sudo apt-get install имя_пакета", но лучше использовать  "sudo aptitude install имя_пакета" - у этой команды больше плюсов (логи, поиск, лучшее отслеживание связей, есть графический интерфейс)
  • Обновление: обновление индексов репрозиториев - "sudo aptitude update";  непосредственная установка всех доступных обновлений - "sudo aptitude safe-upgrade".
  • Определения типа файла: "file имя_файла"
  • Импорт ключа репрозитория: "sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 12345678". Эта команда запросит ключ 12345678 с сервера ключей Ubuntu и добавит его в систему. Собственно, имя ключа всегда выглядит как 8 буквенно-цифровых символов, поэтому если вам дано только оно, то для импортирования ключа вы вполне можете использовать эту команду, изменив 12345678 на нужное значение.
  • Добавление репрозитория: добавлять PPA с Launchpad можно так же легко и через терминал, пример: "sudo add-apt-repository ppa:tualatrix/ppa"
  • Набор проприетарных пакетов: кодеков, Flash-плагин от Adobe, RAR и тп.: ubuntu-restricted-extras
  • Монтирование разделов: в файле /etc/fstab. Записи о всех смонтированных дисках попадают в специальный файл /etc/mtab, формат записей этого файла такой же, как у /etc/fstab. Если надо добавить запись для какого-то раздела винчестера в fstab просто зайдите на него через меню «Переход», при этом он автоматически смонтируется в подкаталог /media и следовательно запись о нём появится в mtab. Откройте mtab, найдите нужную строчку (тут диски именуются обычным способом) и скопируйте в fstab, заменив имя диска на его uuid и точку монтирования на желаемую. Кроме того, если в качестве ФС в mtab записано fuseblk, то при копировании необходимо подставить вместо этого значения имя своей файловой системы.
  • Текстовый редактор: gedit
  • Узнать uuid для нужного вам раздела: "ls -l /dev/disk/by-uuid" или более информативный "sudo blkid"
  • Добавление ntfs-раздела в fstab: можно воспользоваться утилитой ntfs-config
  • Структура папок:
    • / корневой каталог
    • /bin стандартные программы Linux (cat, cp, ls, login и т.д.)
    • /boot каталог загрузчика, содержит образы ядра и Initrd, может содержать конфигурационные и вспомогательные файлы загрузчика
    • /dev файлы устройств
    • /etc конфигурационные файлы системы
    • /home домашние каталоги пользователей
    • /lib библиотеки и модули
    • /lost+found восстановленные после некоректного размонтирования файловой системы файлы и каталоги
    • /misc может содержать все, что угодно, равно как и каталог /opt
    • /mnt обычно содержит точки монтирования
    • /proc каталог псевдофайловой системы procfs, предоставляющей информацию о процессах
    • /root каталог суперпользователя
    • /sbin каталог системных утилит, выполнять которые имеет право пользователь root
    • /tmp каталог для временных файлов
    • /usr пользовательские программы, документация, исходные коды программ и ядра
    • /var постоянно изменяющиеся данные системы, например, спулы системы печати, почтовые ящики, протоколы, замкИ и т.д.
  • Занятое и свободное дисковое пространство:
    • По всем дискам: df -h
    • Просуммировать и показать размер определенной категории:  du -hs /path/to/directory
    • А так показать размер всех категорий и файлов в текущей категории: du -hsc *
    • ncdu - утилита которая больше всего мне понравилась. Устанавливаем и запускаем либо без параметров - тогда отобразит информацию по текущей папке и подпапкам, либо в качестве параметра указываем путь который нужно проанализировать.
  • Выключение на виртуальной машине: halt -p
  • Текстовый редактор: nano
    • Выделение текста: Ctrl-^ и дальше перемещение курсора
    • Скопировать выделенный текст: Alt-6
    • Если текст выделен и нажать F9, то он удаляется
    • Запуск с параметром -c показывает номера строк во время перемещения курсором
    • Undo и Redo (отмена и повтор), работают если запустить с параметром -u. Комбинации: Alt-U - undo, Alt-E - redo
    • Поиск - ctrl-W, повторный поиск того же текста Alt-W
    • Замена - ctrl-\
  • Создать текстовый файл:
    • touch /адрес/файла.txt
    • echo 'bla' > filename.txt
  • Переход в конец файла при просмотре через F3 в MC - сочетание клавиш Shift+G

Веб серверы Apache, NGINX

Apache:

NGINX:

NGINX + PHP-FPM

NGINX + WordPress

Переадресация с www на не www

Пример конфига:

server {
 server_name elims.org.ua www.elims.org.ua;
 return 301 https://elims.org.ua$request_uri;
}
server {
 listen 443 ssl http2;
 server_name www.elims.org.ua;
 ssl_certificate /etc/nginx/ssl/elims_org_ua.chained.crt;
 ssl_certificate_key /etc/nginx/ssl/elims_org_ua.key;
 return 301 https://elims.org.ua$request_uri;
}
server {
 root /var/www/html;
 server_name elims.org.ua;
 listen 443 ssl http2;
 ssl_certificate /etc/nginx/ssl/elims_org_ua.chained.crt;
 ssl_certificate_key /etc/nginx/ssl/elims_org_ua.key;
 ... Остальные инструкции ......
}

Убираем лишние слешы

Например https://test.com//////blog///ubuntu-zametki//

#replace merge_slashes' behavior with "redirect_slashes"
 merge_slashes off;
 location ~* "(//+)" {
 rewrite ^(.*?)(//+)(.*)$ $1/$3;
 rewrite ^ $uri permanent;
 }

SSL замечание: This server supports weak Diffie-Hellman (DH) key exchange parameter

Генерируем ключ не менее 2048 бит:

cd /etc/nginx/
openssl dhparam -out dhparam.pem 2048

Создастся файл /etc/nginx/dhparam.pem

В конфигурационном файле nginx добавляем строку:

ssl_dhparam /etc/nginx/dhparam.pem;

Увеличить время хранения логов nginx

Для этого нужно увеличить количество лог-файлов в ротации логов. Для этого открываем файл /etc/logrotate.d/nginx и в строке rotate 14, поменяйте цифру 14 на нужную. Цифра означает какое количество файлов сохраняется. 1 файл = 1 день.

Ошибка 413 Request Entity Too Large

В файле nginx.conf, в секцию http, добавить или изменить:

client_max_body_size 100m;

Директива client_max_body_size задаёт максимально допустимый размер тела запроса клиента, указываемый в строке "Content-Length" в заголовке запроса. Если размер больше заданного, то клиенту возвращается ошибка "Request Entity Too Large" (413). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку. Подробнее

Защита php файлов паролем

Создаем файл .htpasswd с логином и паролем, вводим команду:

printf "Тут_Логин:`openssl passwd -apr1`\n" >> .htpasswd

После ввода команды дважды запросится пароль, которым защищаем наши файлы

Конфиг для нужной локации:

location ~ /test/.+.php$ {
 root /var/www/;
 fastcgi_pass unix:/run/php/php7.0-fpm.sock;
 fastcgi_split_path_info ^(.+\.php)(/.*)$;
 include fastcgi_params;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 auth_basic "Restricted Area";
 auth_basic_user_file /etc/nginx/.htpasswd;
}

Осталось перезапустить веб-сервер: service nginx restart

Приоритет Nginx Location

Пример конфига:

location = / {
 # matches the query / only.
 [ configuration A ]
}
location / {
 # matches any query, since all queries begin with /, but regular
 # expressions and any longer conventional blocks will be
 # matched first.
 [ configuration B ]
}
location /documents/ {
 # matches any query beginning with /documents/ and continues searching,
 # so regular expressions will be checked. This will be matched only if
 # regular expressions don't find a match.
 [ configuration C ]
}
location ^~ /images/ {
 # matches any query beginning with /images/ and halts searching,
 # so regular expressions will not be checked.
 [ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
 # matches any request ending in gif, jpg, or jpeg. However, all
 # requests to the /images/ directory will be handled by
 # Configuration D.
 [ configuration E ]
}

Отрабатывает в таком приоритете:

  1. = (exactly) : location = /path
  2. ^~ (forward match) : location ^~ /path
  3. ~ (regular expression case sensitive) : location ~ /path/
  4. ~* (regular expression case insensitive) : location ~* .(jpg|png|bmp)
  5. / : location /path

Подсмотрел на stackoverflow.com.

Обновление NGINX с 1.10 до 1.12

Обновляемся в Ubuntu 16.04 LTS со стабильной ветки nginx 1.10 до 1.12:

  • Делаем резервную копию файлов на всякий случай:
    • sudo mkdir /etc/nginx-backup/
    • sudo cp -r /etc/nginx/* /etc/nginx-backup/
  • sudo apt-get install software-properties-common
  • nginx=stable
  • sudo add-apt-repository ppa:nginx/$nginx
  • sudo apt-get update
  • apt-get dist-upgrade
  • Важно: там где спрашивает затирать ли конфиги - не затирайте (по умолчанию)
  • Важно: в существующий конфиг /etc/nginx/nginx.conf добавляем строку: include /etc/nginx/modules-enabled/*.conf; после строки pid /run/nginx.pid;
  • sudo service nginx restart
  • подсмотрел тут

Pfsense

Zend OPcache

Хабр: Обзор расширения OPCache для PHP - толковая статья, которая детально расписывает работу OPcache

Проверить текущие настройки opcache можно командой:

php -i | grep opcache

Конфигурирование опций Opcache происходит в файле php.ini

Для применения опций нужно перезапустить веб-сервер и php, в связке nginx + php 7 fpm это команда:

sudo service nginx restart && sudo service php7.0-fpm restart

Опции OPcache

  • opcache.enable (значение по умолчанию 1) — включение/выключение OPcache.
  • opcache.enable_cli (значение по умолчанию 0) — включение OPcache при вызове PHP из коммандной строки.
  • opcache.memory_consumption (значение по умолчанию 64) — размер используемой памяти (в мб.) для хранения прекомпилированного PHP-кода.
  • opcache.interned_strings_buffer (значение по умолчанию 4) — количество памяти для пула строк в мегабайтах.
  • opcache.max_accelerated_files (значение по умолчанию 2000) — максимальное количество ключей в хэш-таблице OPcache. Число должно быть простым и быть больше, чем те, что приведены в примере: 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987, 262237, 524521, 1048793. Допустимы числа между 200 и 1000000.
  • opcache.max_wasted_percentage (значение по умолчанию 5) — максимальный процент замусоренной памяти для запланированного перезапуска.
  • opcache.use_cwd (значение по умолчанию 1) — при включении добавляет текущую рабочую директорию в ключ скрипта для предотвращения возникновения колизий между файлами с одинаковым именем.
  • opcache.validate_timestamps (значение по умолчанию 1) — появляется возможность обнуления OPcache вручную или перезапуском веб-сервера для того, чтобы привести в актуальное состояние данных об изменениях в файлах. Частота проверки управляется параметром opcache.revalidate_freq.
  • opcache.revalidate_freq (значение по умолчанию 2) — через какой промежуток времени (в секундах) проверять изменения временных меток для поддержания данных в памяти в актуальном состоянии, где 1 — проверка с периодичностью раз в секунду, 0 — постоянная проверка.
  • opcache.file_update_protection (значение по умолчанию 2) — предотвращает кэширование файлов, которые были изменены меньше, чем в указанное время (в секундах). Эта возможность защищает частично обновленные файлы от кэширования.
  • opcache.revalidate_path (значение по умолчанию 0) — включение или отключение оптимизации поиска файлов в include_path, если поиск файлов выключен и будет найден закэшированный файл, используемый в include_path, файл не будет найден повторно. Таким образом, если файл с именем, попадающийся где-либо еще в include_path, он не будет найден.
  • opcache.save_comments (значение по умолчанию 1) — если выключено, все комментарии PHPDoc будут удалены из кода с целью уменьшения размера оптимизированного кода. Не рекомендуется отключение этого параметра.
  • opcache.load_comments (значение по умолчанию 1) — если выключено, то комментарии PHPDoc не будут загружаться из общей памяти.
  • opcache.fast_shutdown (значение по умолчанию 0) — если включено, будет использоваться последовательность быстрых выключений для оптимизированного кода.
  • opcache.enable_file_override (значение по умолчанию 0) — при включении OPcache будет проверять наличие закэшированного файла при вызовах file_exists(), is_file() и is_readable().
  • opcache.optimization_level (значение по умолчанию 0xffffffff) — битовая маска, в которой каждый бит включает или отключает в соответствующие проходы OPcache.
  • opcache.inherited_hack (значение по умолчанию 1) — включение этого хака при ошибках вида can't redeclare class. По умолчанию возможность отключена, т.е оптимизация активирована. В PHP-5.3+ этот хак не требуется.
  • opcache.dups_fix (значение по умолчанию 0) — включайте при появлении ошибок вида Can't redeclare class.
  • opcache.blacklist_filename — месторасположение списка файлов, к которым запрещен доступ для OPcache (поддерживаются маски). Каждый такой файл является текстовым файлом, в котором хранятся имена файлов, которые не требуется кэшировать, размещение имени каждого файла с отдельной строки. Имя файла может содержать полный путь, либо префикс.
  • opcache.max_file_size (значение по умолчанию 0) — позволяет исключать большие файлы из кэширования. По умолчанию кэшируются все файлы.
  • opcache.consistency_checks (значение по умолчанию 0) — проверять контрольную сумму кэша каждое N-ое количество запросов. По умолчанию параметр имеет значение 0, что отключает проверки. Подсчет контрольной суммы снижает производительность.
  • opcache.force_restart_timeout (значение по умолчанию 180) — время ожидания (в секундах) перед перезагрузкой в случае недоступности кэша. После истечение времени ожидания OPcache перезапускает процессы, которые были все это время заблокированы.
  • opcache.error_log — определение названия и местоположения лога ошибок OPcache. При пустом значении ошибки выводятся в консоль.
  • opcache.log_verbosity_level (значение по умолчанию 1) — все ошибки OPcache отправляет в лог-файл веб-сервера. По умолчанию логируются только критические ошибки (0) и обычные ошибки (1). Дополнительно можно включить предупреждения (2), информационные сообщения (3) или отладочную информацию (4).
  • opcache.preferred_memory_model — предпочитаемся модель общей памяти.
  • opcache.protect_memory (значение по умолчанию 0) — защита общей памяти от несанкционированной записи во время выполнения.
  • opcache.restrict_api (значение по умолчанию пустая строка) — разрешение вызова API-функций OPcache из PHP-скриптов, путь к которым начинается тем, что указано в строке. По умолчанию пустое значение означает запрет на все.

Пример конфигурации opcache

zend_extension=/usr/lib64/php/modules/opcache.so
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_file_size = 1M
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 7963
opcache.fast_shutdown = 1
opcache.revalidate_freq = 0
opcache.use_cwd = 1

MySQL

Остановка и запуск MySql в Ubuntu 16.04:

  • sudo /etc/init.d/mysql stop
  • sudo /etc/init.d/mysql start

Ошибка "Host is not allowed to connect to this MySQL server" говорит о том, что у вводимому пользователю не разрешено подключаться к базе с текущего IP. Решается командами:

  • mysql -u root mysql -p - логинимся в базу под рутом базы
  • GRANT ALL PRIVILEGES ON database.* TO username@"%" IDENTIFIED BY 'password' WITH GRANT OPTION; - тут "%" означает с любого IP. database, username, password - нужно вводить свои
  • FLUSH PRIVILEGES; - перезагружаем таблицу разрешенний
  • exit; - выходим

Резервное копирование

#определенной базы:
mysqldump --opt -u [username] -p[password] [dbname] > [backupfile.sql]

#несколько баз:
mysqldump --opt -u [username] -p[password] --databases [dbname_1] [dbname_2] ... > [backupfile.sql]

#всех баз:
mysqldump --opt -u [username] -p[password] --all-databases > [backupfile.sql]

#с сжатием:
mysqldump --opt -u [username] -p[password] [dbname] | gzip -9 > [backupfile.sql]

#пример:
mysqldump --opt -u root -phere_password my_db | gzip -9 > my_db_backup.sql.gz

Сменить пароль пользователю базы:

#командой в консоли:
SET PASSWORD FOR 'user-name-here'@'hostname-name-here' = PASSWORD('new-password-here');
#запросом в базе данных:
UPDATE mysql.user SET Password=PASSWORD('new-password-here') WHERE USER='user-name-here' AND Host='host-name-here';

Запросить значение переменной:

#MySQL 5.0+
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

#MySQL 5.1+
SELECT variable_value FROM information_schema.global_variables
WHERE variable_name = 'innodb_buffer_pool_size';

Поменять движок базы на archive без удаления таблицы:

Это поможет обойти ошибку

ERROR 1022 (23000): Can't write; duplicate key in table '#sql-1b51_1'
CREATE TABLE copy LIKE original;
ALTER TABLE copy ENGINE=archive;
INSERT INTO copy SELECT * FROM original  ORDER BY id;
DROP TABLE original;
RENAME TABLE copy TO original;

Получить значение из json в базе, которая его не поддерживает:

SELECT
    DISTINCT(
        substring(столбец, locate('"city":',столбец)+8,
        locate('","', столбец, locate('"city":',столбец))-locate('"city":',столбец)-8)
    )
FROM таблица

Подсмотрел тут

Остальное:

  • Создать базу: CREATE DATABASE имя_базы DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  • Создать пользователя и дать доступ к базе: GRANT ALL ON имя_базы.* TO 'имя_пользователя'@'localhost' IDENTIFIED BY 'пароль';
  • Посмотреть список баз: show databases;
  • Посмотреть список пользователей: select * from mysql.user;
  • Посмотреть права пользователя elimS с любого хоста: SHOW GRANTS FOR 'elimS'@'%';
  • Подключиться к базе на удаленном хосте: mysql -h your-dbserver.us-east-1.rds.amazonaws.com -u elimS -p
  • ruhighload.com: Выбор типов данных в Mysql - важно для столбцов назначить правильный тип данных, это даст хорошую оптимизацию по объему
  • habr: Настройка и оптимизация MySQL сервера - список полезных настроек и их предназначение
  • ruhighload.com: Оптимальная настройка Mysql - советы по установке тех или иных значений в настройках
  • ruhighload.com: my.cnf для 4 Гб памяти - пример конфига MySQL с оптимальными настройками для сервера с 4 Гб ОЗУ
  • ruhighload.com: Индексы в MySQL - индексы помогают ускорить выполнение запросов
  • Для мониторинга работы сервера удобно использовать phpMyAdmin, интерес представляют вкладки Состояние и Переменные. Дополнительно phpMyAdmin дает советы по тюнингу тех или иных переменных в зависимости от параметров работы сервера.
  • Установка MySQL 8 на Ubuntu 18.04 LTS - помогло это: после того как полностью снес MySQL и Apache2. Перед этим проапгрейдил Ubuntu с 16.04 до 18.04.
  • Если не дает подключиться к базе данных с удаленного хоста убедитесь что в файле /etc/mysql/mysql.conf.d/mysqld.cnf закомментирована строка bind-address = 127.0.0.1. Если не закомментирована, то закоментируйте: #bind-address = 127.0.0.1 и перезапустите MySql сервис: sudo /etc/init.d/mysql restart
  • 32 совета для ускорения MySQL запросов - рекомендую быстро пробежаться по советам, вдруг подвернется что вы можете у себя оптимизировать.
  • Microsoft SQL Server Type Mapping
  • Делаем дамп (бэкап) базы данных, используя утилиту mysqldump
  • w3schools.com: SQL Left JOIN - если у нас есть два множества элементов и мы хотим выбрать подмножество элементов которые есть в левом множестве 1, но нет в правом 2:
SELECT column_name(s)
FROM table1
LEFT JOIN table2 ON table1.column_name = table2.column_name
WHERE table1.column_name IS NULL;

Ротация логов через Logrotate

Устанавливаем дистрибутив Logrotate, если он еще не установлен.

В папке /etc/logrotate.d/ создаем конфиг для своего скрипта\приложения.

Пример конфига apache2:

$ more /etc/logrotate.d/apache2
 /var/log/apache2/*.log {
  weekly # ротация раз в неделю
  missingok # отсутствие файла не является ошибкой
  rotate 52 # сохраняется последние 52 ротированных файла
  compress # сжимать ротируемый файл
  delaycompress # сжимать предыдущий файл при следующей ротации
                # (т.е. файл *.log.1 будет не сжат, а *.log.2 и далее сжатыми)
  notifempty # не обрабатывать пустые файлы
  create 640 root adm # сразу после ротации создать пустой файл с заданными правами и пользователем
  sharedscripts # скрипты prerotate/postrotate будут выполнены только один раз
                # не зависимо от количества журналов, подходящих под заданный шаблон
  postrotate # скрипт будет выполнен сразу после ротации
   if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
    /etc/init.d/apache2 reload > /dev/null
   fi
  endscript
 }

После создания конфиг файла нужно проверить что все работает, команда без реальных изменений  (запуск в отладочном режиме):

sudo logrotate -d /etc/logrotate.d/your_config

Если все ок, тогда запускаем ротацию:

sudo logrotate -v -f /etc/logrotate.d/your_config

После этого ротация будет происходить автоматически

Подсмотрел на debianworld.ru: Ротация логов с помощью logrotate в Debian / Ubuntu

Анализ логов

  • uniq — утилита, можно вывести или отфильтровать повторяющиеся строки
    • -u Выводить только те строки, которые не повторяются на входе.
    • -d Выводить только те строки, которые повторяются на входе.
    • -с Перед каждой строкой выводить число повторений этой строки на входе и один пробел.
#MAX количество запросов с IP (список IP-адресов, с которых наблюдается наибольшее количество запросов):
cat access_log | awk '{print $1}' | sort | uniq -c | sort -n | tail

#если хотим пробежаться по за архивированным файлам и вывести по ним общую статистику:
zcat access_log.* | awk '{print $1}' | sort | uniq -c | sort -n | tail

#Платформа система клиента
cat */access_log | awk '{print $13}' | sort | uniq -c | sort -n | tail

#Коды ответов сколько
cat */access_log | awk '{print $9}' | sort | uniq -c | sort -n | tail

#Еще несколько примеров онлайн анализа логов, с подсчетом строк
tail -F /var/log/nginx/access.log | awk -v awk_var=0 -v awk_var2=0  '{++awk_var} / 302 / {{++awk_var2} print awk_var2" of "awk_var" ALL 302: "$0"\n"}'
 tail -F /var/log/nginx/access.log | awk -v awk_var=0 '{++awk_var} {print awk_var" All Requests: "$0"\n"}'
 tail -F /var/log/nginx/access.log | awk -v awk_var=0 '/ 200 / && /POST/ && !/\/check-imei/ {{++awk_var} print awk_var" POST 200, not imei: "$0"\n"}'
 tail -F /var/log/nginx/access.log | awk -v awk_var=0 '/ 200 / && / \/sell/ {{++awk_var} print awk_var" ALL 200 for /sell pages: "$0"\n"}'
 tail -F /var/log/nginx/access.log | awk -v awk_var=0 '/HTTP\// && /GET \/sell/ {{++awk_var} print awk_var" All GET for /sell: "$0"\n"}'

Подсмотрел тут

Резервное копирование Ubuntu

Замеряем скорость сайта через curl

#смотрим скорость загрузки в секундах:
curl -s -w %{time_total}\\n -o /dev/null https://elims.org.ua

#более подробный отчет:
curl -s -w '\nLookup time:\t%{time_namelookup}\nConnect time:\t%{time_connect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' -o /dev/null https://elims.org.ua
#вывод команды:
Lookup time: 1.510 (время на преобразование доменного имени в IP)
Connect time: 1.664 (время на подключение к удаленному серверу по TCP)
PreXfer time: 2.376 (время на ‘обмен рукопожатиями’ - установка сессии)
StartXfer time: 3.074 (Время на все действия, вплоть до начала передачи первого байта данных)

#еще более подробные, с детализацией по редиректам и ssl
curl -s -w '\nLookup time:\t%{time_namelookup}\nConnect time:\t%{time_connect}\nAppCon time:\t%{time_appconnect}\nRedirect time:\t%{time_redirect}\nPreXfer time:\t%{time_pretransfer}\nStartXfer time:\t%{time_starttransfer}\n\nTotal time:\t%{time_total}\n' -o /dev/null https://elims.org.ua

  • AppCon time (time_appconnect) - Время, в секундах, с начала замера, до завершения соединения/рукопожатия по протоколу SSL/SSH и пр. с удаленным хостом (Добавлено в curl 7.19.0)
  • Redirect time (time_redirect)  - Время, в секундах, затраченное на редиректы, включая name lookup, connect, pretransfer и transfer. ‘time_redirect’ показывает суммарное время всех редиректов. (Добавлено в curl 7.12.3)

Подсмотрел тут

Узнаем свой внешний IP через curl

Поможет одна из команд:

curl ifconfig.me
curl ip.appspot.com
curl icanhazip.com
curl -s checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
curl -x user:password@192.193.194.145:1234 icanhazip.com #используем прокси

Доступ только к sftp по ключу и паролю к определенной папке

  • Создаем пользователя: "sudo adduser elimS" - будет предложено указать пароль, остальные вопросы можно игнорировать нажатием Enter
  • Генерируем и прописываем SSH ключ:
    • Генерируем:
      • для генерации ключей использовал PuTTYgen
      • выбираем тип ключа RSA (он же SSH2-RSA) и жмем Generate
      • двигаем мышкой на окном утилиты.
      • сохраняем публичную и приватную часть через кнопки Save public key и Save private key
      • утилиту пока не закрываем
    • Прописываем на сервере с созданным пользователем:
      • вводим "su - elimS" - теперь мы в домашней директории нового пользователя
      • создаем папку для ключа и назначаем права, команды: "mkdir ~/.ssh" и "chmod 700 ~/.ssh"
      • создаем файл и заполняем его публичной частью ключа
        • nano ~/.ssh/authorized_keys - открыли файл для создания
        • копируем в него текст из открытой утилиты PuTTYgen, из блока "Public key for pasting into OpenSSH authorized_keys file:". Текст который выделен на скриншоте ниже:
          PuTTY Key Generator
        • Жмем CTRL-X для закрытия файла и y для сохранения, после Enter
      • ограничиваем доступ к файлу с ключем: "chmod 600 ~/.ssh/authorized_keys"
      • выходим для возврата к root, команда "exit"
  • Разрешаем подключаться только к sftp (отключаем консоль ssh) и указываем корневую папку выше которой заходить нельзя:
    • открываем файл конфига ssh: "sudo nano /etc/ssh/sshd_config"
    • находим строку "Subsystem sftp /usr/lib/openssh/sftp-server", ее коментурием (ставим спереди знак решетки #) или удаляем
    • вместо упомянутой выше строки пишем: Subsystem sftp internal-sftp
    • В самый конец файла добавляем и сохраняем:
      Match User elimS
       X11Forwarding no
       AllowTcpForwarding no
       AllowAgentForwarding no
       PermitTunnel no
       ForceCommand internal-sftp
       ChrootDirectory %h #разрешаем доступ только к домашнему каталогу
    • Перезапускаем ssh: sudo service ssh restart
    • Назначаем права домашней папке командами:
      • chown root:elimS /home/elimS
      • chmod 750 /home/elimS
    • В домашней папке созданного пользователя можно создать папку для файлов и дать ей права:
      • mkdir /home/elimS/files
      • chown elimS:elimS /home/elimS/files
      • chmod 755 /home/elimS/files
    • Если нужно дать доступ к папке которая находится за пределами домашнего каталога, монтируем эту папку в домашнюю и даем ей права, например:
      • mkdir images - создали папку в домашней
      • mount --bind /var/www/site.com/images/ /home/elimS/images/ - смонтировали
      • chmod 777 /var/www/site.com/images
      • find /var/www/site.com/images -type f -exec chmod 664 {} +
      • find /var/www/site.com/images -type d -exec chmod 777 {} +
  • При подключении sftp client'ом указываем закрытую часть ключа, логи авторизации можно смотреть так: tail /var/log/auth.log -f
  • Ошибка "fatal: bad ownership or modes for chroot directory "/home/%username%""  может выскакивать по той причине, что в ChrootDirectory указана не та папка, или для нее прописаны не те права

Kali

Обновляем

sudo apt-get clean
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -f install
sudo apt-get dist-upgrade

Ccылки:

Остальное

  • Автоматическое обновление ubuntu:
    • help.ubuntu.com: AutomaticSecurityUpdates - несколько методов как можно настроить автоматическое обновление, один из них это пакет: unattended-upgrades
    • wiki.debian.org: UnattendedUpgrades - тут мне кажется наиболее четко описано как включить автоматические обновление при помощи пакета unattended-upgrades
    • Лог автоматической установки находится по адресу: /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
    • help.ubuntu.ru: Автоматические обновления - еще немного на русском языке
  • How to Increase the size of a Linux LVM by expanding the virtual machine disk - расширение корневого раздела\диска используя возможности LVM
  • Если SSH сессия обрывается: How to disable SSH timeout. Правда я пока обошелся другим советом: в самом putty, в настройках connection указал seconds between keepalives = 30. Проблему решило.
  • Какие сетевые порты и какими сервисами сейчас открыты:  sudo netstat -ltunp или sudo netstat -anp
  • Монтирование:
    • mount -t ext4 /dev/sdd1 /usr/data 
      • -t ext4 — файловая система подключаемого диска
      • /dev/sdd1 — подключаемый раздел
      • /usr/data — папка куда подключается наш раздел (нужно предварительно создать)
    • umount /dev/sdd1 - размонтирование
    • Если Mount пропадает после перезагрузки:
      • mount /dev/sdc1 /media/work
      • tail -1 /etc/mtab >> /etc/fstab
  • Просмотр содержимого текстовых файлов в gz-файле:
    • аналог cat - zcat resume.txt.gz
    • аналог grep - zgrep 'тут_ищем_что_то' access_log_1.gz
    • аналог grep с regex: egrep 'regex1|regex2' access_log_1.gz
  • Тестирование веб-сервера под нагрузкой, пример команды: ab -c 1000 -t 30  -C PHPSESSID=123 https://test.com - 1000 потоков в течении 30 секунд запрашивают страницу https://test.com указав в куки PHPSESSID=123
  • CRON
    • посмотреть лог запуска задач - grep CRON /var/log/syslog
    • добавить задачу для текущего пользователя:
      • crontab -e - откроется конфиг для редактирования
      • */2 * * * * php /home/elimS/test.php >> /home/elimS/logs/test.log - раз в две минуты запускать php-скрипт с перенаправлением вывода в лог-файл
    • посмотреть список задач текущего пользователя: crontab -l
    • crontab.guru - онлайн сервис который поможет составить нужное правило запуска задач по крону
  • Как разукрасить консоль - может пригодится, если у вас запущено сразу несколько сессий на разные хосты, и Вы не хотите их между собой спутать
  • Добавить отметки времени в консоли:
    • открываем файл:  nano ~/.bashrc
    • добавляем строку: export PROMPT_COMMAND="echo -n \[\$(date '+%Y-%m-%d %H:%M:%S')\]\ "
    • изменения будут после перелогинивания, либо перезапуска консоли
  • Перенаправление вывода в файл и на экран одновременно: some_command parameters | tee -a logfile.txt
  • Слушаем весь трафик кроме своего айпи по ssh: sudo tcpdump -n -i eth0 not host 1.2.3.4
  • Посмотреть ACL права на папку:  getfacl directory
  • Смотрим список прослушиваемых портов и какие сервисы слушают:
    • netstat -ap tcp | grep -i "listen"
    • sudo lsof -PiTCP -sTCP:LISTEN
  • Обновляемся:
    1. sudo apt-get update - обновляем список пакетов
    2. sudo apt-get upgrade - обновляем установленные пакеты до последних версий
    3. sudo apt-get dist-upgrade - обновляем затронутые зависимости пакетов, добавляя или удаляя при необходимости, могут обновиться пакеты, которые не обновились в результате apt-get upgrade
  • OpenVPN
  • How to run sudo command without a password on a Linux or Unix
  • tail -qF *.log: -q to hide the file names and -F, as Arcege pointed out, to let tail follow the name rather than the descriptor because my log files are being rotated
  • Varnish:
  • Оптимизация Magento
  • Компиляция и установка программ из исходников
  • Скачать git-проект в папку (подсмотренно):  git clone https://github.com/<user name>/<repository name> <different name>
  • Найти php.ini - команда php --ini
  • Посмотреть информацию о процессорах:
    • less /proc/cpuinfo
    • lscpu
    • nproc
  • Поиск вхождения текста в файлы (подсмотрено тут): grep --exclude-dir={'session','cache'} -rnwi '/var/www/html/' -e "elims"
    • -r или -R - рекурсивно по папкам
    • -n - отображает номер строки
    • -w - должно быть целым словом, а не частью
    • -i - регистронезависиммый
  • архивируем по маске: tar -zcvf /home/elims/reports/reports201812.tar.gz /home/elims/reports/*201812*.csv
  • Исправление зависимостей, Unmet dependencies:
    • sudo apt-get clean - удаляем кеш пакетов
    • sudo apt-get autoremove - удаляем осиротевшие пакеты
    • sudo apt-get update - обновляем список пакетов
    • sudo apt-get -f install - исправляем зависимости
  • Как включить swap на ubuntu 18.04
  • Создание разделов с помощью fdisk
  • переносим home на отдельный диск:
    • обязательно делаем бекап системы!
    • mount /dev/sda2 /mnt
    • cp -av /home/* /mnt
    • mv /home /old.home
    • mkdir /home
    • umount /dev/sda2
    • mount /dev/sda2 /home
    • rm -rf /old.home
  • Разделы жесткого диска и файловые системы, структура папок
  • Меняем ip на статический в Ubuntu LTS 18.04
  • Если при попытке пинговать, обращаться к ipv6 получаем ошибку "connect: Network is unreachable", пробуем установить: sudo apt-get install miredo - утилита для работы с Teredo — протоколом для передачи IPv6 пакетов через IPv4 сети.
  • Очистка диска если забилось /usr/src/*linux-headers*:
    • apt-get autoremove (1,2)
    • sudo apt clean (1)
  • Чистим /tmp - сносим файлы (не папки), к которым не доступались более 10 дней: sudo find /tmp -type f -atime +10 -delete
  • Быстро удаляем много файлов по маске (хабр): find /home/elims/ -name "*.png" -type f -exec rm -v {} \;
  • Перемещаем файлы старше 500 дней: find /var/www/uploads/ -mtime +500 -print -exec mv '{}' /home/elimS/backup/ \;

Почта

Для отправки письма из командной строки с указанием отправителя, необходимо после получателя добавить перед адресом отправителя последовательность символов: "-- -f"

Пример:

$ mail -s "Test Message Subject" user@yourmaildomain.com -- -f from_user@yourmaildomain.com

Это будет работать в centos, в debian или ubuntu нужно указывать так:

# echo "Test Message Body" | mail -s "Test Message Subject" получатель@gmail.com -aFrom:отправитель@elims.org.ua

Можно также указать имя отправителя:

# echo "Test Message Body" | mail -s "Test Message Subject" получатель@gmail.com -aFrom:Имя_отправителя\<Отправитель@elims.org.ua\>

Обратите внимание, что мы экранируем угловые скобки.

Для отправки письма с вложениями нужно использовать mutt (apt-get install mutt):

mutt -s "Hello World" -a /home/user/attach_file.zip elims@elims.org.ua < home/user/mail_text_body.txt

Centos: exim + dovecot и добавление в белый список спам защиты

В конфиге exim смотрим на строку

hostlist skipsmtpcheck_hosts = net-iplsearch;/etc/skipsmtpcheckhosts

и редактируем файл  /etc/skipsmtpcheckhosts, указываем ip-сети отправителей для исключения:

10.20.30.40/27
1.2.3.4/32

перед этим заглянуть в файл /etc/trustedmailhosts - посмотреть чтобы там не были уже прописаны эти адреса

и перезапускаем сервис: /scripts/restartsrv_exim

Полезные ссылки касательно почты:

Оптимизируем изображения

sudo find /var/www/wp-content/uploads/ -type f -name "*.jpg" -exec jpegoptim --strip-all '{}' \;
sudo find /var/www/wp-content/uploads/ -type f -name "*.jpg" -exec jpegoptim -m81 --strip-all '{}' \;
#-m81 - уровень сжатия, оптимальный для google speed insight

sudo find -name *.png -exec optipng -o3 '{}' \; 
# -o3 - уровень сжатия, может быть от 1 до 7

Полезная ссылка:

Filezilla SFTP Upload: permission denied - устраняется ошибка двумя командами:

sudo chmod -R 775 /var/www/Адрес_к_папке
sudo usermod -a -G www-data your_username

Пример копирования файлов между серверами

sudo rsync -e "ssh -i /home/user/temp/key.pem" -avzh /var/www/html/. ubuntu@172.11.7.3:/home/ubuntu/temp
rsync -rvh -e "ssh -p 22222" user@1.2.3.4:/var/www/. /var/www
scp -P 22222 -rp user@1.2.3.4:/var/www/catalog.zip /var/www
rsync -rvh /var/www/src/. --rsync-path="sudo rsync" -e "ssh -p 22" ваш_логин@1.2.3.4:/var/www/dst

Посмотреть кто сожрал место

mount | grep sda1

If /dev/sda1 is mounted on / ("root"):

du --max-depth=1 --human-readable / | sort --human-numeric-sort

For instance, if your username is ubuntu and you want to inspect your home directory:

du -d1 -h /home/ubuntu | sort -h

Cмотрим занимаемое место в (-s) папках корня (/*) в читаемом виде (-h):

sudo du -s -h /* | sort -h

Утилита ncdu мне больше всего понравилась:

If you want to scan a full filesystem, your root filesystem, for example, then you’ll want to use ncdu -x /

Смена имени хоста

Необходимо два файла:

  • /etc/hostname - в этом файле указать новое имя хоста
  • /etc/hosts - в этом файле добавить или изменить строчку, которая следует после 127.0.0.1 localhost:
127.0.0.1 localhost 
127.0.1.1 новое_имя

Адрес 127.0.0.1 используется для преобразования localhost в ip, а адрес 127.0.1.1 для преобразования имени хоста в ip.

И после этого перегрузится.

Если нужно без перезагрузки, то на вот тут на askubuntu.com есть различные варианты без перезагрузки, но я их не тестил.

В очередь на прочтение:

Курсы интуит

1. Программирование для Linux. Профессиональный подход (2003/PDF)
rutracker.org/forum/viewtopic.php?t=3815723
2. Основы работы с ОС Linux (2008/PDF)
rutracker.org/forum/viewtopic.php?t=3906760
3. Linux. Системное программирование (2008/PDF)
rutracker.org/forum/viewtopic.php?t=3910453
4. Инструменты в Linux для программистов из Windows (2011/PDF)
rutracker.org/forum/viewtopic.php?t=3912102
5. Введение в Linux (2007/PDF)
rutracker.org/forum/viewtopic.php?t=4116263
6. Unix и Linux. Руководство системного администратора (2012/DjVu)
rutracker.org/forum/viewtopic.php?t=4137584
rutracker.org/forum/viewtopic.php?t=11741

help.ubuntu.ru/wiki/главная

Прочтено:

  • 2012.10.08 Руководство по переходу на Ubuntu 10.04 LTS «Lucid Lynx» Неворотин Вадим. 1 сентября 2010. 179 стр. - help.ubuntu.ru/manual

IPTABLES

Блокировка исходящего трафика проходящего через мой домашний роутер

  • iptables -I FORWARD -s 192.168.1.215 -j DROP - блокируем исходящий трафик с IP в локальной сети
  • iptables -D FORWARD -s 192.168.1.215 -j DROP - удаляем блокировку
  • iptables -L - смотрим список правил

Посмотреть в читабельном виде только http headers через tcpdump:

sudo tcpdump -A -s 10240 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

подсмотрено тут: serverfault.com

Полезные ссылки:

Понравилось? =) Поделись с друзьями:

Обсудить