1 Общая информация
Содержание
- 1 2 Система
- 2 3 Процессы
- 3 Файловая система
- 3.1 Права
- 3.2 4.2 Информация о дисках
- 3.3 4.3 Точки монтирования, разделы, использование дисков
- 3.4 4.4 Блокировка файлов, кто использует файлы?
- 3.5 4.5 Mount/remount
- 3.6 4.6 Увеличиваем SWAP
- 3.7 4.7 Монтируем SMB share
- 3.8 4.8 Монтируем image (образ)
- 3.9 4.9 Создание и запись ISO образа
- 3.10 4.10 Монтируем образ (файл как образ)
- 3.11 4.11 Memdisk
- 3.12 4.12 Производительность дисков
- 4 5 Сеть
- 5 6 SSH SCP
- 6 7 VPN с SSH
- 7 8 Backup
- 8 9 sudo
- 9 10 Управление пакетами
- 10 11 Полезные команды
- 11 12 Shell
- 12 13 Печать
- 13 14 Дисковые квоты
- 14 15 Поиск неисправностей
- 15 16 SSL сертификаты
- 16 17 Шифрование файлов
- 17 18 Шифрование разделов
1.1 Основные команды
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# ls -lash /home # Просмотр содержимого католога # pwd # Путь к текущему каталогу # su - # стать root + его переменные окружения # cd /home# Переход в другой каталог # touch index.htm # Создать новый файл # mkdir -p /home/name/www/{tools,i} # Создать каталог с подкаталогами # cp www/index.htm . # Копируем файл в текущий каталог # cp -la /dir1 /dir2 # Архивирование каталога с подкаталогами # cp -R /home/name /home/name_bak # Копируем каталог # cp index.htm{,.bak} # Копируем файл с новым расширением, быстрый backup # mv -v /home/name_bak /home/name # Перемещение/переименование файлов и каталогов # rm -Rf /home/name/www # Удаление каталога со всем содержимым # shred /home/name/www/* # Удаление с перезаписью случайными числами 25 раз # which ls# Полный путь имени/расположение команды # whatis ls # Очень короткая справка о команде # whereis grep # Путь к исполняемым файлам, исходным файлам и справочному рук-ву # ldd /bin/grep # Список необходимых библиотек для работы команды # ldconfig -n /path/to/libs/# Добовляем путь к библиотеке(настройка динамического связывания) # date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] # date 031713402011# Устанавливаем дату: Чтв Мар 17 13:40:00 MSK 2011 # time ls -lash /root # Время выполнение команды # cal -3 # Календарь на 3 месяца # set | grep $USER # Список переменных окружения # openssl md5 index.htm.bak # Делаем md5 hash файла |
1.2 Объединение команд
1 2 3 4 5 6 7 8 9 10 11 |
# cd /home/name; ls -la# ; - последовательное выполнение команд # ls file.txt && echo "DATA" >>file.txt # && - выполнение команды при условии успешного завершения предыдущих # ls file1.txt || echo "DATA" >file1.txt # || - выполнение команды при условии, что предыдущая завершилась с ошибкой # touch $(echo $(date "+%Y-%m-%d").txt) # $() - использование выходных данных одной команды при вызове другой команды # ls -la /usr/bin | more # | - передача выходных данных одной команды на вход другой команды # ls > menu.txt # > - перенаправление выходных данных в файл # wc -l &1 |less # 2>&1 - поток ошибок туда, куда направлен вывод stdin | 0 | поток ввода | клавиатура stdout | 1 | поток вывода | терминал stdin | 2 | поток ошибок | терминал |
1.3 Специальные символы (групповые операции)
1 2 3 4 |
# rm file*.*; rm -Rf /home/name/www/* # * - любое количество(в том числе нулевое) любых символов # rm foto1?.jpg # ? - один произвольный символ # rm foto[12].[jpgpnif]; rm foto[3-6].jpg# [] - определенный набор символов # mkdir -p /home/name/www/{tools,i} # {} - определить множество |
В именах файлов нельзя использовать: / — использовать запрещено — — нельзя использовать в начале имени файла или каталога {}, *, ?, ‘, «, [ , ], , >, <, |, &, пробел — каждый из этих символов должен быть предварен . Применять не рекомендуется.
1 2 |
# rm -Rf Рабочий стол # удаляем папку - Рабочий стол # rm "Рабочий стол"; rm [13]foto.jpg # удаляем [13]foto.jpg |
В конфигурационных файлах: # — комментарий // — комментарий
1.4 Просмотр содержимого файлов
1 2 3 4 5 6 |
# cat .bashrc; cat index.htm i/index.htm # вывод содержимого файла/файлов # less -N /etc/named.conf # постраничный вывод текста с нумерацией строк (с прокруткой файла) # head -t 20 /etc/named.conf# вывод первых 20 строк файла # tail -f -n 100 /var/log/messages # вывод последних 100 строк + вывод добавленных строк в реальном времени # more /etc/named.conf # вывод содержимого файла на экран отдельными страницами # nano /etc/named.conf # просмотр и редактирование файла |
1.5 nano
nano — редактор файлов, более дружелюбный чем vim 😉
1 2 |
# nano /etc/hosts # просмотр и редактирование файла # export EDITOR=nano # делаем nano редактором файлов по умолчанию |
- Ctrl-X — закрыть редактор
- Ctrl-O — сохранить
- Ctrl-C — номер строки / текущая позиция
- Ctrl-W — поиск
- Ctrl-W затем Ctrl-T — переход к строке №
- Ctrl-K — вырезать строку
- Ctrl-U — вставить из буфера
- Alt-A — выделение (вне X)
- Alt-6 — копировать в буфер
1.6 vim
vim — редактор файлов, более дружелюбный чем nano 😉
- ZQ — закрыть редактор
- ZZ — закрыть и сохранить
1.7 tmux
tmux — аналог screen с одновременным вводом команд в несколько окон
- ZZ — закрыть редактор
- ZQ — закрыть и сохранить
2 Система
2.1 Загрузка
Последовательность при загрузке:
Инициализация BIOS => Загрузчик (grub) => Инициализация ядра (kernel initialization) => выполнение init -> {/etc/rc.d/rc.sysinit, /etc/rc.d/rc, /etc/rc.d/rc[0-6].d/, /etc/rc.d/rc.local} => virtual consoles => X
=> Инициализация BIOS:
Определение периферийных устройств и устройств для загрузки. BIOS читает и выполняет инструкцию расположенную в первом секторе загрузочного устройства. Обычно это первые 512 bytes жесткого диска.
=> Загрузчик:
Первоначальный загрузчик находит и загружает программу загрузки 2 этапа (stage 2) и передаёт ей управление (grub); используется BIOS API; обычное место загрузчика 2 этапа — /boot/. Загрузчик 2 этапа выбирает, находит и загружает ядро и RAM диск (initrd) в память; grub читает конфигурацию из /boot/grub/grub.conf. grub.
=> Инициализация ядра:
Обнаружение устройств. Инициализация драйверов устройств. Монтирование корневой файловой системы в режиме только чтения (read-only). Запуск процесса init.
=> Выполнение init:
init читает /etc/inittab (как загружать систему для каждого runlevel). Определяется run level, директории для запуска скриптов, стартует /etc/rc.d/rc.sysinit: udev, selinux, устанавливаются параметры ядра в /etc/sysctl.conf, устанавливаются часы, загружается keymap, подключается swap, устанавливается hostname, проверяется и перемонтируется корневая файловая система в режиме чтения-записи.
2.2 Hardware
Версия системы, дистрибутив
1 2 3 4 5 6 7 8 9 |
# uname -a# Версия ядра (kernel version) # lsb_release -a # Информация о дистрибутиве # cat /etc/redhat-release # Информация о версии Centos/Redhat # cat /etc/debian_version # Информации о версии Debian # uptime # Как долго система работает # hostname# Имя системы (hostname) # man hier# Информация о системных каталогах, справка # last reboot # История перезагрузок системы |
Оборудование определенное ядром
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# dmesg # Обнаруженные устройства и сообщения выводимые при загрузке # lsdev # информация об установленном оборудовании # dd if=/dev/mem bs=1k skip=768 count=256 2>/dev/null | strings -n 8 # Читаем BIOS # cat /proc/cpuinfo# информация о CPU # cat /proc/meminfo# информация о RAM и swap # watch -n1 'cat /proc/interrupts' # Просмотр изменений прерываний # cat /proc/devices# Конфигурация устройств # lspci -tv # Смотреть PCI устройства # lsusb -tv # Смотреть USB устройства # lshal # Смотрим список устройств и их свойства # dmidecode # Смотреть DMI/SMBIOS: hardware информация из BIOS # grep HIGHMEM /boot/config-$(uname -r) # Узнать максимально возможный размер RAM в системе # grep --color=tty pae /proc/cpuinfo # если pae-то с ним будет работать xen; vmx(intel),svm(AMD)-для полной виртуализации |
2.3 Ресурсы и статистика
Ресурсы RAM и HDD
1 2 3 4 5 6 7 8 |
# free -m # Используемая и свободная оперативная память (-m for MB) # grep MemTotal /proc/meminfo # Информация о RAM # df # Показать свободное пространство на дисках и смонтированные устройства # du -sh *# Размер каталога (листинг файлов и подкаталогов) # du -csh # Размер текущей директории # du -ks * | sort -n -r # Сортировать по размеру (kbytes) # ls -lSr # Показать файлы с сортировкой по размеру |
Статистика
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# top # Статистика процессов cpu # htop # Текущее состояние системы # iotop # Анализа потребления дисковой полосы # atop # Статистика загрузки cpu, блочных устройств, сетевых интерфейсов # iftop # Наблюдение за трафиком в реальном времени (сеть) # powertop# Показывает время, затраченное на обслуживание процессором # dnstop # Анализатор DNS-трафика на интерфейсе # iptstate# Монитор contrack из iptables, показывает активные трансляции с возможностью их убить # mpstat 1# Статистика загрузки процессора # vmstat 2# статистика использования виртуальной памяти # iostat 2# Статистика I/O (2 s интервал) # tail -n 500 /var/log/messages # Последние 500 kernel/syslog сообщений # tail /var/log/warn # Предупреждения об ошибках, см. syslog.conf |
2.4 Ограничения
Ограничения shell/script
1 2 |
# ulimit -a # Смотрим ограничения # ulimit -n 10240 # Меняем ограничение на количество открытых файлов, только shell |
Ограничения user/process
1 2 3 |
# cat /etc/security/limits.conf * hard nproc 250 # Ограничения пользовательских процессов asterisk hard nofile 409600 # Ограничения на открытые файлы приложения |
Ограничения на всю систему
1 2 3 4 5 6 7 |
# sysctl -a # Смотрим системные ограничения # sysctl fs.file-max # Максимальное количество открытых файлов # sysctl fs.file-max=102400 # Меняем максимальное количество открытых файлов # echo "1024 50000" > /proc/sys/net/ipv4/ip_local_port_range # диапазон портов # cat /etc/sysctl.conf fs.file-max=102400 # Ввод по умолчанию sysctl.conf # cat /proc/sys/fs/file-nr # Сколько дескрипторов файлов используется |
Отключаем ответы сервера на ping
1 2 3 4 5 |
# sysctl net.ipv4.icmp_echo_ignore_all # проверяем значение # sysctl -w net.ipv4.icmp_echo_ignore_all=1 # отключаем ответ на ping # чтоб сохранялось при перегрузке # nano /etc/sysctl.conf net.ipv4.icmp_echo_ignore_all=1 # выставляем 1 и сохраняем |
2.5 Runlevels
Ядро стартует init, init читает /etc/inittab и запускает rc, который в свою очередь стартует скрипты определенного уровня (runlevel). Скрипты находятся в /etc/init.d и ссылаются (линкуются) с /etc/rc.d/rcN.d где N номер runlevel Уровень запуска по умолчанию указывается в /etc/inittab, обычно это 3 или 5.
1 2 |
# grep default: /etc/inittab id:3:initdefault: |
Уровень запуска можно быстро поменять с init
1 2 |
# init 5 # переход с runlevel 3 на 5 # init 6 # reboot |
1 2 3 4 5 6 7 |
0 # Выключить, poweroff, shutdown now -h 1, S # Single-User mode 2 # Multi-user без сети 3 # Multi-user с сетью 4 # Не используется 5 # Multi-user с X 6 # Перезагрузка, Reboot |
chkconfig — конфигурирует какие программы будут запускаться при запуске OS с определенным runlevel
1 2 3 4 |
# chkconfig --list # Список всех init скриптов # chkconfig --list sshd # Статус sshd # chkconfig sshd --level 35 on # Запуск sshd на уровне 3 и 5 # chkconfig sshd off # Отключить sshd для всех runlevels |
В Debian и основанных на Debian дистрибутивах используется update-rc.d для управления скриптами runlevels . По умолчанию стартует в 2,3,4,5 и выключается в 0,1 и 6.
1 2 3 4 |
# update-rc.d sshd defaults # активирует sshd на runlevels по умолчанию # update-rc.d sshd start 20 2 3 4 5 . stop 20 0 1 6 . # Применяем аргументы # update-rc.d -f sshd remove# Выключаем sshd для всех runlevels # shutdown -h now # Выключаем систему |
2.6 Восстановить пароль root
Вариант 1Когда стартует grub, появляется возможность выбора режима загрузки в grub_boot_screen (иногда при загрузке нужно нажать F4) 1.Нажимем <пробел> — попадаем в меню выбора вариантов загрузки kernel и initrd. 2.Нажимаем F <e> — для редактирования режима загрузки и дописываем S (загрузка в single user mode).
1 |
kernel /vmlinuz-2.6.35.11-83.fc14.i686 ro root=/dev/vg00/logvol00 rhgb quiet S |
3.Нажимаем F <b> для загрузки с установленным параметром. 4.Выполняем команду и вводим нужный пароль.
1 2 3 |
#passwd Смена пароля для пользователя root. Новый пароль : |
Вариант 2В момент загрузки grub, задаем:
1 |
init=/bin/sh |
Ядро примонтирует корневой раздел, init запустит shell. Выполняем:
1 2 3 4 |
# mount -o remount,rw / # passwd # или удаляем пароль root в (/etc/shadow) # sync; mount -o remount,ro / # sync до перемонтирования в read only # reboot |
Вариант 31.Загружаемся с внешнего носителя в rescue mode (liveCD или installation CD). 2.Находим корневой раздел с подошью fdisk. 3.Выполняем:
1 2 3 4 |
# mount -o rw /dev/ad4s3a /mnt # монтируем корневой раздел в /mnt системы с LiveCD # chroot /mnt # chroot в /mnt # passwd # reboot |
2.7 kernel (update kernel)
Варианты ядра для x86:
1.Regular: несколько процессоров, максимально 4GB RAM 2.PAE: 32 процессора, 16GB RAM 3.Xen: поддержка виртуализации
Варианты ядра для x86_64:
1.Regular: 64 процессора, максимально 256GB RAM 2.Xen: поддержка виртуализации Ядро обычно устанавливается в /boot/vmlinuz-*
1 2 3 4 5 6 7 8 9 10 11 |
# /proc/ # информация о процессах (top,ps) # /proc/cmdline # boot time опции # /proc/cpuinfo # CPU # /proc/mdstat # software RAID (mdadm) # /proc/meminfo # использование памяти (free, vmstat) # /proc/swaps # swap # /proc/modules # загруженные модули (lsmod) # /proc/mounts # смонтированные файловые системы(mounts) # /proc/net # сетевая активность и конфигурация (ifconfig,netstat) # /proc/partitions # block devices # /proc/version # версия Linux kernel (uname) |
Некоторые устройства:
1 2 3 4 5 6 7 8 |
# block devices # /dev/hda, /dev/hdc # IDE hdd, CD/DVD-ROM # /dev/sda, /dev/sdb # SCSI, SATA, USB-hdd # /dev/md0, /dev/md1 # Software RAID # character devices # /dev/tty[0-6] # virtual consoles # /dev/null, /dev/zero # software devices, "ноль" # /dev/random, /dev/urandome # генератор случайных чисел |
2.8 grub
1 2 3 4 5 |
# /sbin/grub-install /dev/hda # обновить MBR # grub-crypt # получить hash sha-512, для пароля на grub # nano /boot/grub/grub.conf password --sha-512 $6$tdi8VPVCnSkGZbjw$oCy/ # вставляем строчку с hash default=0 |
2.9 Пользователи
1 2 3 4 5 6 7 8 |
# id # Показывает активного пользователя с логином и группой uid и gid # last # Выводит список последних логинов (подключений) в систему # who # Список подключенных пользователей к системе # groupadd admin # Добавляет группу "admin" и пользователя myname # useradd -c "Имя Фамилия" -g admin -m myname # usermod -a -G # Добавляет существующего пользователя в группу (Debian) # groupmod -A # Добавляет существующего пользователя в группу (SuSE) # userdel myname # Удаляет пользователя myname (Linux/Solaris) |
В /etc/shadow хранится пара: hash пароля и логин.
1 2 3 4 5 6 7 8 9 10 11 |
# for USER in petr alex vadim sergey # Устанавливаем перечисленным пользователям пароль: password # do # useradd $USER # echo password | passwd --stdin $USER # done # while read u n # Добовляем пользователей с паролем: password # do # useradd --comment "$n" --create-home $u # echo password | passwd --stdin $u # done |
2.10 Память
Резидентная память — память в оперативке Анонимная память (anon) — память без привязки к файлу Page fault — обращение к памяти, trap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vm.overcommit # параметр чтобы не переиспользовать виртуальную память # 1 - не следим за оверкоммитом, # 0-ограничеваем виртуальную память, чтобы не получить намного больше чем есть - спец механизм (но руут не ограничен), # 2 - возможно выставлять лимиты) cat /proc/meminfo commitLimmit commit_AS # numactl --hardware # информация о numa облстях памяти с привязкой к ЦПУ # cat /proc/zoneinfo # зоны памяти (физ смысл, разновидности и группы страниц памяти) # vmtouch filename # смотрим сколько у нас файла в кэше # kswapd # вытеснение из кеша (dirty) # vm.dirty_ratio # как часть файла писать на диск # pmap -x PID# смотрим VMA (виртуальные группы страниц памяти) # ulimit # меняем для процесса ограничения стека # mmap # отображение файла в адресное пространство # sar -B # -B: статистика по страницам, -r: утилизация памяти, -R: статистика использования памяти # durty - страницы не сброшенные в память # readhead # как читать файлы с диска (стратегия по чтению через fd) # blockdev # управление блочным девайсом |
Все операции чтения и записи работают через пейджкэшь pages recliming — освобождение памяти(sync, disareablw, swap, unreclaim) LRU листы — организация очередей в cache может быть active innactive (meminfo) page fault minor — выделение без чтения с диска page fault major — с чтением диска
1 |
# echo "-17" > /proc/PID/oom_adj; # oomkiller, принудительное освобождение памяти (убиваем процесс), # -17 отключить oomkiller (-16..15) веса, можно посмотреть в oom_score текущий |
3 Процессы
3.1 Просмотр процессов
<PID> — уникальный номер(идентификатор) процесса
1 |
# ps -auxefw # Расширенный список всех запущенных процессов |
1 2 3 4 5 6 7 8 9 |
# ps axww | grep cron 586 ?? Is 0:01.48 /usr/sbin/cron -s # ps axjf # Процессы как дерево процессов # ps aux | grep 'ss[h]' # Найти все ssh pids без grep pid # pgrep -l sshd # Найти PIDs процессов по имени (части имени) # echo $$ # PID нашего shell # fuser -va 22/tcp # Процессы использующие порт 22 # pmap PID # Карта памяти процесса (поиск утечки памяти), используемые библиотеки # fuser -va /home # Процессы работающие с разделом /home |
Приоритеты
Изменить приоритет запущенного процесса можно с renice. Отрицательные числа имеют наивысший приоритет. Границы от -20 до 20
1 2 |
# renice -5 586 # Приоритетный 586: old priority 0, new priority -5 |
Приоритет запускаемых процессов устанавливаем с nice.
1 2 3 |
# nice -n -5 top # Высокий приоритет (/bin/nice) # nice -n 5 top # Низкий приоритет (/bin/nice) # nice +5 top # Низкий приоритет |
nice меняет планировщик CPU, ionice меняет планировщик I/O дисков.
1 2 3 |
# ionice c3 -p123 # Устанавливает класс idle для pid 123 # ionice -c2 -n0 firefox # Запускает firefox с best effort и высоким приоритетом # ionice -c3 -p$$ # Устанавливает актуальный shell idle приоритет |
Последняя команда удобна для отладки и компиляции больших проектов. Кождая команда запущенная из этого shell будет иметь подобный приоритет (приоритет $$, если $$ PID shell).
Background/Foreground
Процесс запущенный в shell может быть убран на задний план(Background), а потом вызван на передний план(Foregroun) нажатием F <Ctrl>+<Z>. Запускайте процесс с nohup, чтоб он продолжил работу, когда shell будет закрыт.
1 2 3 4 5 6 7 8 |
# ping ya.ru > ping_ya.ru.log +# ping приостановлен, + # bg # убрали в background и продолжили выполнение # jobs -l # смотрим что в background [1] - 31574 Running ping ya.ru > ping_ya.ru.log [2] + 36233 Suspended (tty output) top # fg %2 # Вызвать процесс в foreground # nohup ping -i 60 > ping_ya.ru.log & |
Top, htop
Top — выводит информацию в реальном времени о запущенных процессах. Htop — продвинутая версия top, ставится из репозиториев. F<u> [username] Показывает процессы принадлежащие пользователю username F<k> [pid] Убить процесс с pid F<1> Покажет статистику использования процессоров F<R> Сортировка
Kill, signals
1 2 3 4 5 6 7 |
# ping -i 60 ya.ru > ping_ya.ru.log & [1] 4712 # kill -s TERM 4712# также kill -15 4712 # killall -1 httpd # Завершить HUP процесс по имени # pkill -9 http # Завершить TERM процесс по имени (части имени) # pkill -TERM -u www # Завершить TERM процессы принадлежащие www # fuser -k -TERM -m /home # Завершить все процессы использующие /home (для umount) |
Сигналы:
1 2 3 4 5 |
# -1 HUP # Дать отбой, перегрузка конфигурационных файлов и перезапуск программы # -2 INT # Прервать # -3 QUIT # Выйти # -9 KILL # Прекратить все выполняющиеся действия и завершить работу # -15 TERM # Мягкое завершение с удаление порожденных процессов и закрытием файлов |
Файловая система
Права
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
1 --x execute/выполнять | Mode 764 = exec/read/write | read/write | read 2 -w- write/писать | For: |-- Owner --| |- Group-| |Oth| 4 r-- read/читать | ugo=a u=user, g=group, o=others, a=everyone # chmod [OPTION] MODE[,MODE] FILE # MODE имеет вид [ugoa]*([-+=]([rwxXst])) # chmod 640 /var/log/maillog# Установили log -rw-r----- # chmod u=rw,g=r,o= /var/log/maillog # Установили log -rw-r----- # chmod -R o-r /home/* # Рекурсивно запрещаем чтение всем пользователям в /home/* # chmod u+s /path/to/prog # Устанавливаем SUID bit # find / -perm -u+s -print # Находим все программы использующие SUID bit # chown user:group /path/to/file # Меняем хозяина и группу файла # chgrp group /path/to/file # Меняем группу файла # chmod 640 `find ./ -type f -print` # Меняем права на 640 для всех файлов # chmod 751 `find ./ -type d -print` # Меняем права на 751 для всех директорий # umask 0174 /test # touch /test/foo # mkdir /test/dir # ls -la /test drw-----wx 2 root root 512 Sep 1 20:59 dir -rw-----w- 1 root root 0 Sep 1 20:59 foo |
4.2 Информация о дисках
1 2 3 |
# hdparm -I /dev/sda # Информация о IDE/ATA (Linux) # fdisk /dev/ad2 # Работа с таблицей разделов # smartctl -a /dev/ad2 # Отобразить информацию SMART |
4.3 Точки монтирования, разделы, использование дисков
1 2 3 4 5 6 7 |
# mount | column -t# Смонтированные файловые системы # df # Свободное пространство на дисках # cat /proc/partitions # Все зарегистрированные разделы (Linux) # du -sh *# Список с размерами папок # du -csh # Размер текущей папки (сумма поддиректорий) # du -ks * | sort -n -r # Размер в kilobytes с сортировкой # ls -lSr # Показать файлы, большие в конце |
4.4 Блокировка файлов, кто использует файлы?
1 2 3 |
# umount /home/ umount: unmount of /home # Выполнить umount не возможно, файлы в home заблокированы failed: Device busy |
Найти открытые файлы, для Xorg:
1 2 3 4 5 6 7 |
# ps ax | grep Xorg | awk '{print $1}' 1252 # fstat -p 1252 USER CMD PID FD MOUNT INUM MODESZ|DV R/W root Xorg 1252 root / 2 drwxr-xr-x 512 r root Xorg 1252 text /usr 216016 -rws--x--x 1679848 r root Xorg 1252 0 /var 212042 -rw-r--r-- 56987 w |
Файл с inum 212042 нашелся в /var:
1 2 |
# find -x /var -inum 212042 /var/log/Xorg.0.log |
Поиск открытых файлов в точках монтирования с fuser или lsof
1 2 3 4 5 |
# fuser -m /home # Список процессов использующих /home # lsof /home COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME tcsh 29029 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home) lsof 29140 eedcoba cwd DIR 0,18 12288 1048587 /home/eedcoba (guam:/home) |
Приложение:
1 2 3 4 5 |
ps ax | grep Xorg | awk '{print $1}' 3324 # lsof -p 3324 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log |
Файл:
1 2 3 |
# lsof /var/log/Xorg.0.log COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME Xorg 3324 root 0w REG 8,6 56296 12492 /var/log/Xorg.0.log |
4.5 Mount/remount
1 2 3 4 5 6 7 8 9 |
# mount /cdrom #если есть в /etc/fstab /dev/cdrom /media/cdrom subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0 #строчка из /etc/fstab # mount -t auto /dev/cdrom /mnt/cdrom # монтируем CD-ROM # mount /dev/hdc -t iso9660 -r /cdrom # IDE # mount /dev/scd0 -t iso9660 -r /cdrom # SCSI CD-ROM # mount /dev/sdc0 -t ntfs-3g /windows # SCSI # mount -o remount,ro / # перемонтирование без размонтирования # mount -n -o remount,rw / # перемонтировать в режиме чтения|записи |
4.6 Увеличиваем SWAP
Иногда нужно увеличить swap, прямо сейчас, на лету
1 2 3 4 5 |
# dd if=/dev/zero of=/swap2gb bs=1024k count=2000 # mkswap /swap2gb # создаем место для swap # swapon /swap2gb # запускаем swap. сейчас используется swap # swapoff /swap2gb # отключаем swap # rm /swap2gb |
cifs использует ip или DNS имя
1 2 3 |
# smbclient -U user -I 192.168.1.2 -L //smbshare/ # Смотрим шары # mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare # mount -t cifs -o username=winuser,password=winpwd //192.168.1.2/myshare /mnt/share |
Если используется mount.cifs, то можно хранить учетные данные в файле /home/user/.smb:
1 2 |
username=winuser password=winpwd |
Монтируем:
1 |
# mount -t cifs -o credentials=/home/user/.smb //192.168.1.2/myshare /mnt/smbshare |
4.8 Монтируем image (образ)
1 2 |
# mount -t iso9660 -o loop file.iso /mnt # Монтируем CD-image # mount -t ext3 -o loop file.img /mnt # Монтируем образ с ext3 fs |
4.9 Создание и запись ISO образа
Без conv=notrunc содержимое будет меньше объема диска, если данные не занимают весь диск (DVD запишем на CD).
1 |
# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc |
Используем mkisofs для создания CD/DVD образа из файлов в папке. Для преодоления ограничений на имена файлов: -r разрешает Rock Ridge расширения для UNIX систем, -J разрешает Joliet расширения используемые Microsoft ОС. -L разрешает имена согласно ISO9660.
1 |
# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir |
Запись:
1 2 3 4 |
# cdrecord -scanbus# Находим устройство для записи (1,0,0) # cdrecord dev=1,0,0 imagefile.iso # cdrecord dev=ATAPI -scanbus # Можно использовать native ATAPI |
Конвертируем Nero .nrg файл в .iso
1 |
# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300 # Nero просто добавляет 300Kb заголовок к нормальному iso |
4.10 Монтируем образ (файл как образ)
1 2 3 4 |
# dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024 # mkfs.ext3 /usr/vdisk.img # mount -o loop /usr/vdisk.img /mnt # umount /mnt; rm /usr/vdisk.img # Очистили |
/dev/zero быстрее urandom, но менее безопасный.
1 2 3 4 5 6 7 8 |
# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024 # losetup /dev/loop0 /usr/vdisk.img # Создали и определили /dev/loop0 # mkfs.ext3 /dev/loop0 # mount /dev/loop0 /mnt # losetup -a # Проверка использования loops # umount /mnt # losetup -d /dev/loop0 # Удаление # rm /usr/vdisk.img |
4.11 Memdisk
Tmpfs очень быстрая файловая система для IO приложений. Создадим 64 MB раздел, монтируемый в /memdisk:
1 |
# mount -t tmpfs -osize=64m tmpfs /memdisk |
4.12 Производительность дисков
1 2 3 |
# time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000 # Читаем и пишем 1GB в /home (/dev/ad4s3c) # time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file # hdparm -tT /dev/hda |
5 Сеть
5.1 Устранение ошибок
1 2 3 4 5 |
# arping 192.168.1.2 # Ping на канальном уровне (ethernet layer) # tcptraceroute -f 5 zabrosov.ru # Используем tcp вместо icmp для трассировки через firewalls # ping zabrosov.ru # traceroute zabrosov.ru # Маршрут до zabrosov.ru # netstat -s # Сетевая статистика для каждого протокола системы |
Работа с NIC
1 2 3 4 5 6 7 8 9 10 |
# ethtool eth0 # Смотрим свойства nic # ethtool -s eth0 speed 100 duplex full # Устанавливаем 100Mbit Full duplex # ethtool -s eth0 autoneg off # Отключаем auto negotiation # ethtool -p eth1 # Мигнуть светодиодом (если поддерживается) # ip link show # Показать все интерфейсы (или ifconfig) # ip link set eth0 up # Включить eth0 (или отключить - down) # ifconfig eth0 up # Включить eth0 (или отключить - down) # ip addr show # Посмотреть все IP (аналог ifconfig) # ip neigh show # arp # arp -a # Работа с arp |
eth0 из shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Вывод списка NIC с сортировкой # ifconfig | sed 's/ / /g' | cut -d" " -f1 | uniq | grep -E "[a-z0-9]+" | sort -r # Вывод всех IP машины с сортировкой # ifconfig | sed '/.*inet addr:/!d;s///;s/ .*//'|sort -t. -k1,1n -k2,2n -k3,3n -k4,4n # nano /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 HWADDR=00:C0:26:30:EA:32 IPADDR=192.168.1.2 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes GATEWAY=192.168.1.1 TYPE=Ethernet USERCTL=no IPV6INIT=no PEERDNS=yes |
5.2 Routing
1 2 3 |
# route -n # netstat -rn # ip route |
Добавить/удалить маршрут
1 2 3 4 5 6 |
# route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.1.2 # ip route add 192.168.20.0/24 via 192.168.1.2 # Аналог # route add -net 192.168.20.0 netmask 255.255.255.0 dev eth0 # route add default gw 192.168.1.2 # ip route add default via 192.168.1.2 dev eth0 # Аналог # route delete -net 192.168.20.0 netmask 255.255.255.0 |
5.3 Дополнительный IP
1 2 3 4 |
# ifconfig eth0 192.168.50.254 netmask 255.255.255.0 # Первый IP # ifconfig eth0:0 192.168.51.254 netmask 255.255.255.0 # Второй IP # ip addr add 192.168.50.254/24 dev eth0 # Аналог # ip addr add 192.168.51.254/24 dev eth0 label eth0:1 |
5.4 Сменить MAC
1 2 |
# ifconfig eth0 down # ifconfig eth0 hw ether 00:01:02:03:04:05 |
Wireless:
5.5 Занятые порты
1 2 3 4 5 6 |
# netstat -an | grep LISTEN # lsof -i# Просмотр всех соединений # socklist # Список открытых сокетов # netstat -anp --udp --tcp | grep LISTEN # netstat -tup # Активные соединения # netstat -tupl # Список открытых портов системы |
5.6 Firewall
1 2 3 4 5 6 7 8 |
# iptables -L -n -v# Листинг правила Open the iptables firewall # iptables -P INPUT ACCEPT # Разрешить все # iptables -P FORWARD ACCEPT # iptables -P OUTPUT ACCEPT # iptables -Z # Обнулить все счетчики во всех цепочках # iptables -F # Очистить все цепочки # iptables -X # Удалить все цепочки |
5.7 Разрешить роутинг
1 2 3 4 5 |
# cat /proc/sys/net/ipv4/ip_forward # Проверка IP forward 0=off, 1=on # echo 1 > /proc/sys/net/ipv4/ip_forward или редактируем /etc/sysctl.conf with: net.ipv4.ip_forward = |
5.8 NAT
1 2 3 4 5 6 7 |
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # NAT # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 20022 -j DNAT --to 192.168.1.44:22 # Проброс 20022 порта на внутренний IP порт ssh # iptables -t nat -A PREROUTING -p tcp -d 78.31.70.238 --dport 993:995 -j DNAT --to 192.168.16.254:993-995 # Проброс портов 993-995 # iptables -L -t nat # Состояние NAT # netstat-nat -n # смотрим сессии с IPS |
Проброс портов можно отменить, заменив в правиле -A на -D.
5.9 DNS
Настройки DNS храниться в /etc/resolve.conf:
1 2 3 4 5 |
nameserver 8.8.8.8 search mydomain.local studdomain.lab domain mydomain.local # hostname -d # Имя системы ( аналог: dnsdomainname) |
dig — утилита для тестирования DNS. В качестве DNS сервера используем свободный google dns с ip: 8.8.8.8
1 2 3 4 |
# dig zabrosov.ru ;; ANSWER SECTION: zabrosov.ru. 600 IN A 77.221.130.2 ;; SERVER: 8.8.8.8#53(8.8.8.8) |
Некоторые полезные запросы:
1 2 3 4 5 6 7 8 |
# dig MX zabrosov.ru # dig @127.0.0.1 NS zabrosov.ru# Тест локального DNS-сервера (если есть) # dig @8.8.8.8 NS MX zabrosov.ru # Запрос к внешнему DNS-сервер # dig AXFR @ns1.infobox.org zabrosov.ru # Получить зону (zone transfer) # аналог dig # host -t MX zabrosov.ru # Посмотреть MX записи # host -t NS -T zabrosov.ru # Получить NS записи через tcp # host -a zabrosov.ru # Вся информация по домену |
Имя по IP адресу (in-addr.arpa. , обратная зона). Используется dig, host and nslookup:
1 2 3 |
# dig -x 77.221.130.2 # host 77.221.130.2 # nslookup 77.221.130.2 |
Для локального преобразования имен (в рамках системы) можно использовать файл /etc/hosts:
1 2 3 |
# cat /etc/hosts 127.0.0.1 myibm localhost.localdomain localhost 192.168.1.2 myibm.zabrosov.local myibm |
5.10 DHCP
Интерфейс используемый по умолчанию — eth0
1 2 |
# dhcpcd -n eth0 # Обновить (не всегда работает) # dhcpcd -k eth0 # Освободить |
Полная информация о аренде:
1 |
/var/lib/dhclient/dhclient-eth0.leases |
5.11 Анализ трафика
Bmon — консольный монитор загрузки сетевых интерфейсов.
Sniff с tcpdump
1 2 3 4 5 6 7 8 9 10 11 12 |
# tcpdump -nl -i eth0 not port ssh and src (192.168.1.10 or 192.168.1.15) # tcpdump -n -i eth0 net 192.168.1.15 # трафик с/на IP # tcpdump -n -i eth0 net 192.168.1.0/24 # трафик с/в сеть # tcpdump -l > dump && tail -f dump # Вывод с записью в файл # tcpdump -i eth0 -w traffic.eth0 # Информация о трафике записывается в бинарный файл traffic.eth0 # tcpdump -i eth0 -s 0 -w traffic.eth0 # Запись + загрузка в бинарник # tcpdump -r traffic.eth0 # Читаем из файла # tcpdump port 80 # Весь трафик на 80 порт и ответы # tcpdump host google.com # Весь с/на google.com # tcpdump -i eth0 -X port (110 or 143) # Проверка pop и imap на безопасность # tcpdump -n -i eth0 icmp # Ловим pings # tcpdump -i eth0 -s 0 -A port 80 | grep GET # -s 0 весь пакет, -A для ASCII |
Важные опции: -A Отображает каждый пакет в открытом виде (текст), без заголовка -X Показывает пакеты в hex и ASCII -l Вывод в буффер -D Печать всех доступных интерфейсов (# tcpdump -D)
Nmap
nmap — сканер портов с возможностью определения OS.
1 2 3 4 5 6 7 8 9 |
# nmap zabrosov.ru # сканирует все зарезервированные TCP порты на хосте # nmap -sP 192.168.1.0/24 # Узнать занятые IP в сети 1.0/24 (IP, MAC, hostname) # nmap -sS -sV -O cb.vu # Скрытое SYN сканирование с определением типа и версии ОС # nmap -sX -p 22 192.168.10.10-250 -oN /data/host.txt # Сканирование машин с ip от 10 по 250 # на порт ssh с записью в файл # grep 192.168.10 /data/host.txt > /data/host# Пишем строки с ip адресами в файл # sed 's/Interesting ports on //g' /data/host | sed 's/://g' |sed 'w /data/host.txt' # Итог: получаем файл с IP машин, у который открыт ssh порт pdsh -w root@192.168.10.[10-100] "uptime" | sort -n # параллельная работа с несколькими машинами |
5.12 QoS
Ограничение скорости отдачи (Limit upload)
Целесообразно использовать для взаимодействия с DSL устройствами и различными модемами для согласования скорости.
1 2 3 4 5 |
# Для модема с upload 512Kbit. 90% от 512Kbit примерно 480Kbit # tc qdisc add dev eth0 root tbf rate 480kbit latency 50ms burst 1540 # tc -s qdisc ls dev eth0 # Статус # tc qdisc del dev eth0 root # Удалить очередь # tc qdisc change dev eth0 root tbf rate 220kbit latency 50ms burst |
Качество обслуживания (QoS)
tc — используем для приортета VoIP. Пусть VoIP спользует udp на портах 10000:11024 и интерфейс eth0. Команды в примере зададут качество обслуживания для 3 очередей и выделят VoIP для очереди 1 с QoS 0x1e (установлены все биты). По умолчанию потоков в очереди 3 и QoS Minimize-Delay поток в очереди 2.
1 2 3 4 5 6 7 |
# tc qdisc add dev eth0 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0 # tc qdisc add dev eth0 parent 1:1 handle 10: sfq # tc qdisc add dev eth0 parent 1:2 handle 20: sfq # tc qdisc add dev eth0 parent 1:3 handle 30: sfq # tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dport 10000 0x3C00 flowid 1:1 # используем диапазон портов сервера match ip dst 195.96.0.1 flowid 1:1 # и/или сервер IP |
Статус и удаление QoS
1 2 |
# tc -s qdisc ls dev eth0 # Состояние очереди # tc qdisc del dev eth0 root # Удалить все QoS |
Расчет диапазона портов и маски:tc фильтр определяет диапазон портов с портом и маской, которые мы будем использовать для расчета. Определим 2^N границы диапазона портов, расчитаем диапазон и переведем в HEX. Это и есть маска. Например для 10000 -> 11024, диапазон 1024.
1 |
# 2^13 (8192) |
5.13 NIS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# ypwhich# вернуть имя сервера YP с оригиналом базы данных # domainname # NIS domain name # ypcat group # Показать группы с NIS сервера # cd /var/yp && make # Перестроить YP базу # rpcinfo -p servername # Отчет о RPC сервисах на сервере # ps auxww | grep ypbind # статус NIS /usr/sbin/ypbind # yppoll passwd.byname Map passwd.byname has order number 1190635041. Mon Sep 24 13:57:21 2007 The master server is servername.domain.net. # cat /etc/yp.conf ypserver servername domain domain.net broadcast |
5.14 Netcat (nc)
Создаёт или читает/пишет TCP/IP соединения
Передать файл
Копирование файлов по сети напрямую по tcp. Копирование быстрое и не нужно создавать ftp, smb и т.д, мы просто делаем файлы доступными по сети. Пусть 192.168.1.1 IP сервера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# Передача папки server# tar -cf - -C VIDEO_TS . | nc -l -p 4444# Сделаем архив папки и прикрепим на 4444 порт client# nc 192.168.1.1 4444 | tar xpf - -C VIDEO_TS # Получим файл с порта 4444 и распакуем server# tar -czf - /etc/ | nc -l 3333 # Быстрый backup client# nc 192.168.1.1 3333 | pv -b > mybackup.tar.gz # Передача файла server# cat largefile | nc -l 5678 # Публикуем файл largefile на 5678 порт client# nc 192.168.1.1 5678 > largefile # Принимаем файл с 5678 порта в новый файл largefile server#cat backup.iso | pv -b | nc -l 3333 # Передаем файл с информацией о состоянии (прогресс) client#nc 192.168.1.1 3333 | pv -b > backup.iso# Получаем файл с информацией о состоянии (прогресс) # Передача образа server# dd if=/dev/sda0 | nc -l 4444 # Передаем образ раздела client# nc 192.168.1.1 4444 | dd of=/dev/sda0 # Клонируем раздел client# nc 192.168.1.1 4444 | dd of=sda0.img # или записываем образ в файл server# dd if=/dev/hdb5 | gzip -9 | nc -l 3333 client# nc 192.168.1.1 3333 | pv -b > myhdb5partition.img.gz |
Сканер портов
1 2 3 4 5 6 |
# nc -v -w 1 localhost -z 1-5901 |grep succeeded! Connection to localhost 22 port [tcp/ssh] succeeded! Connection to localhost 25 port [tcp/smtp] succeeded! # nc -z 192.168.1.112 1-90 Connection to 192.168.1.112 22 port [tcp/ssh] succeeded! Connection to 192.168.1.112 80 port [tcp/http] succeeded! |
Чат
1 2 |
zabrosov# nc -lp 4444 boss # nc 192.168.1.11 |
Hacks
1 2 3 4 |
# nc -lp 4444 -e /bin/bash # Удалённый shell (server backdoor) # nc -lp 4444 -e cmd.exe # Удалённый shell для Windows; -e только для win ? # webserver # while true; do nc -l -p 80 backup.iso |
6 SSH SCP
6.1 Public key аутентификация
Аутентификация — подтверждение подлинности; установление соответствия лица названному им идентификатору. Авторизация — процесс предоставления определенному лицу прав на выполнение некоторых действий. Идентификация — присвоение субъектам и объектам идентификатора и/или сравнение идентификатора с перечнем присвоенных идентификаторов.
Используем ssh-keygen для создания пары ключей. ~/.ssh/id_dsa приватный ключ, ~/.ssh/id_dsa.pub публичный ключ. Копируем публичный ключ на сервер и добавляем его в файл ~/.ssh/authorized_keys2 в вашу домашнюю папку.
1 2 |
# ssh-keygen -t dsa -N '' # cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2" |
Соединяемся с хостом без пароля используя public key аутентификацию
1 2 3 4 5 6 7 8 |
# ssh-keygen -q # Генерируем пару ключей # nmap -sX -p 22 192.168.10.10-250 -oN /data/host.txt # Сканирование машин с ip от 10 по 250 # на порт ssh с записью в файл # grep 192.168.10 /data/host.txt > /data/host# Пишем строки с ip адресами в файл # sed 's/Interesting ports on //g' /data/host | sed 's/://g' |sed 'w /data/host.txt' # Копируем публичный ключ на каждую машину из списка /data/host.txt # cat /data/host.txt | while read i ; do ssh-copy-id -i ~/.ssh/id_rsa.pub root@"$i" ; done # Копируем /etc/hosts сразу на все хосты из списка # cat /data/host.txt | while read i ; do scp /etc/hosts root@"$i":/etc/ ; done |
6.2 Проверка подписи (fingerprint)
При первом логине на хост, ssh спросит сохранить ли подпись хоста и является ли этот хост доверенным. Если мы сомневаемся и подозреваем хост в man-in-the-middle attack, то администратор хоста, может отправить вам подпись для сравнения. Получить ей можно с помощью команды ssh-keygen -l
1 2 3 4 5 6 7 8 9 |
host# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub # RSA key 2048 47:a5:c6:27:78:06:89:f8:97:3d:02:90:17:29:96:a5 /etc/ssh/ssh_host_rsa_key.pub host# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub # DSA key (default) 1024 46:b8:07:38:7a:23:ba:bd:d5:b4:ba:27:cd:a9:38:e5 /etc/ssh/ssh_host_dsa_key.pub ssh host The authenticity of host '192.168.50.55 (192.168.50.55)' can't be established. RSA key fingerprint is 47:a5:c6:27:78:06:89:f8:97:3d:02:90:17:29:96:a5. Are you sure you want to continue connecting (yes/no)? |
6.3 Безопасная передача файлов
1 2 3 4 5 |
# scp file.txt host-two:/tmp # scp joe@host-two:/www/*.html /www/tmp # scp -r joe@host-two:/www /www/tmp # Копируем папки, -r рекурсия # с помощью опции -P, указываем на какой порт подключаемся, если ssh на 2525 порту. # scp -P 2525 ./file_to_copy root@remote_host:/tmp/copied_file |
6.4 Туннелирование (Tunneling)
SSH туннелирование позволяет перенаправлять порты через SSH соединения, тем самым обеспечивая трафик и доступ к портам, которые иначе были бы заблокированы. Работает только для TCP.
1 2 3 |
# localhost:localport destport:gate # ssh -R destport:desthost:localport user@gate # Локальный порт будет перенаправлен на указанный порт удаленного хоста # ssh -X user@gate # Форвардинг Х сеанса |
Прямое перенаправление на шлюз
Нужно получить доступ к CVS (порт 2401) и http (порт 80), запущенных на удаленном хосте. Мы подключаем к локальному порту 2401, соответствующий порт удаленного хоста, а для доступа к удаленному порту 80 используем локальный порт 8080. Единожды открыв ssh сессию, все соответствующие сервисы удаленного хоста, будут доступны на локальных портах.
1 |
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate |
Форвардинг портов Netbios и RDP
1 |
# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate |
Теперь SMB шара доступна по адресу \127.0.0.1, но только если отключена локальные шара, поскольку локальная шара тоже использует 139 порт. Что-бы иметь возможность оставить локальные расшаренные русурсы включенными, нужно создать новый виртуальный интерфейс с новым IP адресом для создания туннеля, SMB шара будет подключена через этот IP адрес. Кроме того, локальный RDP уже использует порт 3389, поэтому мы выбираем 3388. Для приведенного ниже примера, будем использовать виртуальный IP адрес 10.0.0.1. Создаем loopback интерфейс с IP адресом 10.1.1.1:
1 2 3 4 5 |
# System->Control Panel->Add Hardware # Добавляем новое устройство # Устанавливаем устройство выбрав его вручную Network adapters -> Microsoft -> Microsoft Loopback Adapter. Настраиваем IP адрес созданного устройства на 10.1.1.1 маска 255.255.255.0, без шлюза. advanced-> WINS, Enable LMHosts Lookup; Disable NetBIOS over TCP/IP. # Enable Client for Microsoft Networks. # Отключить общие файлы и принтеры для сетей Microsoft |
Подключение клиентов, находящихся за NAT
Есть две машины, находящиеся за NAT шлюзом, клиенты имеют доступ к Linux-шлюзу по ssh. Поскольку будут использованы порты, выше 1024, root доступ не понадобится. На шлюзе мы используем порт 2022.
1 2 3 |
cliuser# ssh -R 2022:localhost:22 user@gate # Форвардинг порта клиента 22, на порт 2022, шлюза cliadmin# ssh -L 3022:localhost:2022 admin@gate# Форвардинг порта клиента 3022, на порт 2022 шлюза cliadmin# ssh -p 3022 admin@localhost # local:3022 -> gate:2022 -> client:22 |
Подключение к рабочему столу, расположенному за NAT
Нужно получить доступ к Windows клиенту с VNC слушающем на 5900 порту.
1 2 3 |
cliwin# ssh -R 15900:localhost:5900 user@gate cliadmin# ssh -L 5900:localhost:15900 admin@gate cliadmin# vncconnect -display :0 localhost |
Multi-hop ssh tunnel
Мы не можете получить прямой доступ к ssh сервера,а возможно это только через промежуточные хосты(например из-за проблем с маршрутизацией), но получить соединение клиент-сервер необходимо, к примеру что-бы скопировать файлы через SCP или пробросить порт для SMB. Сделать это можно, организовав туннель из цепочки хостов. Допустим нам нужно перебросить ssh порт клиента к серверу, в два скачка. Когда туннель будет создан, будет возможно прямое подключение клиент — сервер.Создание туннеля: cli -> host_1 -> host_2 -> сервер and dig tunnel 5678
1 2 3 |
cli# ssh -L 5678:localhost:5678 host_1 # 5678 произвольный порт для туннеля host_1# ssh -L 5678:localhost:5678 host_2 # 5678 с host_1 на host_2 host_2# ssh -L 5678:localhost:22 server # и туннель на порт 22 сервера |
client -> server используя туннель и порт 5678
1 2 3 |
# ssh -p 5678 localhost # Соединение напрямую cli -> server # scp -P 5678 myfile localhost:/tmp/ # Копируем файлы через туннель # rsync -e 'ssh -p 5678' myfile localhost:/tmp/ # или rsync |
Автосоединение (Autoconnect)
/home/admin/port_forward.sh
1 2 3 4 |
#!/bin/sh COMMAND="ssh -N -f -g -R 3022:localhost:22 admin@gate" pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND exit |
crontab -e
1 |
1 * * * * admin /home/admin/port_forward.sh # Поддерживаем соединение |
1 2 3 4 |
# Другой вариант, не проверял # while [ ! -f /tmp/stop ]; do ssh -o ExitOnForwardFailure=yes -R 2222:localhost:22 target "while nc -zv localhost 2222; do sleep 5; done"; sleep 5;done |
6.5 SSH tricks
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# ssh-copy-id user@host# Копируем ключ на host, для доступа на host без пароля # cat ~/.ssh/id_rsa.pub | ssh user@machine “mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys” # Копируем ключ без ssh-copy-id # ssh -4 -C -c blowfish-cbc # Быстрый и безопасный ssh клиент # ssh-keygen; ssh-copy-id user@host; ssh user@host # Передаем public key одной командой # sed -i 8d ~/.ssh/known_hosts # Удалить строку 8, если “ssh host key change” # ssh -N -L2001:localhost:80 user@host # Туннель с host:80 к вашей машине , порт 2001. http://localhost:2001/ # dd if=/dev/dsp |ssh -c arcfour -C username@host dd of=/dev/dsp # Передача звука микрофона на удаленный host # ssh user1@local_server 'play /usr/share/sounds/gaim/arrive.wav # Удаленное выполнение команды # ssh user@host cat /path/to/remotefile |diff /path/to/localfile # Сравнение локального и удаленного файлов # sshfs name@server:/path/to/folder /path/to/mount/point# Монтируем через ssh # ssh -t reachable_host ssh unreachable_host # Соеденение через хост # Копируем с host1 на host2 через наш компьютер # ssh root@host1 “cd /somedir/tocopy/ && tar -cf – .” | ssh root@host2 “cd /samedir/tocopyto/ && tar -xf -” # ssh -fX user@host firefox # Удаленный запуск GUI программ # ssh -t remote_host screen -r # screen через ssh # ssh host -l user “`cat cmd.txt`” # Комплексное выполнение команд через ssh # mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost “mysql -uUSER -pPASS NEW_DB_NAME” # Dumps MySQL DB на новый сервер # yes | pv | ssh $host “cat > /dev/null” # Скорость ssh соединения, yum install pv # ssh -t user@some.domain.com /usr/bin/screen -xRR #Сохранить удаленную сессию screen для re-connect # rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file # Копируем большой файл. rsync на обоих машинах # autossh -M50000 -t server.example.com ‘screen -raAd mysession’ # SSH сессия открыта всегда, помогает если теряется соединение # tar -cj /backup |cstream -t 777k |ssh host ‘tar -xj -C /backup’ # Ограничиваем скорость с cstream до 777k bit/s # ssh user@host cat /path/to/some/file | xclip # Копируем stdin в наш X11 buffer # while read server; do ssh -n user@$server "command"; done |
Постоянное соединение:
1 2 3 4 |
# ssh -MNf user@host # Создать постоянное соединение с машиной, удобно для rsync/sftp/cvs/svn, работает в bg # Редактируем ~/.ssh/config или /etc/sshd_config ControlPath ~/.ssh/master-%r@%h:%p ControlMaster no |
Port Knocking
1 2 3 4 |
# knock host 3000 4000 5000 && ssh -p port user@host && knock host 5000 4000 3000 # Установить knock. Обращаемся к определенным портам, чтоб от крыть доступ к ssh, а потом его закрыть. # nano /etc/knockd.conf: |
[options]
logfile = /var/log/knockd.log [openSSH] sequence = 3000,4000,5000 seq_timeout = 5 command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 5000,4000,3000 seq_timeout = 5 command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT tcpflags = syn
7 VPN с SSH
7.1 P-2-P | 7.2 Lan-2-Lan
OpenSSH поддерживает устройства tun/tap, позволяющие создавать шифрованный туннель. Плюс протокола SSH в том, что для реализации не нужно устанавливать и настраивать дополнительный софт, минус — низкая производительность на медленных линиях.
В /etc/ssh/sshd_config, должны стоять опции:
1 2 |
PermitRootLogin yes PermitTunnel yes |
7.1 P-2-P
Соединим два хоста client и server. Соединение инициирует client к server, при этом он должен обладать правами root. Конечные адреса туннеля 10.0.0.1 (server) и 10.0.0.2 (client), кроме того мы создаем устройство tun1.
1 2 3 4 5 6 |
# modprobe tun # Проверка поддержки tun ядром client# ssh -w1:1 root@server server# ifconfig tun1 10.0.1.1 netmask 255.255.255.252 # Выполняем в server shell client# ifconfig tun1 10.0.1.2 netmask 255.255.255.252 # SSH клиент |
7.2 Lan-2-Lan
Есть две сети, их нужно соединить, сеть А с адресом 192.168.51.0/24 и сеть Б с адресом 192.168.16.0/24. 192.168.51.0/24 (сеть A)|шлюз A <-> шлюз Б|192.168.16.0/24 (сеть Б)
1 2 3 4 5 6 7 8 9 10 11 |
# сеть B gateA># ssh -w5:5 root@gateB gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5 gateB># echo 1 > /proc/sys/net/ipv4/ip_forward gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # сеть A gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252 gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5 gateA># echo 1 > /proc/sys/net/ipv4/ip_forward gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
8 Backup
8.1 rsync
rsync используется для удаленного копирования (локально тоже используется) или синхронизации файлов и каталогов. Может практически целиком заменить cp и scp, поддерживает сжатие и рекурсию, прерванные передачи можно перезапустить.
1 2 3 |
# rsync -a /home/zabrosov/ /backup/zabrosov/ # "archive" mode # rsync -a /var/ /var_bak/ # rsync -aR --delete-during /home/user/ /backup/ # Используется относительный путь |
Копируем через сет с компрессией. По-умолчанию, Rsync использует для передачи протокол SSH в том числе и с ключами, если таковые имеются. Символ «:» используется как в SCP.
1 |
rsync -axSRzv /home/user/ user@server:/backup/user/ |
Исключить из процесса удаленного копирования директорию tmp в /home/user/ и сохранить иерархию, удаленная директория будет иметь структуру /backup/home/user/:
1 2 |
# rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/ # rsync -az -e 'ssh -p 20022' /home/colin/ user@server:/backup/colin/ # Использовать 20022 порт для SSH |
Можно использовать rsync с «::», это гораздо быстрее, но трафик не шифруется. Местонахождение папки для резервного копирования (например /backup) можно настроить в файле /etc/rsyncd.conf. Переменная RSYNC_PASSWORD служит для того, что-бы избежать необходимости ввода пароля вручную.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# rsync -axSRz /home/ user@hostname::rmodule/backup/ # rsync -axSRz user@hostname::rmodule/backup/ /home/ # Обратно # Опции: -a, --archive# режим архивирования; как -rlptgoD (без -H) -r, --recursive # обходить директории (рекурсия) -R, --relative # относительные пути -H, --hard-links # сохранять жесткие ссылки ( hardlink ) -S, --sparse # эффективная обработка файлов -x, --one-file-system # не пересекать границы файловой системы --exclude=PATTERN # исключить файлы заданного образца --delete-during # удаление файлов при передаче (источник) --delete-after # удаление файлов после передачи |
8.2 tar
tar — архивирование файлов и директорий. Сам по себе tar, это не сжатый архив, сжатые архивы имеют расширения .tgz или .tar.gz (gzip) или .tbz (bzip2).
Создание архива tar:
1 2 3 4 5 6 7 8 9 |
# cd / # tar -cf home.tar home/ # Создать архив, поместив в него директорию /home ( ключ -c, для создания ) # tar -czf home.tgz home/ # То-же, но с gzip компрессией # tar -cjf home.tbz home/ # То-же, но с bzip2 компрессией # Рекомендуется использовть относительные пути, чтоб можно было распаковать в любое место # tar -C /usr -czf local.tgz local/etc local/www # Cоздаlbv архив, содержащий директории /usr/local/etc, # /usr/local/www, директория local/ должна быть началом дерева # tar -C /usr -xzf local.tgz # Распаковать архив директорию local в дерево /usr # cd /usr; tar -xzf local.tgz # То-же, что выше |
Распаковать архив tar:
1 2 3 4 5 |
# tar -tzf home.tgz # Просмотр содержимого архива без его распаковки (листинг) # tar -xf home.tar # Распаковать архив в текущую папку(ключ "x" для распаковки) # tar -xzf home.tgz # То-же для архива с zip компрессией # tar -xjf home.tbz # То-же для архива с bzip2 компрессией # tar -xjf home.tbz home/zabrosov.ru/file.txt # Распаковать один файл |
Полезно:
1 2 3 4 5 |
# tar c dir/ | gzip | ssh user@remote 'dd of=dir.tgz' # Создать архив, содержащий директорию dir/ и сохранить удаленно # tar cvf - `find . -print` > backup.tar # Создать архив с текущей директорией # tar -cf - -C /etc . | tar xpf - -C /backup/etc # Копировать директории # tar -cf - -C /etc . | ssh user@remote tar xpf - -C /backup/etc # Удаленное копирование # tar -czf home.tgz --exclude '*.o' --exclude 'tmp/' home/ # Создать архив с сжатием, исключив '*.o', tmp/ |
8.3 dd
dd ( disk dump или destroy disk ) — используется для копирования (конвертирования) дисков, разделов, и прочих операций копирования.
Синтаксис:
1 2 3 4 5 |
# dd if= of= bs= conv= # Опции conv: notrunc # Не обрезать нули в файле на выходе, записывая их как нули noerror # Продолжать после ошибок чтения sync # Дополнять каждый входящий блок нулями до размера ibs-size |
Размер входных данных по-умолчанию 512 байт (1 блок). Увеличение размера блока ускоряет процесс копирования, но требует больше памяти.
Резервное копирование и восстановление
1 2 3 4 5 6 7 8 |
# dd if=/dev/hda of=/dev/hdc bs=16065b # Копировать с диска на диск с таким-же размером # dd if=/dev/sda7 of=/home/root.img bs=4096 conv=notrunc,noerror # Резервное копирование в файл образа # dd if=/home/root.img of=/dev/sda7 bs=4096 conv=notrunc,noerror # Восстановление из файла образа # dd bs=1M if=/dev/ad4s3e | gzip -c > ad4s3e.gz# Сделать резервную копию и заархивировать в Zip # gunzip -dc ad4s3e.gz | dd of=/dev/ad0s3e bs=1M # Восстановить из архива # dd bs=1M if=/dev/ad4s3e | gzip | ssh eedcoba@fry 'dd of=ad4s3e.gz' # Что и выше, удаленно # gunzip -dc ad4s3e.gz | ssh root@host 'dd of=/dev/ad0s3e bs=1M' # dd if=/dev/ad0 of=/dev/ad2 skip=1 seek=1 bs=4k conv=noerror # Пропустить MBR (Master Boot Record) # Необходимо если диск назначения (ad2) меньше |
Recover
dd считывает раздел поблочно, если на диске предположительно есть проблемы, нужно использовать опцию conv=sync,noerror, при этом dd будет пропускать битые блоки и записывать нули на диск назначения. Поэтому важно, установить размер блока, равным, или меньшим, чем размер блока на диске. Вполне подходящим будет размер блока в 1 килобайт, установить размер на входе и выходе можно опцией bs=1k. Если на диске имеются сбойные сектора, но основные данные нужно сохранить с данного раздела, можно создать файл образа, смонтировать образ и копировать данные на новый диск. С установленной опцией noerror, dd пропустит поврежденные блоки, записав на их место нули, при этом, потеряны будут, только данные, содержавшиеся в сбойных секторах диска.
1 2 3 4 5 6 7 |
# dd if=/dev/hda of=/dev/null bs=1m # Проверить на наличие бэд блоков # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc | gzip | ssh root@fry 'dd of=hda1.gz bs=1k' # Отправить на удаленный хост # dd bs=1k if=/dev/hda1 conv=sync,noerror,notrunc of=hda1.img # Сохранить в образ # mount -o loop /hda1.img /mnt # Создание и монтирование образа # rsync -ax /mnt/ /newdisk/# Копировать на новый диск # dd if=/dev/hda of=/dev/hda # Обновить # Обновление диска, безопасная операция, но диск при этом должен быть размонтирован |
Удаление данных
1 2 3 |
# dd if=/dev/zero of=/dev/hdc # Удалить все данные с диска (забивает диск нулями) # dd if=/dev/urandom of=/dev/hdc # Удалить все данные с диска (более предпочтительный вариант, но дольше) # kill -USR1 PID # Посмотреть текущее состояние dd |
MBR
MBR содержит код загрузчика и таблицу разделов. Первый 466 байт отводятся под загрузчик, 466-512 байт под таблицу размещения разделов.
1 2 3 4 5 |
# dd if=/dev/sda of=/mbr_sda.bak bs=512 count=1 # Сделать резервную копию MBR # dd if=/dev/zero of=/dev/sda bs=512 count=1 # Удалить MBR и таблицу размещения разделов # dd if=/mbr_sda.bak of=/dev/sda bs=512 count=1 # Восстановить MBR целиком # dd if=/mbr_sda.bak of=/dev/sda bs=446 count=1 # Восстановить только загрузчик # dd if=/mbr_sda.bak of=/dev/sda bs=1 count=64 skip=446 seek=446 # Восстановить таблицу размещения разделов |
9 sudo
sudo — повысить уровень привелегий, дать права на выполнение, без выдачи пароля на root.
1 2 |
# sudo /etc/init.d/dhcpd restart # Запустить стартовый скрипт от имени root # sudo -u sysadmin whoami # Запустить команду от имени другого пользователя |
sudo конфигурируется в файле /etc/sudoers или с помощью команды visudo
1 2 3 4 5 6 7 8 |
user hosts = (runas) commands # В /etc/sudoers, базовый синтаксис. разделитель: , users - один или более пользователей или %group (например %wheel) для расширения прав доступа hosts - список хостов (или ALL) runas - список пользователей (или ALL) от чьего имени могут выполняться команды. Заключается в ( ) commands - список команд (или ALL), которые можно запустить от имени root или от имени других пользователей (runas) Используются псевдонимы: User_Alias, Host_Alias, Runas_Alias и Cmnd_Alias. |
/etc/sudoers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Псевдонимы хоста, подсети или имена хостов Host_Alias DMZ = 212.118.81.40/28 Host_Alias DESKTOP = work1, work2 # Псевдонимы пользователя, список пользователей имеющих некоторые права доступа User_Alias ADMINS = colin, luca, admin User_Alias DEVEL = joe, jack, julia Runas_Alias DBA = oracle,pgsql # Псевдонимы команд, список полных путей до команд Cmnd_Alias SYSTEM = /sbin/reboot,/usr/bin/kill,/sbin/halt,/sbin/shutdown,/etc/init.d/ Cmnd_Alias PW = /usr/bin/passwd [A-z]*, !/usr/bin/passwd root # НЕ root pwd Cmnd_Alias DEBUG = /usr/sbin/tcpdump,/usr/bin/wireshark,/usr/bin/nmap # Актуальные права доступа root,ADMINS ALL = (ALL) NOPASSWD: ALL # ADMINS может что-то делать без пароля DEVEL DESKTOP = (ALL) NOPASSWD: ALL # Разработчики имеют полные права доступа на рабочих станциях DEVEL DMZ = (ALL) NOPASSWD: DEBUG # Разработчики могут отлаживать DMZ сервера # Пользователь sysadmin может использовать некоторые команды sysadmin DMZ = (ALL) NOPASSWD: SYSTEM,PW,DEBUG sysadmin ALL,!DMZ = (ALL) NOPASSWD: ALL # Какие-то права за рамками DMZ %dbaALL = (DBA) ALL # Группа dba может работать от имени пользователя базы данных # Все могут монтировать/размонтировать CDROM на рабочих станциях ALL DESKTOP = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom |
10 Управление пакетами
10.1 yum rpm apt-get
yum устанавливает пакет и все зависимости (пакеты|библиотеки) для его работы из репозиториев.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# yum install firefox # Установит браузер # yum localinstall openssh-server.i686.5.5p1-24.fc14.2.rpm --nogpgcheck # Установить из локального rpm файла, # разрешить зависимости, не проверять подпись # yum reinstall openssh-server # Переустановить пакет # yum remove openssh-server # Удалить пакет и, если нужно, его зависимости # yum update bind # Обновление пакета # yum search ssh # Поиск по описаниям, именам пакета и другой доступной информации в репозиториях и в локальной базе # yum list *firefox* # Поиск пакетов содержащих в имени firefox в локальной базе и репозиториях # yum list installed *firefox* # Поиск среди установленных в системе пакетов содержащих в имени firefox # yum info *firefox* # Поиск пакетов содержащих в имени firefox (локальной базе и репозиториях) с выводом информации о пакете # yum whatprovides */bin/ls # Поиск пакетов необходимых ls yum clean dbcache|all # Информация кэшируется, очистить кэш |
Работа с пакетами, без разрешения зависимостей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# rpm -q package # Имя пакета и версия # rpm -qa package # Все установленные пакеты содержащие package # rpm -K package # Проверить подписи пакета # rpm -qf filename # Пакет содержащий filenames # rpm -ivh openssh* # Установить пакет # rpm -qi bash # Информация # rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY # Импортировать файл подписи # Debian|Ubuntu # apt-cache search nginx # Поик нужного пакета в репозитарии # apt-get update # Обновить список пакетов # apt-get install emacs # Установить пакет emacs # dpkg --remove emacs # Удалить пакет emacs # dpkg -S file # Найти какому пакету принадлежит файл # dpkg -l # Список всех установленных пакетов # ldd /usr/bin/rsync # Список необходимых библиотек для rsync # ldconfig -n /path/to/libs/# Добавить путь к разделяемым библиотекам # LD_LIBRARY_PATH # Данная переменная устанавливает путь к библиотекам |
10.2 репозитории
Создаем файл заканчивающийся на .repo в /etc/yum.repos.d/ (Для дистрибутивов с yum):
1 2 3 4 5 6 |
# nano /etc/yum.repos.d/google.repo [Google] # repo-name name=Google - i386 # Описание baseurl=http://dl.google.com/linux/rpm/stable/i386 # протокол и путь к репозиториюдиректории enabled=1 # 1-разрешить|0-запретить использование репозитория gpgcheck=0 # 1-разрешить|0-запретить проверку подписи |
10.3 update kernel, обновить OS
Обновить дистрибутив
Обновим Centos 5.5 до 5.6:
1 2 3 4 5 6 7 8 |
# yum clean all # yum update glibc* # yum update yum* rpm* pyth* # yum clean all # yum update mkinitrd nash # yum update selinux* # yum update # shutdown -r now |
Обновить ядро
Установим ядро с поддержкой виртуализации:
1 2 3 4 5 6 7 8 9 10 |
# nano /etc/sysconfig/selinux && reboot # Отключим selinux и перегрузим SELINUX=disabled # yum install kernel-xen xen # Установка ядра с поддержкой виртуализации и Xen # nano /boot/grub/menu.lst # Редактируем меню выбора загрузки версии ядра default=0 # По умолчанию идет загрузка самого первого ядра (xen) timeout=5 # Время ожидания grub splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.18-164.6.1.el5xen) |
Обновить ядро:
1 2 |
# yum update kernel-PAE # yum list installed kernel* |
11 Полезные команды
11.1 mail
mail — это базовое приложение для отправки и получения электронной почты. Для отправки почты, просто наберите «mail user@domain». Первая строка, это «Тема» (subject), далее идет содержимое письма. Закончить набор и отправить письмо можно, введя на новой строке символ «.»(точка):
1 2 3 4 5 6 |
# mail mail@zabrosov.ru Subject: Servers:We are working! "All servers is work, well." . EOT # |
Другой вариант:
1 |
# echo "This is the mail body" | mail mail@zabrosov.ru |
11.2 screen
screen — оконный менеджер виртуальных терминалов
screen имеет две основные функции: — Запуск нескольких сессий терминала, в одном окне. — Запуск программ отдельно от терминала в фоновом режиме. Терминал может быть отключен и переподключен позже.
1 2 3 4 5 6 7 8 9 10 11 12 |
# screen # Запустили менеджер # tail -f /var/log/messages # Вывод логов для примера листинга # Отсоединим screen от физического терминала нажав: +<a>+ # screen -rd # Переподключиться # screen -x# Подключиться в многоэкранном режиме (полезно для совместной работы) # echo "defscrollback 5000" > ~/.screenrc # Увеличить буфер до 5000 (по умолчанию 100) # Все команды screen начинаются с +</a><a> F+</a><a> > # Справка и список доступных функций F+</a><a> # Создать новое окно (терминал) F+</a><a>+ и +</a><a>+</a> |
# Переключиться на предыдущий или следующий экран F+ # Где N, число от 0 до 9, что-бы переключится на окно с соответствующим номером F+ # Получить список запущенных окон F+ # Очистить пропущенный + F+ + # Отключиться, оставив сессию запущенной в фоновом режиме F+ # Заблокировать терминал паролем F+ # запуск режима scrollback mode, для выхода F+ # Прокрутка на полстраницы вверхF+ # Прокрутка на страницу вверх F+ # Прокрутка на полстраницы вниз F+ # Прокрутка на страницу вниз F> # Поиск вперед F> # Поиск назад
Сессия терминала прерывается, когда будет закрыта работающая программа и сделан выход с терминала.
11.3 find
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Некоторые опции: -xdev # Оставаться на то-же файловой системе -exec cmd {} ; # Выполнить команду, если есть {}, то find заменяет их на путь и имя файла найденного файла -iname # То-же, что и -name (поиск по имени), но без учета регистр -ls # Показать информацию о файле (как ls -la) -size n # Размер в блоках или байтах, n (равно n блоков), +n (более n блоков), -n (менее n блоков), # доступные обозначения размеров: k, M, G, T, P -cmin n # Статус файла был изменен N минут назад # find . -type f ! -perm -444 # Найти невидимые для всех файлы # find . -type d ! -perm -111 # Поиск недоступных для всех папок # find /home/user/ -cmin 10 -print # Файлы созданные или модифицированные за последние 10 минут # find . -name '*.[ch]' | xargs grep -E 'expr' # Найти 'expr' в текущей директории # find / -name "*.core" | xargs rm # Найти и удалить аварийные дампы(так-же можно искать core.*) # find / -name "*.core" -print -exec rm {} ; # Другой сиснтаксис # Найти все графические файлы и создать архив, iname -регистронезависимо. -r -добавить # find . ( -iname "*.png" -o -iname "*.jpg" ) -print -exec tar -rf images.tar {} ; # find . -type f -name "*.txt" ! -name README.txt -print # Исключая файлы README.txt # find /var/ -size +10M -exec ls -lh {} ; # Найти файлы больше 10MB # find /var/ -size +10M -ls # То-же, что и выше # find . -size +10M -size -50M -print # Найти файлы больше 10MB, но меньше 50MB # Найти файлы, принадлежащие определенному пользователю и с определенными правами # find / -type f -user root -perm -4000 -exec ls -l {} ; |
Будьте осторожны при использовании xargs или exec, они могут возвращать неверный результат если имена файлов или директорий содержат пробелы. Используйте -print0 | xargs -0, вместо | xargs. Опция -print0 должна быть последней.
1 2 3 |
# find . -type f | xargs ls -l # Не будет работать при наличии пробелов в именах # find . -type f -print0 | xargs -0 ls -l # Будет работать нормально с пробелами # find . -type f -exec ls -l '{}' ; # Или используйте с -exec, ковычки '{}' |
11.4 sed
sed — это неинтерактивный строчный редактор.
1 2 3 4 5 6 7 8 9 |
# sed 's/string1/string2/g' # Заменить string1 на string2 # cat ./wrong.txt | sed 's/wrong/right/g' > ./right.txt # Вывести содержимое файла, заменить слова и записать в другой файл # sed 's/(.*)1/12/g' # Модифицировать "строку1" в "строку2" # sed '//,//d' t.xhtml # Удалить строки, начинающиеся с p> # И заканчивающиеся # sed '/ *#/d; /^ *$/d' # Удалить комментарии и пустые строки # sed 's/[ t]*$//' # Удалить символы табуляции # sed 's/^[ t]*//;s/[ t]*$//' # Удалить пробелы в начале и конце # sed 's/[^*]/[&]/' # Заключить первый символ в квадратные скобки # sed = file | sed 'N;s/n/t/' # Порядковый номер в каждой строке |
11.5 awk
awk — это весьма мощьный и полезный язык для обработки текстовой информации
1 2 3 4 5 |
# awk '{ print $2, $1 }' file# Вывести из файла 2 колонки, поменя из местами # awk '{printf("%5d : %sn", NR,$0)}' file # Форматирование вывода с номерами строк # awk '{print FNR "t" $0}' files # Несколько измененный вариант # awk NF test.txt # Удалить из вывода пустые строки (аналогично grep '.') # awk 'length > 80' # Напечатать строки, длинной более 80 символов |
11.6 Regexp
Regexp — регулярные выражения
1 2 3 4 5 6 7 8 9 10 |
[^$.|?*+() # Специальные символы, остальные символы означают самих себя # Экранирует специальные символы * # Повтор 0 или 1 раз . # Любой символ, за исключением символа новой строки .* # Совпадает 0 или более символов ^ # Начало строки $ # Конец строки .$ # Совпадает с одним любым символ в конце строки ^ $ # Совпадает со строкой, состоящей из одного пробела [^A-Z] # Любые символы, не входящие в диапазон от А до Z |
11.7 Доп. команды
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# sort -t. -k1,1n -k2,2n -k3,3n -k4,4n# Отсортировать IPv4 ip адреса # echo 'Test' | tr '[:lower:]' '[:upper:]' # Смена регистра символов # echo foo.bar | cut -d . -f 1 # Вернет foo # PID=$(ps | grep script.sh | grep bin | awk '{print $1}') # PID запущенного скрипта # PID=$(ps axww | grep [p]ing | awk '{print $1}') # PID процесса ping # IP=$(ifconfig $INTERFACE | sed '/.*inet addr:/!d;s///;s/ .*//') # cat /etc/master.passwd | grep -v root | grep -v *: | awk -F":" # Создание файла паролей http passwd # '{ printf("%s:%sn", $1, $2) }' > /usr/local/etc/apache2/passwd # testuser=$(cat /usr/local/etc/apache2/passwd | grep -v # Проверить пользователя в passwd # root | grep -v *: | awk -F":" '{ printf("%sn", $1) }' | grep ^user$) # :(){ :|:& };: # bash fork bomb :). Машина зависнет! # tail +2 file > file2 # Удалить первую строку из файла |
Изменить расширение для кучи файлов
1 2 3 4 |
# ls *.cxx | awk -F. '{print "mv "$0" "$1".cpp"}' | sh # .cxx в .cpp # ls *.c | sed "s/.*/cp & &.$(date "+%Y%m%d")/" | sh # Копировать файлы *.c в *.c.20080401 # rename .cxx .cpp *.cxx # Переименовать все файлы .cxx в cpp # for i in *.cxx; do mv $i ${i%%.cxx}.cpp; done # Встроенными средствами |
12 Shell
В большинстве Linux, в качестве системной оболочки, используется bash.
1 2 3 4 5 6 7 |
# cmd 1> file # Пренаправить stdout (стандартный вывод) в файл # cmd 2> file # Перенаправить stderr (стандартный вывод ошибок ) в файл # cmd 1>> file # Перенаправить stdout и дописать его в файл # cmd &> file # Перенаправить все stdout и stderr в файл # cmd >file 2>&1 # Пренаправить stderr в stdout и потом в файл # cmd1 | cmd2 # Передать stdout на вход команды cmd2 # cmd1 2> &1 | cmd2 # Передать stdout и stderr команде cmd2 |
Настройка оболочки в файле конфигурации ~/.bashrc ( так-же может быть ~/.bash_profile )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ~/.inputrc bind '"e[A"':history-search-backward # Использовать клавиши "вверх" и "вниз" для поиска bind '"e[B"':history-search-forward # История введенных команд # .bashrc set -o emacs # Установить emacs режим в bash (см. ниже) set bell-style visible # Не подавать звуковой сигна, инверировать цвета [user@host]/path/todir> # Настройка строки приглашения shell PS1="[33[1;30m][[33[1;34m]u[33[1;30m]" PS1="$PS1@[33[0;33m]h[33[1;30m]][33[0;37m]" PS1="$PS1w[33[1;30m]>[33[0m]" export PS1='33[00;32m][`date +%d" "%h" "%Y" "%T`] u@h wn $[33[00m] ' # видно юзера/хост, дату и время export HISTTIMEFORMAT='%F %T ' # Ведение лога истории с datestamp'ом PROMPT_COMMAND='history -a;history -n' # Занесение команды в .bash_history сразу же, # после нажатия enter, удобно при работе в нескольких сессиях export HISTSIZE=100500 # Увеличение размера хистори export HISTCONTROL=ignoredups # не заносить в хистори повторяющиеся друг за другом команды export HISTIGNORE="&:ls:[bf]g:exit:[ ]*:ssh:history" # Отключаем занесение «бесполезных» с точки зрения истории команд export EDITOR=nano # nano станет редактором по умолчанию alias u='sudo pacman -Syu' # Используем сокращения для популярных команд |
F<Ctrl>+<R> — вводишь слово, с которым надо найти команду в истории. Повторные F<Ctrl>+<R> перебирают все команды в истории с этим словом.
F<Ctrl>+<L> — очистка экрана.
F<Ctrl>+<A> — замена F<Home>,F <Ctrl>+<E> — F<End>
F<Ctrl>+<U> — удаление текста от курсора до начала строки, F<Ctrl>+<K> — удаление от курсора до конца строки, F<Ctrl>+<Y> — вставить удаленный предыдущими примерами кусок текста, F<Ctrl>+<C> — удаление всей строки (обычно работает как отмена команды).
F<Ctrl>+<T> — меняет местами символ под курсором и предыдущий набранный (при опечатке вида /dev/dsa вместо /dev/sda)
^^ — После попытки выполнить команду, набранную с ошибкой, строка вида ^ошибка^правильно запустит на выполнение исправленную команду.
# — если вместо набранной команды надо сначала выполнить другую, можно закомментировать строку и нажать <enter>, впоследствии вернуться к команде в истории, раскомментировать и выполнить.
F<Alt>+<.> — подставляет к текущей команде аргумент предыдущей.
13 Печать
1 2 3 4 5 6 7 8 9 10 11 12 |
# lpr exemple.ps # Печать на принтер по-умолчанию # export PRINTER=hp4600 # Сменить принтер по-умолчанию # lpr -Php4500 #2 page.ps # Печать 2-х экземпляров, используя принтер hp4500 # lpr -o Duplex=DuplexNoTumble # Печать двухсторонних страниц # lpr -o PageSize=A4,Duplex=DuplexNoTumble # lpq # Проверить очередь печати принтера по-умолчанию # lpq -l -Php4500 # Очередь печати принтера hp4500 с отладочной информацией # lprm - # Удалить все пользовательские задания на печать, с принтера по-умолчанию # lprm -Php4500 3186 # Удалить задание из очереди печати с номеров 3186 # lpc status # Список всех доступных принтеров # lpc status hp4500# Проверка доступности принтера и длины очереди печати |
14 Дисковые квоты
Квоты распределяются на уровне файловой системы и поддерживаются ядром.
Пакет quota, нужно установит дополнительно, затем активировать дисковые квоты в файле fstab и перемонтировать раздел
1 2 3 |
/dev/sda2 /home ext3 rw,acl,user_xattr,usrquota 1 1 # mount -o remount /home # mount # Проверьте, активна-ли usrquota, иначе перезагрузитесь |
Инициализация файла quota.user с помощью quotacheck.
1 2 3 |
# quotacheck -vum /home # chmod 644 /home/aquota.user # Позволить пользователю просматривать свои квоты # quota -v |
По-умолчанию, дисковые квоты не накладывают никаких ограничений (установлены в 0). Установить необходимые лимиты для пользовательских квот можно с помощью программы edquota. Так-же лимиты можно дублировать на других пользователей. Размер блока по-умочанию, 1 kб. Время действия можно установить с помощью edquota -t
1 2 3 4 |
# edquota -u colin Disk quotas for user colin (uid 1007): Filesystemblocks soft hard inodes soft hard /dev/sda8 108 1000 2000 1 0 |
Команда edquota -p используется для дублирования квот на других пользователей.
1 2 3 4 5 |
# edquota -p refuser `awk -F: '$3 > 499 {print $1}' /etc/passwd` # edquota -p refuser user1 user2 # Дублируем на 2 пользователей # quota -u colin # Проверить квоты пользователя # repquota /home # Полный отчет по разделу для всех пользователей |
15 Поиск неисправностей
15.1 Поиск неисправностей
1 |
info |
16 SSL сертификаты
SSL — Secure Socket Layer, криптографический протокол, использующий шифрование открытым ключем, для защиты передаваемых по сети данных. Протокол SSL, является важным элементом политики безопасности системы. SSL сертификат — электронный документ, используемый для подтверждения принадлежности транзакции тому или иному серверу и установления защищенного соединения между клиентом и сервером с шифрованием трафика. Часто используется на защищенных Веб серверах (https) или Mail серверах (imaps)
— Клиент должен создать сертификат, со всеми необходимыми данными
— Отправить запрос на сертификацию в один из «центров сертификации» (CA). Так-же на данном этапе, будет создан приватный ключ на локальной машине
— После обработки запроса, сертификат подписывается секретным ключем CA. Клиент имея публичный ключ CA, проверяет подлинность сертификата и далее может использовать его
— Если необходимо, можно объединить сертификат и ключ в один файл
Конфигурация OpenSSL
В данном примере мы будем использовать директорию /usr/local/certs. Проверьте и отредактируйте файл /etc/pki/tls/openssl.cnf, согласно вашей конфигурации.
1 2 3 4 5 6 7 |
#nano /etc/pki/tls/openssl.cnf [ CA_default ] dir = /etc/pki/CA # Храним все тут certs = $dir/certs # Где хранить сертификаты crl_dir= $dir/crl # Где хранить списки отзыва сертификатов (CRL) database = $dir/index.txt # Индексный файл базы данных |
Создать сертификат полномочий
Если у нас нет сертификата, подписанного CA, и вы не планируете отправлять запрос на сертификацию, можно создать свой сертификат
1 |
# openssl req -new -x509 -days 730 -config /etc/pki/tls/openssl.cnf -keyout CA/private/cakey.pem -out CA/cacert.pem |
Запрос сертификации (CSR)
1 2 3 4 |
# openssl req -new -keyout newkey.pem -out newreq.pem -config /etc/ssl/openssl.cnf # openssl req -nodes -new -keyout newkey.pem -out newreq.pem -config /etc/ssl/openssl.cnf # Без шифрования ключа |
Сохраним запрос (newreq.pem), он может быть отправлен снова, для следующего обновления, подпись ограничивает срок действия сертификата. Кроме того, в процессе, будет создан приватный ключ newkey.pem
Подпись сертификата
Подписанный CA сертификат является действующим.
1 2 3 |
# cat newreq.pem newkey.pem > new.pem # Заменим "servername" на имя своего сервера # openssl ca -policy policy_anything -out servernamecert.pem -config /etc/ssl/openssl.cnf -infiles new.pem # mv newkey.pem servernamekey.pem |
Теперь servernamekey.pem — содержит приватный ключ а servernamecert.pem — сертификат сервера.
Создание объединенного сертификата
IMAP серверу нужно иметь все приватные ключи и серверные сертификаты в одном файле, файл должен храниться в безопасном месте.
Создадим файл servername.pem содержащий и сертификаты и ключи:
1.Открыть файл servernamekey.pem в текстовом редакторе и скопировать приватный ключ в файл servername.pem
2.Открыть файл servernamecert.pem в текстовом редакторе и скопировать сертификат в файл servername.pem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# nano /etc/pki/CA/certs/servername.pem -----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDutWy+o/XZ/[...]qK5LqQgT3c9dU6fcR+WuSs6aejdEDDqBRQ -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIERzCCA7CgAwIBAgIBBDANB[...]iG9w0BAQQFADCBxTELMAkGA1UEBhMCREUx -----END CERTIFICATE----- # Итог /etc/pki/ CA/private/cakey.pem (CA server private key) CA/cacert.pem (CA server public key) certs/servernamekey.pem (server private key) certs/servernamecert.pem (server signed certificate) certs/servername.pem (server certificate with private key) |
Информация о сертификате
1 2 3 |
# openssl x509 -text -in servernamecert.pem # Посмотр информации о сертификате # openssl req -noout -text -in server.csr # Информация запроса # openssl s_client -connect zabrosov.ru:443 # Проверить сертификат Веб-сервера |
17 Шифрование файлов
17.1 OpenSSL
Зашифровать и расшифровывать:
1 2 3 4 5 6 7 8 |
# openssl aes-128-cbc -salt -in file -out file.aes # Шифровать файл # openssl aes-128-cbc -d -salt -in file.aes -out file # Расшифровать файл # tar -cf - directory | openssl aes-256-cbc -salt -out directory.tar.aes # Архивировать и зашифровать директории # openssl aes-256-cbc -d -salt -in directory.tar.aes | tar -x -f - # Расшифровать директории и распаковать архив # tar -zcf - directory | openssl aes-128-cbc -salt -out directory.tar.gz.aes # Архивировать и зашифровать директории # openssl aes-128-cbc -d -salt -in directory.tar.gz.aes | tar -xz -f - # Расшифровать директории и распаковать архив |
17.2 GPG
GnuPG известный способ шифрования и подписи электронных писем или других данных, кроме того gpg предоставляет расширенную систему управления ключами. В данных примерах рассматривается только шифрование файлов. Самым простым является симметричный шифр. В этом случае файл шифруется с помощью пароля, соответственно расшифровать его может тот, кто знает этот пароль, никаких ключей не требуется. GPG добавляет расширение «*.gpg» к имени зашифрованного файла
1 2 |
# gpg -c file # Зашифровать файл по паролю # gpg file.gpg # Расшифровать файл ( -o другой файл) |
Шифрование с использованием ключей
Приватный ключ и публичный ключ, основа ассиметричной криптографии. О чем нужно помнить:
1.Ваш публичный ключ используется другими для шифрования файлов, которые, как получатель, можете расшифровать только вы (даже не тот, кто его шифровал).
2.Ваш приватный ключ зашифрован по паролю и используется для расшифровки файлов, зашифрованных Вашим публичным ключем. Приваиный ключ должен храниться в безопасном месте. Помните, если приватный ключ или пароль от него будут потеряны, вместе с ними пропадут и зашифрованные файлы.
3.Ключевой файл, может содержать несколько ключей.
Вначале нужно сгенерировать пару ключей. Значения по-умолчанию вполне подойдут, однако вам нужно будет ввести имя, адрес электронной почты и комментарий (не обязательно). Комментарий полезен при создании более одного ключа для данного имени/e-mail. Так-же вам нужно будет задать ключевую фразу (именно фразу а не слово).
1 2 3 4 5 6 7 8 9 10 11 |
# gpg --gen-key # Это может занять некоторое время ~/.gnupg/pubring.gpg # Содержит ваш публичный ключ а так-же импортируемые ключи ~/.gnupg/secring.gpg # Может содержать больше одного ключа # Опции -e Зашифровать данные -d Расшифровать данные -r ИМЯ зашифровать для получателя ИМЯ (или 'полное имя' или 'email@domain') -a Создать "ascii armored" вывод ключа -o Вывести в файл |
Шифрование только для персонального использования
Не требует экспорта/импорта какого либо ключа, они у вас уже есть.
1 2 |
# gpg -e -r 'Your Name' file# Зашифровать с помощью публичного ключа # gpg -o file -d file.gpg # Расшифровать. Используется опция -o, иначе пойдкт в stdout |
Шифрование и расшифровка с использованием ключей
Нам нужно экспортировать ваш публичный ключ, что-бы им могли пользоваться для расшифровки данных. Мы должны импортировать публичный ключ от Alice, что-бы шифровать файлы для нее. Ключи можно передать в обычном ascii файле. Например Alice экспортирует ключ, вы его импортируете себе, теперь вы можете шифровать для нее файлы и расшифровать их сможет только она.
1 2 3 4 5 6 7 |
# gpg -a -o alicekey.asc --export 'Alice' # Alice экспортирует ключ в ascii файл # gpg --send-keys --keyserver subkeys.pgp.net KEYID # Alice кладет ключ на сервер # gpg --import alicekey.asc # Вы импортируете ключ себе # gpg --search-keys --keyserver subkeys.pgp.net 'Alice' # Или забираете его на сервере # gpg -e -r 'Alice' file # Зашифровать файл для Alice # gpg -d file.gpg -o file # Расшифровать файл, зашифрованный Alice для вас |