# Linux useful

- [Linux useful](#linux-useful)
  - [Текущая директория сервера в браузере по адресу `http://server_ip:8000/`](#текущая-директория-сервера-в-браузере-по-адресу-httpserver_ip8000)
  - [Запустить графическое приложение через ssh соединение `-Y`](#запустить-графическое-приложение-через-ssh-соединение--y)
  - [Отобразить все группы пользователя\*\*](#отобразить-все-группы-пользователя)
  - [SSH соединение через промежуточный хост\*\*](#ssh-соединение-через-промежуточный-хост)
  - [SSH соединение без проверки подлинности ключа и его сохранения](#ssh-соединение-без-проверки-подлинности-ключа-и-его-сохранения)
  - [Изменить первичную группу пользователя в текщем сеансе](#изменить-первичную-группу-пользователя-в-текщем-сеансе)
  - [Сохранить man в pdf](#сохранить-man-в-pdf)
  - [Прервать выполнение команды через 5 секунд](#прервать-выполнение-команды-через-5-секунд)
  - [Инфо об ОС](#инфо-об-ос)
  - [Выполнить команду несколько раз в цикле](#выполнить-команду-несколько-раз-в-цикле)
  - [Конвертировать изоражения heic в jpg](#конвертировать-изоражения-heic-в-jpg)
  - [Конвертировать jpg в pdf](#конвертировать-jpg-в-pdf)
  - [получить UUID диска для монтирования](#получить-uuid-диска-для-монтирования)
  - [Сброс пароля root](#сброс-пароля-root)
  - [Проверить доступность диапазона хостов](#проверить-доступность-диапазона-хостов)
  - [Конвертировать pdf в png](#конвертировать-pdf-в-png)
  - [Узнать загрузку процессора определённым процессом](#узнать-загрузку-процессора-определённым-процессом)
  - [Определить страну, город и др. детали по IP](#определить-страну-город-и-др-детали-по-ip)
  - [Отобразить файл без комментариев и путых строк](#отобразить-файл-без-комментариев-и-путых-строк)
  - [Изменить консольный редактор по-умолчанию](#изменить-консольный-редактор-по-умолчанию)
  - [Перенос строк в nano](#перенос-строк-в-nano)

***

## Текущая директория сервера в браузере по адресу `http://server_ip:8000/`

```bash  
python -m SimpleHTTPServer  
```  

[вверх](#linux-useful)

***

## Запустить графическое приложение через ssh соединение `-Y`
  
*для текущей сессии*

```bash  
ssh -Y pi@server_ip  
```  

*для всех подключений*    

`ForwardX11 yes` в файле `/etc/ssh/ssh_config`    

[вверх](#linux-useful)

***

## Отобразить все группы пользователя**

```bash  
da2001@Metromint:~$ groups da2001  
da2001 : da2001 adm cdrom sudo dip plugdev kvm lpadmin sambashare wireshark libvirt  
```  

[вверх](#linux-useful)

***

## SSH соединение через промежуточный хост**

```bash  
ssh -t pi@192.168.89.2 ssh da2001@192.168.1.8  
```  

*сначала будет запрошен пароль от 192.168.89.2, затем от 192.168.1.8*  

[вверх](#linux-useful)

***

## SSH соединение без проверки подлинности ключа и его сохранения

```bash  
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no admin@192.168.2.1  
```  

[вверх](#linux-useful)

***

## Изменить первичную группу пользователя в текщем сеансе

```bash  
[lisa@server1 ~]$ groups  
lisa account sales  
[lisa@server1 ~]$ newgrp sales  
[lisa@server1 ~]$ groups  
sales lisa account  
[lisa@server1 ~]$ touch file1  
[lisa@server1 ~]$ ls -l  
total 0  
-rw-r--r--. 1 lisa sales 0 Feb 6 10:06 file1  
```  

*теперь все новые файлы будут принадлежать группе sales*  

[вверх](#linux-useful)

***

## Сохранить man в pdf

```bash  
man -t <программа> | ps2pdf - <filename>.pdf  
```  
  
```bash  
man -t tar | ps2pdf - tar_man.pdf  
```  

[вверх](#linux-useful)

***

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

```bash  
timeout 5s command  
```  

[вверх](#linux-useful)

***

## Инфо об ОС

```bash  
cat /etc/*release  
```  
  
```bash  
cat /etc/issue  
```  
  
```bash  
uname -a  
```  
  
```bash  
cat /etc/lsb-release  
```  
  
```bash  
da2001@Metromint:~$ neofetch   
             ...-:::::-...                 da2001@Metromint   
          .-MMMMMMMMMMMMMMM-.              ----------------   
      .-MMMM`..-:::::::-..`MMMM-.          OS: Linux Mint 20.1 x86_64   
    .:MMMM.:MMMMMMMMMMMMMMM:.MMMM:.        Host: VivoBook_ASUSLaptop X570DD_M570DD 1.0   
   -MMM-M---MMMMMMMMMMMMMMMMMMM.MMM-       Kernel: 5.8.0-59-generic   
 `:MMM:MM`  :MMMM:....::-...-MMMM:MMM:`    Uptime: 1 day, 1 hour, 41 mins   
 :MMM:MMM`  :MM:`  ``    ``  `:MMM:MMM:    Packages: 2750 (dpkg)   
.MMM.MMMM`  :MM.  -MM.  .MM-  `MMMM.MMM.   Shell: bash 5.0.17   
:MMM:MMMM`  :MM.  -MM-  .MM:  `MMMM-MMM:   Resolution: 1920x1080   
:MMM:MMMM`  :MM.  -MM-  .MM:  `MMMM:MMM:   DE: Cinnamon   
:MMM:MMMM`  :MM.  -MM-  .MM:  `MMMM-MMM:   WM: Mutter (Muffin)   
.MMM.MMMM`  :MM:--:MM:--:MM:  `MMMM.MMM.   WM Theme: Mint-Y-Dark (Mint-Y-Dark)   
 :MMM:MMM-  `-MMMMMMMMMMMM-`  -MMM-MMM:    Theme: Mint-Y-Darker [GTK2/3]   
  :MMM:MMM:`                `:MMM:MMM:     Icons: Papirus-Dark [GTK2/3]   
   .MMM.MMMM:--------------:MMMM.MMM.      Terminal: gnome-terminal   
     '-MMMM.-MMMMMMMMMMMMMMM-.MMMM-'       CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile Gfx (8) @ 2.100GHz   
       '.-MMMM``--:::::--``MMMM-.'         GPU: NVIDIA GeForce GTX 1050 Mobile   
            '-MMMMMMMMMMMMM-'              GPU: AMD ATI 05:00.0 Picasso   
               ``-:::::-``                 Memory: 4924MiB / 5952MiB   
  
```  

[вверх](#linux-useful)

***

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

```bash  
da2001@Metromint:~$ for i in {1..5}; do echo $i; done  
1  
2  
3  
4  
5  
```

*выполнение скрипта с параметрами в цикле*  
```bash

for i in {1..20}; do ./wlt_start.py -c config_m716.cfg; done  
```  

[вверх](#linux-useful)

***

## Конвертировать изоражения heic в jpg

```bash  
sudo apt-get install libheif-examples  
```  

*для конвертации одного изображения*

```bash
heif-convert IMG_1234.HEIC IMG_1234.jpg  
```

*для конвертации всех изображений в папке*

```bash
mkdir jpg  
for file in *.heic; do heif-convert $file ./jpg/${file/%.heic/.jpg}; done  
```  

[вверх](#linux-useful)

***

## Конвертировать jpg в pdf

*необходим установленный ImageMagick*

```bash
sudo apt install imagemagick  
```

*для конвертации одного изображения*

```bash
convert image.jpg out.pdf  
```

*для конвертации нескольких изображений*

```bash

convert image1.jpg image2.jpg image3.jpg out.pdf  
```

***если в процессе конвертации будет получено сообщение об ошибке***

```bash
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
```

в файле `/etc/ImageMagick-7/policy.xml` необходимо изменить директиву доступа  
*название папки ImageMagick-7 может отличаться в зависимости от установленной версии*  
между тегами `<policymap>` и `</policymap>`  
добавить/отредактировать

```bash
<policy domain="coder" rights="read | write" pattern="PDF" />  
```  

[вверх](#linux-useful)

***

## получить UUID диска для монтирования

**Вариант 1**

```bash  
lsblk -n -o uuid /dev/sda1  
```

-n - не выводить заголовки  
-o - отображаемое поле  
*таким образом, для раздела с ФС ext4, запись в fstab можно добавить таким образом*

```bash  
mkdir /mntdir  
  
UUID=`lsblk -n -o uuid /dev/sda1`  
sudo bash -c 'echo "UUID=$UUID /mntdir  ext4  defaults  0 0" >> /etc/fstab'
```  

**Вариант 2**

```bash
[root@server1 ~]# blkid -o export /dev/sda2 | grep '^UUID'
UUID=d056212f-b1ea-4bc5-ba4e-99d036e5531e
```

*таким образом, можно перенаправить вывод в `/etc/fstab` и руками дополнить параметры монтирования*  

```bash
blkid -o export /dev/sda2 | grep '^UUID' >> /etc/fstab
```

[вверх](#linux-useful)

***

## Сброс пароля root
  
**CentOS/RedHat Linux**  

1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки  
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)  
3. После появления приглашения консоли необходимо получить доступ к образу системы

```bash  
mount -o remount,rw /sysroot  
```

- Изменить корневой каталог

```bash
chroot /sysroot  
```

- Теперь можно изменить пароль root

```bash  
passwd  
```

будет предложено ввести новый пароль дважды.

Поскольку на ранней стадии загрузки SELinux еще не был активирован, тип контекста в `/etc/shadow` будет перепутан. Если сейчас перезагрузиться, никто не сможет войти в систему. Поэтому необходимо убедиться, что тип контекста установлен правильно. Для этого на этом этапе нужно загрузить политику SELinux с помощью команды

```bash  
load_policy -i  
```

- Теперь нужно вручную установить правильный тип контекста в `/etc/shadow`.

```bash  
chcon -t shadow_t /etc/shadow  
```

**вместо 6,7 пунктов можно просто в корне создать файл `.autorelabel`**

```bash  
touch /.autorelabel  
```  
  
Всё, после перезагрузки, у root будет новый пароль.  
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*

```bash  
reboot -f  
```  
  
**Debian**

1. В самом начале загрузки системы, когда появляется меню GRUB, необходимо нажать `e`, чтобы попасть в настройку загрузки  
2. В строке загрузки ядра, которая начинается со слова `linux` в конец добавить `rd.break`, затем нажать Ctrl+x, для применения сделанных настроек и загрузки системы (внесенные изменения действуют только в текущей сессии загрузки)  
3. После появления приглашения консоли необходимо получить доступ к образу системы

```bash  
mount -o remount,rw /  
```

Теперь можно изменить пароль root

```bash  
passwd  
```

будет предложено ввести новый пароль дважды.  
Всё, после перезагрузки, у root будет новый пароль.  
*для перезагрузки в данном режиме необходимо дважды ввести `reboot -f` или Ctrl+d*

```bash  
reboot -f  
```  

[вверх](#linux-useful)

***

## Проверить доступность диапазона хостов

```bash  
for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done  
```  
  
```bash  
[da2001@co1 ~]$ for i in {10..13}; do ping -c 2 192.168.1.$i > /dev/null && echo 192.168.1.$i - доступен || echo 192.168.1.$i - НЕ доступен; done  
192.168.1.10 - доступен  
192.168.1.11 - доступен  
192.168.1.12 - доступен  
192.168.1.13 - НЕ доступен  
```  

[вверх](#linux-useful)

***

## Конвертировать pdf в png

```bash  
pdftoppm input.pdf outputname -png
```

*в результате каждая страница в PDF будет сохранена в формате outputname-01.png, где 01 будет номером страницы*    
**Конвертировать одну страницу или диапазон**

```bash  
pdftoppm input.pdf outputname -png -f {page} -singlefile
```

*Измените `{page}` на номер страницы. Он проиндексирован как 1, поэтому `-f 1` будет первой страницей.*  

*Если вы хотите работать с диапазоном страниц, вы также можете указать номер для флага `-l` (последняя страница), поэтому при использовании `-f 1 -l 30` будут указаны страницы от 1 до 30.*  
  
**Указать разрешение преобразованного изображения**  
*Разрешение по умолчанию для этой команды составляет 150 точек на дюйм.*  
  
*Чтобы увеличить разрешение преобразованного PDF-файла, добавьте параметры `-rx` {разрешение} и `-ry` {разрешение}.*

```bash
pdftoppm input.pdf outputname -png -rx 300 -ry 300
```

[вверх](#linux-useful)

***

## Узнать загрузку процессора определённым процессом

**ps**  
*по имени процесса*

```bash
ps -C iperf -o %cpu=
```

*по номеру процесса*

```bash
ps -p 23635 -o %cpu=
```

или

```bash
ps -p $(pgrep iperf) -o %cpu=
```

**top**

```bash
top -b -n 2 -d 0.2 -p PID_ID | tail -1 | awk '{print $9}'
```

**Нагрузить процессор для проверки**

```bash
cat /dev/zero > /dev/null
```

[вверх](#linux-useful)

***

## Определить страну, город и др. детали по IP

```bash
curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org' 
```

или функция

```bash
getip() {
    curl -s "https://ifconfig.co/json?ip=$1" | jq -r '.country, .city, .hostname, .asn_org'
}
```

[вверх](#linux-useful)

## Отобразить файл без комментариев и путых строк

```bash
grep -vE '(^[[:space:]]*([#;!].*)?$)' file
```

[вверх](#linux-useful)

## Изменить консольный редактор по-умолчанию

```shell
which nano
/usr/bin/nano

export EDITOR=/usr/bin/nano
```

[вверх](#linux-useful)

## Перенос строк в nano

Для включения переноса строк в текщум редакторе необходимо нажать `Esc` + `$`.

обозначение `Esc` + `$` означает нажатие и отпускание `Esc`, а затем нажатие `$`.

Тогда полная последовательность нажатий клавиш будет `Esc`, `Shift+4`

[вверх](#linux-useful)
