Linux - uniqcle/DevOps GitHub Wiki

Welcome to the Linux wiki!

Ставим alias для перехода в каталог

nano ~/.bashrc
alias project='/var/www/yii2.loc/project'  # Устанавливаем alias
unalias project                            # Удаляем alias
//Обязательно переоткрыть терминал

Basics

Directories

ls

ls                       # Выводит список содержимого директории
ls -a                    # вывод информации обо всех файлах
ls -l                    # получить более подробный список файлов
ls -h                    # выводит числовые значения (соответствующие размерам файлов) в формате в удобочитаемом виде 

cd (change directory)

pwd                      # текущее местонахождение
cd ~                     # переход в домашнюю директорию.
cd ..                    # На уровень вверх
cd --                    # шаг назад

Переход по строке

Ctrl + A                 # в начало строки
Ctrl + E                 # в конец строки
Alt + B                  # на слово назад
Alt + F                  # на слово вперед
Ctrl + F                 # на слово вперед / Если не работают стрелочки в к-л терминале
Ctrl + B                 # на слово назад /аналогично
Ctrl + K                 # вырезаем от курсора до конца строки
Ctrl + U                 # вырезаем от курсора до начала строки
Alt + Backspace          # вырезаем слово слева от курсора
Alt + D или Alt + Delete # вырезаем справа от курсора
Ctrl + Y                 # вставка
Clear = Ctrl +L
History                  # просмотр истории

Размер папки

du -sh [путь]   # Размер папки
du -sh *        # Размер всех папок в текущей

mkdir (make directory)

mkdir                                  # Создание
mkdir назвПапки                        # Создание папки
cd !$                                  #Перемещение в эту же созданную папку

mkdir app/css/button -p                # Создание дерева каталогов. Обязат. с тегом –p (создание если нет родительского каталога)
mkdir app/{js,css} -p

mkdir test1 test2                     # Также можно так. 

cp (copy)

cp -r НазвПапки НазвПапки             # Копирование папки

rmdir (remove directory)

rmdir назвПапки                      # Удаление только пустую папку
rm -rf назвПапки                     # Удаление непустую папку.  
rmdir -p test42/subdir               # Для рекурсивного удаления директорий

Files

file

file namefile.png             # определяет тип файла

touch

touch index.html  main.css common.js   # Создание пустого файла/файлов

rm

rm BigBattle.txt                         # Удаление файла навсегда
find . -name "*.log" -print | xargs rm   # Удаление файлов в текущей директ. если rm -rf * выдает ошибку argument too long...

cp

cp названФайла пунктНазнач   #Копирование файла
cp css/* .                   #Копирование всех файлов в css в текущую директорию .
# копирования множества файлов в одну директорию.  
# В этом случае последний аргумент (аргумент, указывающий на цель) должен быть представлен путем к директории
cp file42 file42.copy dir42/
cp -i SinkoDeMayo file42     # Для предотвращения перезаписи существующих файлов 
cp: переписать "file42"? n

mv

mv index.html  app           # Перемещение файла index.html в папку app
mv index1.html index2.html   # Переименование файлов

Работа с содержимым файлов

head

head /etc/passwd             # вывод первых десяти строк файла
head -4 /etc/passwd          # вывода первых n строк файла

tail

tail /etc/services           #  вывод последних десяти строк файла

cat

cat /etc/resolv.conf         # копирует данные из стандартного потока ввода в стандартный поток вывода
cat part1 part2 part3        # объединение файлов в рамках файла большего объема 
cat > winter.txt             # создания txt-файлов. 
# После ввода последней строки текста нажмите и удерживайте клавишу Ctrl и одновременно с этим кратковременно нажмите клавишу d
cat winter.txt > cold.txt    # копирование файлов

Terminal

Операторы управления

Точка с запятой (;)

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

# Исполняются поочередно, как будто с новой строки. Command2 ожидает выполнения Command1
echo command1; echo command2 

Двойной амперсанд (&&)

Интерпретирует символы && как логический оператор "И". Если 1-я команда завершится удачно, то выполнится 2-ая.

rm fil1.txt && apt-get update
apt-get update

Двойная вертикальная черта (||)

Представляет логическую операцию "ИЛИ". 2я команда исполнится, если 1-ая не исполнится

rm afsdffd || echo hello
hello

Экранирование специальных символов ()

echo hello \; world
hello ; world

echo \\ \# \" \' \&
\ # " ' &

Обратный слэш в конце строки

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

echo Данная строка команды \
> разделена на три \
> части
Данная строка команды разделена на три части

Переменные командной оболочки

$HOSTNAME, $USER, $UID, $SHELL и $HOME # Стандартные переменные окружения
$PATH                                  # Устанавливает путь где ищутся бинарные файлы
varName=544                            # Создаем переменную окружения
echo $varName                          # Выводим переменную окружения
export MyVar                           # экспортируем $MyVar в дочерние командные оболочки
env                                    # проверка переменных окружения какие есть
env > ~/environment                    # экспорт переменных окружения в файл ~/environment 

Формирование списков имен файлов на основе шаблонов

*(звездочка) любая комбинация символов

ls file*
file12 fileab file34

? соответствует ровно одному символу имени файла

ls file4?
file45

[] любые символы находящиеся в скобках

ls file[a]bc
fileabc
ls file[a-z]bc
fileabc

Фильтры

grep фильтрация строк текста, содержащих (или не содержащих) определенную подстроку.

cat count | grep one #  файл count содержит подстроку one
grep one count       # аналогично, только без cat
grep -i one count    # фильтрация без учета регистра
grep -v one count    # не содержит заданную подстроку

tr преобразование символов

cat count | tr 'w' 'D'     # Преобразует символы w в D
cat count | tr 'a-z' 'A-Z' # Преобразует все символы нижн. регистра в верхние
cat count | tr -d 'w'      # Удаление заданного символа

wc подсчет строк, слов и символов

wc count    # все подсчитывает
wc -l count # подсчет строк
wc -w count # подсчет слов
wc -c count # подсчет символов

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

sort count

uniq

sort count | uniq    # удаляет повторяющиеся строки из отсортированного списка строк
sort count | uniq -c # подсчет повторяющихся строк

sed (расшифровывается как stream editor - редактор потока данных) позволяет выполнять различные операции редактирования при обработке потока данных с задействованием регулярных выражений

cat count | sed 's/one/three/g' # меняет one на three g глобально
cat count | sed '/one/d'        # удаляет заданную строку со вхождением one

Утилиты

find <папка> -name "<файл>" поиск файлов в указанной папке

find / > allfiles.txt  # поиск всех файлов и запись их в файл
find .  -name "*.conf" # поиск файлов с расширением .conf в текущей директории (и всех поддиректориях)

grep "<строка>" file поиск строки в файле

grep "hello" file.txt     # Найти hello в файле file.txt
grep -c "hello" file.txt  # Найти кол-во сколько раз встречается hello
grep -r "hello" folder    # Найти строчку во всех файлах в папке
grep -r -c "hello" folder # Сколько раз встречается строка в папке

Утилиты даты и времени

date
time
cal        # Выведет календарь на текущий месяц
cal 2 2019 # Выведет за февраль 2019

zip - gzip

# zip
zip name_archive name_file1 name_file2 # Имя архива и файлы, кот. будут входить
unzip name_archive                     # Распаковываем, архив при этом не удаляется

# gzip (через промежуточный tar)
tar [назв_архива.tar] [file1] [file2]  # Предварительно помещаем в 1 файл. tar это не архив
gzip назв_архива.tar                   # Теперь упаковываем
gunzip назв_архива.tar.gz              # При распаковке исходный файл удалит

# gzip (напрямую)
tar -czf [name.tar.gz] [file1] [file]  # Сразу создает gz. -create zip file
tar -xzf [name.tar.gz]                 # Распаковывает gzip

#bz2 
tar -cjf [name.tar.bz2] *              # Упаковываем все файлы
tar -xjf [name.tar.bz2]                 # Распаковываем

wget скачивание файлов

wget [ссылка]                            # скачивание файла в текущую папку
wget -P [путь] [ссылка]                  # скачивание файла в путь
wget -c [путь] [ссылка]                  # Возобновление загрузки файла, если была прервана
wget -O name_pic.jpg  [ссылка]           # Cкачать файл и сохранить под данным именем
wget -r -l [5] [ссылка]                  # Рекурсивное скачивание файлов (по умолч.5)
wget -r -l 1 -A jpg, png [ссылка]        # Скачивание файлов определенного типа

Установка и обновление программ

sudo apt-get install программа                 # Установка программ через терминал 
sudo apt-get remove программа                  # Удаление программ через терминал
sudo apt-get update                            # Обновление ссылок на пакеты
sudo apt-get upgrade                           # Обновление установленных пакетов
sudo apt-get install --only-upgrade программа  # Обновление отдельной программы

Server

ssh login@address -p port # Команда входа

Ключи доступа SSH

Client

~/.ssh/id_rsa
~/.ssh/id_rsa.pub

Server

~/.ssh/authorized_keys # Здесь внесен публич. ключ клиента

Генерация ключей SSH

ssh-keygen                    # Создание ключа на клиенте
ls ~/.ssh                     # Просмотр ключей (id_rsa, id_rsa.pub)
ssh-add                       # Сообщить системе о ключе
cat id_rsa.pub                # Открываем публичный ключ и копируем его содержимое
nano ~/.ssh/authorized_keys   # Заходим на сервер и вносим сюда публичный ключ клиента

также добавление pub ключа можно сделать так

ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

Обмен файлами

На сервер scp -P порт путь_на_клиенте логин@адрес_сервера:путь_на_сервере

scp text.txt root@185.178.46.21:/var/www/          # копирование text.txt на сервер
scp -r stepic username@server:~/                   # скопирует на сервер папку stepic вместе с содержимым 

С сервера scp -P порт логин@адрес_сервера:путь_на_сервере путь_на_клиенте

scp root@185.178.46.21:/var/www/www-root/data/www/zoosat.ru/test.txt  . # Копир. в текущую папку с сервера

Процессы

ps                        # посмотреть ваши процессы
top                       # отслеживать процессы в реальном времени
top -u <имя пользователя> # отслеживать процессы этого пользователя 
kill <номер процесса>     # завершить процесс с этим номером
kill -9 <номер процесса>  # “убить” процесс с этим номером
free -h                   # информация об оперативной памяти
nproc                     # количество ядер процессора

Vim

Вход

vim
vim файл

Главные команды

:q                # выход
:help <команда>   # справка
vimtutor          # автотуториал!

2 Режима Insert и Normal

Esc                         # переход в normal
i                           # переход в Insert

Перемещение

# По символам
Стрелочки
h,j,k,l
 
# По словам
w, W                      #  в начало следующего слова
e, E                      # в конец
b, B                      # в начало предыдущего

# По файлу
gg                       # начало файла
G                        # конец
:21<Enter>               # перейти к строке 21 

Удаление

x                       # символ под курсором
X                       # символ до курсора# удалить до конца текущего слова
d$                      # удалить до конца строки
d5w                     # удалить пять слов
dd                      # удалить строку

Копирование

yy                      # Копирование
p                       # Вставка

Поиск и замена

/<текст>               # искать <текст> вперед
?<текст>               # назад
n                      # следующий элемент
N                      # предыдущее
:%s/<что ищем>/<на что меняем>/<флаги> # флаги: g – много замен, с – подтверждение

Отмена/возврат

u                     # отменить последнее действие
<Ctrl+r>              # вернуть отмененное действие

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

:w                      # сохранить изменения
:wq                     # сохранить и выйти
:q!                     # выйти без сохранения
:w <файл>               # сохранить изменения в <файл>

Basic Bash

Создаем программу

vim first.sh
#!/bin/bash    # С помощью чего исполняем
echo "Hello, world!"

Запускаем программу

chmod +x first.sh  # Ставим права на выполнение
./first.sh         # Запускаем
bash first.sh      # или так

Переменные

Запись (перезапись) значения

<имя>=<значение>
path=~/Docs

Чтение

$&lt;имя&gt; или ${<имя>}

path2=$path/file1.txt        # path2=~/Docs/file1.txt
echo “Path is $path2”        # Path is ~/Docs/file1.txt
echo “Path is ${path}2      # Path is ~/Docs2

Аргументы

Передача аргументов скрипту

./script.sh arg1 arg2 arg3 ...

# Обработка внутри скрипта 
$1                  # первый аргумент
$2                  # второй аргумент
.
$0                  # имя скрипта
$#                  # количество аргументов
var1=$1
var2=$2
echo "Переменная 1 = $var1"
echo "Переменная 2 = $var2"

Ветвления IF ELSE

if [[ условие ]]
then
 # действия, если условие истинно
fi

if [[ условие ]]
then
 # действия, если условие истинно
еlse
# действия, если условие ложно
fi

if [[ условие1 ]]
then
 # действия, если условие1 истинно
elif [[ условие2 ]]
then
# действия, если условие1 ложно,
# но условие2 истинно
еlse
 # действия, если оба условия ложны
fi
# Условия (строки) 
-z <строка>        # строка пуста
-n <строка>        # строка не пуста
<стр1> == <стр2>   # строки равны
<стр1> != <стр2>   # строки не равны

# Условия (строки)
==                # равно
!=                # не равно
<                 # меньше
>                 # больше

# Условия (числа)
-eq              # равно
-ne              # не равно
-lt              # меньше
-le              # меньше или равно
-gt              # больше
-ge              # больше или равно

# Условия (файлы) 
-e <путь>       # путь существует
-f <путь>       # это файл
-d <путь>       # это директория
-s <путь>       # размер файла больше 0
-x <путь>       # файл исполняемый

# Условия (логические) 
!              # отрицание логического выражения
&&             # логическое «И»
||             # логическое «ИЛИ»

Ветвления CASE

case переменная in
знач1)
 # действия, если переменная==знач1
 ;;
знач2)
# действия, если переменная==знач2
 ;;
*)
# действия, если переменная
# не равна ни одному из вариантов
;;
esac

FOR

for переменная in список_значений
do
 # действия, каждый раз переменная
 # принимает следующее значение
 # из списка
done
break      # прервать выполнение
сontinue   # перейти на след. значение
#!/bin/bash
for i in  1 2 3 4 5
do      
        file_name=file${i}.txt
        if [[ -e $file_name ]]
        then    
                continue
        fi      
        echo "Creating file $file_name"
        touch $file_name
done  

WHILE

while [[ условие ]]
do
 # действия, пока условие истинно
done
read  # переменная. записать введенное пользователем значение в переменную
#!/bin/bash
again=yes
while [ "$again" = "yes" ]
do
        echo "Please enter your name:"
        read name
        echo "Your name is $name"
        echo "Do you wish to continue? (yes/no)"
        read again
done

Дополнительно

bash-handbook

Port Forwarding

VirtualBox -> Настройки -> Сеть -> Дополнительно -> Проброс портов

Добавляем новое правило

Порт гостя - это порт, на котором работает веб-сервер внутри виртуальной машины. По-умолч., apache работает на 80 порту

Порт хоста - выбираем самостоятельно, главное не попасть в уже используемые. Например, 8081

Остальные поля можно оставить пустые.

После того, как прописали в файле hosts сайты, доступ к нему может быть site.ru:порт

Vagrant

Настройка Vagrantfile с помощью Puphpet

Vagrantfile должен находиться в папке с проектом. В нем инструкции по установке окружения. Установить Ubuntu, nginx, php7.0 и т д.

Для написания Vagrantfile используют сервис https://puphpet.com/

Deploy to Local Host
# MACHINES
# Internal Identifier
m1                # ID машины, с которой будем работать в консоле с помощью команд Vagrant. Лучше кратко называть
# Hostname 
machine1.puphpet  # Имя машины, отображаемое в VirtualBox
# IP Address     
192.168.56.101    # IP адрес Виртуалки. Обычно для VirtualBox этот IP
# Memory
2048              # Добавляем память в мб

# FORWARDED PORTS
Оставляем по-умолчанию

# SHARED FOLDERS
# Folder Source Связываем папки
C:/m2/www        # Папка на host-машине
# Folder Target
/var/www         # Папка на guest-машине
System Packages

Оставляем по-умолч., можно добавить некоторые пакеты

Users & Groups

Оставляем по-умолч.

Locale

Оставляем по-умолч.

Firewall

Оставляем по-умолч.

Resolv

Оставляем по-умолч. Позволяет указывать DNS-сервера для локально. машины. Но бывает из-за нее проблемы, поэтому лучше убрать

Cron Jobs

Оставляем по-умолч.

Custom Files

Оставляем по-умолч.

Install Nginx

Снимаем галочку

Install Apache
# VIRTUAL HOSTS VHOST1
# Server Name
project2.loc       # Имя для веб-сайта
# Server Aliases
www.project2.loc   # Алиас
# Document Root
/var/www/project2.loc/  # Папка, в которой находятся файлы проекта
# Port
80                      # Порт, на котором работает веб-сервер. Оставляем по-умолч.

# VIRTUAL HOST DIRECTORY/LOCATION/FILES DIRECTIVES
# Path
/var/www/project2.loc/

Остальные настройки по-умолч.
Let's Encrypt

Оставляем по-умолч. Спец. программа, чтобы делать защещенные соединения для сайтов

Install PHP

Оставляем по-умолч.

Ruby

Оставляем по-умолч. Это требуется установщику

Python

Оставляем по-умолч.

NODE.JS и Install MariaDB

Оставляем по-умолч.

Install MySQL
# Version
5.7           # Версия MySql
# Root Password
root
# USERS USER1
# Username
remoteadmin   # Создадим дополнит. пользователя
# Password
123456 

# DATABASES
Создавать БД не будем

# GRANTS
# User
remoteadmin   # Дадим пользователю дополнит. права
# Privileges
ALL
Install PostgreSQL, MongoDB, Redis, SQLite, MailHog, Beanstalkd, RabbitMQ, Elastic Search

Оставляем по-умолч.

Далее скачиваем архив puphpet.zip с Vagrantfile

Развертываем окружение с помощью Vagrantfile

  1. Распаковываем архив и содержимое папки 0UGhr0 переносим в проект project2

  2. Проверить пользователя и группу на www-data в файле 0UGhr0/puphpet/config.yaml (где 0UGhr0 - папка из архива конфигуратора):

...
synced_folder:
    folder1:
        owner: www-data
        group: www-data
...
  1. Переходим в папку с проектом cd C:\m2\www\project2\

  2. Поднимаем виртуальную машину vagrant up

Команды Vagrant

vagrant global-status  # Просмотр список запущенных виртуальных машин
vagrant halt [id]      # Остановка машины
vagrant up [id]        # Запуск машины
vagrant ssh            # Зайти на сервер
vagrant destroy [id]   # удалить виртуалку

Sphinx

Commands

searchd                # Запустить Sphinx search
searchd --stop         # Остановить Sphinx search
indexer --all          # Выполнить индексацию
indexer --rotate --all # Переиндексация без переустановки демона
searchd --status       # Статус Sphinx search
searchd --help         # Помощь по командам 

Sphinx YII

Sphinx решает проблемы производительности

Installing & Configuring Server

sudo add-apt-repository ppa:builds/sphinxsearch-rel22  //Добавляем репозиторий
sudo apt-get update                                    //Выполняем обновление
sudo apt-get install sphinxsearch                      //Установка
sudo service sphinxsearch start                        //Запускаем процесс

Она запускает индексы, но для того, чтобы сфинкс знал какие индексы создавать необходимо сконфигурировать

  • Открываем папку /etc/sphinxsearch в ней sphinx.conf
  • Сохраняем старый под другим именем mv sphinx.conf sphinx_old.conf
  • Создаем новый nano sphinx.conf
source news_content
{
  type          = mysql
  sql_host      = localhost
  sql_user      = yii2user
  sql_pass      = 111111
  sql_db        = yii2advanced
  sql_port      = 3306
  sql_query     = \
  SELECT id, content \
  FROM news
  #sql_query     = \
  #SELECT id, content, status, content as content_attribute \
  #FROM news
  #sql_attr_uint = status
  #sql_attr_string = content_attribute
}
index idx_news_content
{
  source            = news_content
  path              = /var/lib/sphinxsearch/data/test1
  docinfo           = extern
  charset_type      = sbcs
}
searchd
{
  listen            = localhost:9306:mysql41
  log               = /var/log/sphinxsearch/searchd.log
  query_log         = /var/log/sphinxsearch/query.log
  read_timeout      = 5
  max_children      = 30
  pid_file          = /var/run/sphinxsearch/searchd.pid
  max_matches       = 1000
  seamless_rotate   = 1
  preopen_indexes   = 1
  unlink_old        = 1
  binlog_path       = /var/lib/sphinxsearch/data
}
  • Останавливаем процесс Sphinx перед процедурой создания индекса

sudo service sphinxsearch stop

  • Запускаем индекс

sudo indexer --all

Возможно будут возникать Warnings, лучше обновиться до 3-й версии Sphinx'a

  • Запускаем процесс

sudo service sphinxsearch start

Configuring Yii2

https://github.com/yiisoft/yii2-sphinx

  1. Устанавливаем

В папке с проектом запускаем composer require --prefer-dist yiisoft/yii2-sphinx

  1. Настраиваем

Подключаем проект к программе Sphinx

frontend/config/main-local.php

'components' => [
     'sphinx' => [
        'class' => 'yii\sphinx\Connection',
        'dsn' => 'mysql:host=127.0.0.1;port=9306;dbname=yii2advanced',
        'username' => 'yii2user',
        'password' => '111111',
    ],
    ...
],

Developing

...

Bitrix

source bx_content
{
  type          = mysql
  sql_host      = localhost
  sql_user      = user
  sql_pass      = !PassWord!2020
  sql_db        = bitrixdb
  sql_port      = 3306
  sql_query     = SELECT NAME FROM b_iblock_element;
  #sql_query     = \
  #SELECT id, content, status, content as content_attribute \
  #FROM news
  #sql_attr_uint = status
  #sql_attr_string = content_attribute
}
index idx_bx_content
{
 # source            = bx_content
 # path              = path = /var/lib/sphinxsearch/data
 #  docinfo           = extern
 # charset_type      = sbcs

     #main settings
        type = rt
        path = /var/lib/sphinxsearch/data/bitrix
        docinfo = inline
    #choose appropriate type of morphology to use
        #morphology = lemmatize_ru_all, lemmatize_en_all,  stem_enru
        morphology = stem_enru, soundex
    #these settings are used by bitrix:search.title component
        dict = keywords
        prefix_fields = title
        infix_fields=
        min_prefix_len = 2
    #all fields must be defined exactly as followed
        rt_field = title
        rt_field = body
        rt_attr_uint = module_id
        rt_attr_string = module
        rt_attr_uint = item_id
        rt_attr_string = item
        rt_attr_uint = param1_id
        rt_attr_string = param1
        rt_attr_uint = param2_id
        rt_attr_string = param2
        rt_attr_timestamp = date_change
        rt_attr_timestamp = date_to
        rt_attr_timestamp = date_from
        rt_attr_uint = custom_rank
        rt_attr_multi = tags
        rt_attr_multi = right
        rt_attr_multi = site
        rt_attr_multi = param
}
searchd
{
    listen = 127.0.0.1:9312
    listen = 127.0.0.1:9306:mysql41
    log       = /var/log/sphinxsearch/searchd.log
    query_log   = /var/log/sphinxsearch/query.log
    read_timeout  = 5
    max_children  = 30
    pid_file    = /var/run/sphinxsearch/searchd.pid
    ##max_matches   = 1000
    seamless_rotate = 1
    preopen_indexes = 1
    unlink_old    = 1
    workers     = threads # for RT to work
    binlog_path   = /var/lib/sphinxsearch/data/
    binlog_max_log_size = 512M
    binlog_flush    = 2
    rt_flush_period   = 3600
}
⚠️ **GitHub.com Fallback** ⚠️