File Managment
Сеть и диагностика

(Проверка соединений, DNS, маршруты, порты)   
    
    ping - проверка доступности хоста и его задержки
    Пример: ping 95.31.10.90
    
    nmap - сканирование портов и устройств в сети
    Пример: nmap 95.31.10.90
    
    nslookup - запрос DNS-записей (A - IPv4; AAAA - IPv6; MX - какой почтовый сервер используется;
    NS - DNS-серверы, отвечающие за домен и хранящие его DNS-записи; PTR - домен по ipv4 или ipv6; TXT - доп. информация, примечания).
    Пример: nslookup -type=MX yandex.ru 8.8.8.8

    dig - расширенный DNS-запрос (детальный вывод)
    Пример: dig @8.8.8.8 yandex.ru MX +short
    
    host - упрощённый DNS-запрос
    Пример: host google.com
    
    traceroute - трассировка маршрута до хоста
    Пример: traceroute chatgpt.com

    mtr - ping + traceroute в реальном времени с отображением потерь пакетов и задержек. Требует sudo
    Пример: sudo mtr yandex.ru

    curl - отправка HTTP/HTTPS-запросов, тестирование API и скачивание данных. (-i = получить тело ответа и HTTP-заголовки;
    -I = получить только HTTP-заголовки; -L = разрешить перенаправление; -X = указать HTTP-метод, по дефолту используется GET;
    -o = сохранить ответ сервера в файл; -d = отправить данные в теле HTTP-запроса; -H = добавить HTTP-заголовок)
    Пример 1: curl -L http://95.31.10.90
    Пример 2: curl -o data.html http://95.31.10.90
    Пример 3: curl -X POST -d "name=test" https://yandex.ru
    Пример 4: curl -X PATCH -H "Content-Type: application/json" -d '{"status": "active"}' https://yandex.ru

    wget - скачивание файлов по HTTP, HTTPS и FTP. (-O = сохранить файл под указанным именем; -q = тихий режим)
    Пример: wget -O plugin.jar "https://www.spigotmc.org/resources/vault.34315/download?version=344916"

    whois - информация о владельце домена или IP
    Пример: whois 95.31.10.90

    ss - открытые сокеты / соединения / порты (нет на macOS). Требует sudo для процессов. (-t = tcp; -u = udp; -l = только слушающие;
    -a = все сокеты; -p = показывать PID и имя процесса, который открыл порт; -r = домены вместо ip; -n = ip вместо доменов)
    Пример: sudo ss -tulpn

    netstat - открытые сокеты / соединения / порты. Требует sudo для процессов. (-t = tcp; -u = udp; -l = только слушающие;
    -a = все сокеты; -p = показывать PID и имя процесса, который открыл порт; -r = таблица маршрутизации; -n = ip вместо dns имен)
    Пример 1: sudo netstat -tuap
    Пример 2: netstat -rn

    ufw - управление firewall (нет на macOS). Требует sudo
        enable = включить firewall
        disable = выключить firewall
        status = показать статус и правила
        status numbered = показать статус и пронумерованные правила
	status verbose = показать статус, дополнительную информацию и правила
        reload = перечитать правила
        reset = удалить все правила
        allow = разрешить соединение
        deny = запретить соединение (без ответа)
        reject = отклонить соединение (с уведомлением)
        delete = удалить правило по номеру
        limit = ограничить частые подключения от одного IP-адреса
        default = установить политику по умолчанию (allow/deny/reject incoming/outgoing/routed)
        app list = список профилей сетевых сервисов
    Пример 1: sudo ufw enable
    Пример 2: sudo ufw reset
    Пример 3: sudo ufw allow 2235/tcp
    Пример 4: sudo ufw reject 2235/tcp
    Пример 5: sudo ufw delete 2
    Пример 6: sudo ufw limit 22/tcp
    Пример 7: sudo ufw default deny incoming
    Пример 8: sudo ufw app list
    Пример с конструкцией from-to: sudo ufw deny from 95.31.10.128/25 to 192.168.88.10 port 22 proto tcp
    (запрещаем соединение по порту 22 с протоколом TCP для айпи сетевого интерфейса 192.168.88.10 от второй 
    половины подсети 95.31.10.0, то есть от 95.31.10.128 - 95.31.10.255)

    route - управление таблицей маршрутизации операционной системы. Требует sudo для изменения маршрутов
        Команды: 
        add = добавить новый маршрут
        delete = удалить существующий маршрут
        change = изменить существующий маршрут
        get = показать маршрут до указанного адреса (маршрутизатор и сетевой интерфейс)
        Параметры:
        -n = не преобразовывать IP-адреса в имена хостов
        -host = создать маршрут для конкретного хоста (одного IP-адреса)
        -net = создать маршрут для целой сети
        -interface = использовать указанный сетевой интерфейс
        -gateway = использовать указанный шлюз
        Пример 1: sudo route -n add -host 172.65.173.152 -interface utun3
        (добавляем маршрут для хоста 172.65.173.152 через сетевой интерфейс utun3, не преобразовывая IP-адреса в имена хостов)
        Пример 2: sudo route delete -net 8.8.8.128/25 -gateway 192.168.1.2
        (удаляем маршрут для второй половины подсети 8.8.8.0, а именно 8.8.8.128 - 8.8.8.255, через маршрутизатор 192.168.1.2)
        Пример 3: sudo route -n change -host 95.31.10.90 -gateway 192.168.1.1
        (изменяем маршрут для хоста 95.31.10.90, изменяя адрес маршрутизатора с прежнего на 192.168.1.1, не преобразовывая IP-адреса в имена хостов) 
        Пример 4: route -n get 8.8.8.8
        (получаем маршрут из таблицы маршрутизации для адреса 8.8.8.8, не преобразовывая IP-адреса в имена хостов)

    ifconfig - просмотр и настройка сетевых интерфейсов. (-a = показать все интерфейсы; up = включить интерфейс; down - отключить интерфейс)
    Пример 1: ifconfig en0
    Пример 2: sudo ifconfig en0 down

    ssh - безопасное подключение к удаленному серверу. (-p = указать порт; -i = использовать конкретный приватный ключ; -C = сжатие)
    Пример 1: ssh -p 2235 -i ~/id_rsa kmmax@95.31.10.90
    Пример 2: ssh -C root@95.31.10.90 

    scp - безопасное копирование файлов между хостами через SSH. (-P = указать порт; -i = использовать конкретный приватный ключ;
    -C = сжатие; -l = ограничить скорость передачи до указанного значения в Кбит/с; -r = рекурсивно)
    Пример 1: scp -P 2235 -i ~/id_rsa -r -C ~/Documents/local_directory kmmax@95.31.10.90:~/Documents
    (Копируем локальную директорию со всем содержимым ~/Documents/local_directory на удаленный сервер 95.31.10.90 по порту 2235
    в директорию ~/Documents пользователя kmmax, используя сжатие и приватный ключ из файла ~/id_rsa)
    Пример 2: scp -P 2235 -i ~/id_rsa -r -C kmmax@95.31.10.90:~/Documents/remote_directory ~/Documents
    (Копируем удаленную директорию со всем содержимым ~/Documents/remote_directory с сервера 95.31.10.90 по порту 2235
    в локальную директорию ~/Documents, используя сжатие и приватный ключ из файла ~/id_rsa)
    Пример 3: scp -C -l 5000 kmmax@95.31.10.90:~/Documents/remote_file ~/Documents
    (Копируем удаленный файл ~/Documents/remote_file с сервера 95.31.10.90 на локальную директорию ~/Documents,
    используя сжатие и ограничение скорости до 5000 Кбит/с)

    sftp - интерактивный клиент для управления файлами через SSH. (-P = указать порт; -i = использовать конкретный приватный ключ;
    -l = ограничить скорость передачи до указанного значения в Кбит/с)
    Пример подключения к сессии: sftp -P 2235 -i ~/id_rsa kmmax@95.31.10.90
    Внутри сессии работают базовые команды для взаимодействия с файловой системой (ls, cd, rm, cat, pwd, df)
    Если писать их обычным образом, они будут выполняться для удаленного сервера, к которому вы подключились 
    Если поставить "!" перед командой, они будут выполняться для локального компьютера
    Также есть 3 специальные команды для локального управления: lls, lcd, lpwd. Они работают быстрее, чем аналоги !ls, !cd, !pwd
    (Примечание: во время сессии не рекомендуется использовать ~ внутри пути. Клиент sftp имеет трудности с интерпретацией этого
    символа как путь к домашнему каталогу. Для надежности лучше использовать не ~, а абсолютный путь в качестве аргумента)
    Особые команды sftp:
        get = скачать с удаленного сервера на локальный компьютер (-r = рекурсивно; -p = сохранить текущие права доступа)
        Пример: get -r /home/kmmax/Documents/remote_directory /Users/k.mmax/Documents
        (Копируем удаленную директорию /home/kmmax/Documents/remote_directory со всем содержимым в локальную директорию 
        /Users/k.mmax/Documents) 
	put = загрузить с локального компьютера на удаленный сервер (-r = рекурсивно; -p = сохранить текущие права доступа)
        Пример: put /Users/k.mmax/Documents/local_file /home/kmmax/Projects
        (Копируем локальный файл /Users/k.mmax/Documents/local_file на удаленный сервер, в директорию /home/kmmax/Projects)          

State для ss и netstat:
LISTEN		Сервер ожидает входящих подключений
ESTABLISHED     Соединение установлено, идет обмен данными
CLOSE_WAIT      Удаленная сторона закрыла соединение, но твое приложение еще не закрыло свой сокет
TIME_WAIT       Соединение закрыто, но система ждет, пока все пакеты дойдут
CLOSED  	Соединение полностью закрыто
    
Local address - локальный IP-адрес и порт, используемые данным соединением
Peer address или Foreign address - адрес и порт с кем компьютер говорит/ждет

Destination в таблице маршрутизации - это адрес, куда нужно отправить пакет
Gateway в таблице маршрутизации - это IP-адрес следующего маршрутизатора, через который нужно отправить пакет, чтобы он достиг Destination

Таблица CIDR:
/8 = 255.0.0.0
/16 = 255.255.0.0
/24 = 255.255.255.0
/32 = 255.255.255.255