Linux и Bash

9.1 Сетевая диагностика

Сетевые утилиты помогают диагностировать проблемы с подключением и анализировать сетевой трафик.

ping — проверка доступности


                        ping google.com                  # проверить доступность сайта
                        ping -c 4 8.8.8.8               # отправить 4 пакета
                        ping -i 2 google.com             # интервал между пакетами 2 сек
                        ping -t 64 google.com            # TTL пакетов 64
                    

traceroute — трассировка маршрута


                        traceroute google.com            # показать маршрут до сервера
                        traceroute -n google.com         # не разрешать имена хостов
                        traceroute -m 10 google.com      # максимум 10 прыжков
                    

mtr — комбинация ping и traceroute


                        mtr google.com                   # запустить mtr
                        mtr -r -c 10 google.com          # 10 циклов и завершить
                        mtr -n google.com                 # не разрешать имена
                    

nslookup — разрешение DNS


                        nslookup google.com              # найти IP адрес
                        nslookup 8.8.8.8                 # обратный поиск (IP -> имя)
                        nslookup -type=MX google.com     # найти MX записи
                    

dig — расширенный DNS запрос


                        dig google.com                   # подробная информация о DNS
                        dig @8.8.8.8 google.com          # использовать конкретный DNS сервер
                        dig -x 8.8.8.8                   # обратный DNS запрос
                    
Интерпретация ping:
time= — время отклика в миллисекундах
ttl= — время жизни пакета
packet loss — процент потерянных пакетов

9.2 Просмотр сетевых соединений

Команды для просмотра активных сетевых соединений и анализа сетевого трафика.

ss — современная замена netstat


                        ss -tuln                         # все TCP и UDP соединения
                        ss -tulnp                        # с процессами
                        ss -tuln | grep :80              # найти соединения на порту 80
                        ss -tuln | grep LISTEN           # только слушающие порты
                    

netstat — классическая команда


                        netstat -tuln                    # все TCP и UDP соединения
                        netstat -tulnp                   # с процессами
                        netstat -r                       # таблица маршрутизации
                        netstat -i                       # статистика интерфейсов
                    

lsof — список открытых файлов


                        lsof -i                          # все сетевые соединения
                        lsof -i :80                      # соединения на порту 80
                        lsof -i tcp                      # только TCP соединения
                        lsof -i udp                      # только UDP соединения
                    

iftop — мониторинг трафика


                        sudo iftop                       # мониторинг трафика в реальном времени
                        sudo iftop -i eth0               # конкретный интерфейс
                        sudo iftop -n                    # не разрешать имена хостов
                    

nethogs — трафик по процессам


                        sudo nethogs                    # трафик по процессам
                        sudo nethogs eth0                # конкретный интерфейс
                    
Расшифровка состояний TCP:
LISTEN — ожидает подключения
ESTABLISHED — установленное соединение
CLOSE_WAIT — ожидает закрытия
TIME_WAIT — временное ожидание

9.3 Скачивание файлов

wget и curl — основные инструменты для скачивания файлов из интернета.

wget — простой загрузчик


                        wget https://example.com/file.zip    # скачать файл
                        wget -O filename.zip https://example.com/file.zip  # сохранить с другим именем
                        wget -c https://example.com/file.zip # продолжить загрузку
                        wget -r https://example.com/         # рекурсивно скачать сайт
                    

curl — универсальный инструмент


                        curl https://example.com/file.zip    # скачать файл
                        curl -O https://example.com/file.zip # сохранить с оригинальным именем
                        curl -L https://example.com/redirect # следовать редиректам
                        curl -C - https://example.com/file.zip # продолжить загрузку
                    

HTTP запросы с curl


                        curl -X GET https://api.example.com/data     # GET запрос
                        curl -X POST -d "data=value" https://api.example.com  # POST запрос
                        curl -H "Authorization: Bearer token" https://api.example.com  # с заголовками
                        curl -v https://example.com                  # подробный вывод
                    

Пакетная загрузка


                        # Создать список URL для загрузки
                        echo "https://example.com/file1.zip" > urls.txt
                        echo "https://example.com/file2.zip" >> urls.txt
                        
                        # Загрузить все файлы
                        wget -i urls.txt
                    

Ограничение скорости


                        wget --limit-rate=1m https://example.com/file.zip  # ограничить скорость
                        curl --limit-rate 1m https://example.com/file.zip  # ограничить скорость
                    
Выбор между wget и curl:
wget — лучше для простого скачивания файлов
curl — лучше для API запросов и сложных операций

9.4 SSH подключение

SSH (Secure Shell) — протокол для безопасного удаленного доступа к серверам.

Базовое подключение


                        ssh user@hostname              # подключиться к серверу
                        ssh user@192.168.1.100        # подключиться по IP
                        ssh -p 2222 user@hostname     # подключиться на нестандартном порту
                    

Первый вход


                        # При первом подключении система спросит:
                        # The authenticity of host 'hostname' can't be established.
                        # Are you sure you want to continue connecting (yes/no)?
                        # Введите 'yes' для продолжения
                    

Выполнение команд на удаленном сервере


                        ssh user@hostname "ls -la"     # выполнить команду и выйти
                        ssh user@hostname "uptime && who"  # выполнить несколько команд
                    

Туннелирование портов


                        ssh -L 8080:localhost:80 user@hostname  # локальный туннель
                        ssh -R 8080:localhost:80 user@hostname  # удаленный туннель
                    

                    

Передача файлов через SSH


                        scp file.txt user@hostname:/home/user/  # скопировать файл на сервер
                        scp user@hostname:/home/user/file.txt . # скопировать файл с сервера
                        scp -r directory/ user@hostname:/home/user/  # скопировать каталог
                    

Настройка SSH клиента


                        # Создать файл ~/.ssh/config
                        Host myserver
                            HostName 192.168.1.100
                            User myuser
                            Port 22
                            IdentityFile ~/.ssh/id_rsa
                        
                        # Теперь можно подключаться просто:
                        ssh myserver
                    
Безопасность SSH: Всегда используйте ключи вместо паролей для аутентификации. Отключите root login и используйте нестандартные порты.

9.5 Аутентификация по ключам

SSH ключи обеспечивают более безопасную аутентификацию, чем пароли.

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


                        ssh-keygen -t rsa -b 4096        # создать RSA ключ
                        ssh-keygen -t ed25519            # создать Ed25519 ключ (рекомендуется)
                        ssh-keygen -t rsa -b 4096 -C "your_email@example.com"  # с комментарием
                    

Процесс генерации


                        # Система спросит:
                        # Enter file in which to save the key (/home/user/.ssh/id_rsa): [Enter]
                        # Enter passphrase (empty for no passphrase): [введите пароль или Enter]
                        # Enter same passphrase again: [повторите пароль]
                    

Копирование ключа на сервер


                        ssh-copy-id user@hostname        # автоматически скопировать ключ
                        # Или вручную:
                        cat ~/.ssh/id_rsa.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
                    

Проверка подключения


                        ssh user@hostname                # подключиться без пароля
                        ssh -i ~/.ssh/id_rsa user@hostname  # использовать конкретный ключ
                    

Управление ключами


                        ssh-add ~/.ssh/id_rsa            # добавить ключ в ssh-agent
                        ssh-add -l                       # показать загруженные ключи
                        ssh-add -D                       # удалить все ключи из ssh-agent
                    

Настройка ssh-agent


                        # Добавить в ~/.bashrc или ~/.profile:
                        eval "$(ssh-agent -s)"
                        ssh-add ~/.ssh/id_rsa
                    
Типы ключей:
RSA — классический, совместимый
Ed25519 — современный, быстрый, безопасный
ECDSA — компактный, быстрый

9.6 Передача файлов

Различные способы передачи файлов между компьютерами в Linux.

scp — копирование через SSH


                        # Копирование файла на сервер
                        scp file.txt user@hostname:/home/user/
                        scp -r directory/ user@hostname:/home/user/
                        
                        # Копирование файла с сервера
                        scp user@hostname:/home/user/file.txt .
                        scp -r user@hostname:/home/user/directory/ .
                        
                        # Копирование между серверами
                        scp user1@host1:/path/file user2@host2:/path/
                    

rsync — синхронизация файлов


                        rsync -avz file.txt user@hostname:/home/user/  # синхронизировать файл
                        rsync -avz --delete local/ user@hostname:/home/user/  # синхронизировать каталог
                        rsync -avz --progress user@hostname:/home/user/ .  # с прогрессом
                    

sftp — интерактивная передача


                        sftp user@hostname              # подключиться к SFTP серверу
                        # Команды SFTP:
                        # put file.txt                 # загрузить файл
                        # get file.txt                 # скачать файл
                        # ls                           # список файлов
                        # cd directory                 # смена каталога
                        # quit                         # выход
                    

wget/curl для загрузки


                        wget https://example.com/file.zip
                        curl -O https://example.com/file.zip
                        curl -L -o file.zip https://example.com/file.zip
                    

Создание архива перед передачей


                        tar -czf archive.tar.gz directory/  # создать архив
                        scp archive.tar.gz user@hostname:/home/user/
                        ssh user@hostname "cd /home/user && tar -xzf archive.tar.gz"
                    

Практический пример резервного копирования


                        #!/bin/bash
                        # Скрипт резервного копирования на удаленный сервер
                        
                        BACKUP_DIR="/home/user/backup"
                        REMOTE_USER="backup"
                        REMOTE_HOST="backup-server.com"
                        REMOTE_DIR="/backups"
                        
                        # Создать архив
                        tar -czf "$BACKUP_DIR/backup_$(date +%Y%m%d).tar.gz" /home/user/documents/
                        
                        # Передать на сервер
                        scp "$BACKUP_DIR/backup_$(date +%Y%m%d).tar.gz" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"
                        
                        # Удалить локальный архив
                        rm "$BACKUP_DIR/backup_$(date +%Y%m%d).tar.gz"
                    
Выбор инструмента:
scp — простые операции копирования
rsync — синхронизация и инкрементальные копии
sftp — интерактивная работа с файлами
wget/curl — загрузка из интернета