Сайт справочник - неверное определение для www.zabrosov.ru, скорее всего - это, сайт подсказка, заметка и шпаргалка.
Трудно удержать в памяти большой объем информации, если каждый день её (информацию) не используешь.
Приходится вести заметки и писать напоминалки.
Тут можно найти информацию о основных командах Linux с примерами и комментариями для повседневной жизни в консоли (у некоторых эта жизнь очень насыщена ;)).
Заметки ориентированы на дистрибутивы: Centos (RedHat), Fedora, Debian, Ubuntu (именно в таком порядке).
Но будет актуален практически во всех UNIX системах.
Текущая версия: 1-4-15
С удовольствием приму от вас уточнения, исправления, tools & hacks на: zabrosov[at]gmail.com
# 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 файла
# 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 < menu.txt # < - использование содержимого файла в качестве входных данных # find / -name .profile 2>&1 |less # 2>&1 - поток ошибок туда, куда направлен вывод stdin | 0 | поток ввода | клавиатура stdout | 1 | поток вывода | терминал stdin | 2 | поток ошибок | терминал
# 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} # {} - определить множество
В именах файлов нельзя использовать:
/ - использовать запрещено
- - нельзя ипользовать в начале имени файла или каталога
{}, *, ?, ', ", [ , ], \, >, <, |, &, пробел - каждый из этих символовдолжен быть предварен \. Применять не рекомендуется.
# rm -Rf Рабочий\ стол # удаляем папку - Рабочий стол # rm "Рабочий стол"; rm \[13\]foto.jpg # удаляем [13]foto.jpg
В конфигурационных файлах:
# - комментарий
// - комментарий
# 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 # просмотр и релактирование файла
nano - редактор файлов, более дружелюбный чем vim ;)
# nano /etc/hosts # просмотр и релактирование файла # export EDITOR=nano # делаем nano редактором файлов по умолчанию
vim - редактор файлов, более дружелюбный чем nano ;)
tmux - аналог screen с одновременным вводом команд в несколько окон
Инициализация 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
Версия системы, дистрибутив
# 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 # История перезагрузок системы
Оборудование определенное ядром
# 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)-для полной виртуализации
Ресурсы RAM и HDD
# free -m # Используемая и свободная оперативная память (-m for MB) # grep MemTotal /proc/meminfo # Информация о RAM # df # Показать свободное пространство на дисках и смонтированные устройства # du -sh * # Размер каталога (листинг файлов и подкаталогов) # du -csh # Размер текущей директории # du -ks * | sort -n -r # Сортировать по размеру (kbytes) # ls -lSr # Показать файлы с сортировкой по размеру
Статистика
# 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
Ограничения shell/script
# ulimit -a # Смотрим ограничения # ulimit -n 10240 # Меняем ограничение на количество открытых файлов, только shell
Ограничения user/process
# cat /etc/security/limits.conf * hard nproc 250 # Ограничения пользовательских процессов asterisk hard nofile 409600 # Ограничения на открытые файлы приложения
Ограничения на всю систему
# 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
# 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 и сохраняем
Ядро стартует init, init читает /etc/inittab и запускает rc, который в свою очередь стартует скрипты определенного уровня (runlevel).
Скрипты находятся в /etc/init.d и ссылаются (линкуются) с /etc/rc.d/rcN.d где N номер runlevel
Уровень запуска по умолчанию указывается в /etc/inittab, обычно это 3 или 5.
# grep default: /etc/inittab id:3:initdefault:
Уровень запуска можно быстро поменять с init
# init 5 # переход с runlevel 3 на 5 # init 6 # reboot
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
# 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.
# 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 # Выключаем систему
Вариант 1
Когда стартует grub, появляется возможность выбора режима загрузки в grub_boot_screen (иногда при загрузке нужно нажать F4)
kernel /vmlinuz-2.6.35.11-83.fc14.i686 ro root=/dev/vg00/logvol00 rhgb quiet S
3.Нажимаем <b> для загрузки с установленным параметром.#passwd Смена пароля для пользователя root. Новый пароль :
Вариант 2
В момент загрузки grub, задаем:init=/bin/shЯдро примонтирует корневой раздел, init запустит shell. Выполняем:
# mount -o remount,rw / # passwd # или удаляем пароль root в (/etc/shadow) # sync; mount -o remount,ro / # sync до перемонтирования в read only # reboot
Вариант 3
1.Загружаемся с внешнего носителя в rescue mode (liveCD или installation CD).# mount -o rw /dev/ad4s3a /mnt # монтируем корневой раздел в /mnt системы с LiveCD # chroot /mnt # chroot в /mnt # passwd # reboot
# /proc/<PID> # информация о процессах (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)Некоторые устройства:
# 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 # генератор случайных чисел
# /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
# id # Показывает активного пользователя с логином и группой uid и gid # last # Выводит список последних логинов (подключений) в стистему # who # Список подключенных пользователей к системе # groupadd admin # Добовляет группу "admin" и пользователя myname # useradd -c "Имя Фамилия" -g admin -m myname # usermod -a -G <group> <user> # Добовляет существующего пользователя в группу (Debian) # groupmod -A <user> <group> # Добовляет существующего пользователя в группу (SuSE) # userdel myname # Удаляет пользователя myname (Linux/Solaris)В /etc/shadow хранится пара: hash пароля и логин.
# 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
Резидентная память - память в оперативке
Анонимная память (anon) - память без привязки к файлу
Page fault - обращение к памяти, trap
# 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 - с чтением диска
# echo "-17" > /proc/PID/oom_adj; # oomkiller, принудительное освобождение памяти (убиваем процесс),
# -17 отключить oomkiller (-16..15) веса, можно посмотреть в oom_score текущий
# ps -auxefw # Расширенный список всех запущенных процессов
# 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 -5 586 # Приоритетный
586: old priority 0, new priority -5
Приоритет запускаемых процессов устанавливаем с nice.
# nice -n -5 top # Высокий приоритет (/bin/nice) # nice -n 5 top # Низкий приоритет (/bin/nice) # nice +5 top # Низкий приоритетnice меняет планировщик CPU, ionice меняет планировщик I/O дисков.
# ionice c3 -p123 # Устанавливает класс idle для pid 123 # ionice -c2 -n0 firefox # Запускает firefox с best effort и высоким приоритетом # ionice -c3 -p$$ # Устанавливает актуальный shell idle приоритетПоследняя команда удобна для отладки и компиляции больших проектов. Кождая команда запущенная из этого shell будет иметь подобный приоритет (приоритет $$, если $$ PID shell).
# ping ya.ru > ping_ya.ru.log <Ctrl>+<Z> # ping приостановлен, <Ctrl>+<Z> # 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 &
# 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 HUP # Дать отбой, перегрузка конфигурационных файлов и перезапуск программы # -2 INT # Прервать # -3 QUIT # Выйти # -9 KILL # Прекратить все выполняющиеся действия и завершить работу # -15 TERM # Мягкое завершение с удаление порожденных процессов и закрытием файлов
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
# hdparm -I /dev/sda # Информация о IDE/ATA (Linux) # fdisk /dev/ad2 # Работа с таблицей разделов # smartctl -a /dev/ad2 # Отобразить информацию SMART
# mount | column -t # Смонтированные файловые системы # df # Свободное пространство на дисках # cat /proc/partitions # Все зарегетсрированные разделы (Linux) # du -sh * # Список с размерами папок # du -csh # Размер текущей папки (сумма поддиректорий) # du -ks * | sort -n -r # Размер в kilobytes с сортировкой # ls -lSr # Показать файлы, большие в конце
# umount /home/
umount: unmount of /home # Выполнить umount не возможно, файлы в home заблокированы
failed: Device busy
Найти открытые файлы, для Xorg:
# ps ax | grep Xorg | awk '{print $1}' 1252 # fstat -p 1252 USER CMD PID FD MOUNT INUM MODE SZ|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:
# find -x /var -inum 212042 /var/log/Xorg.0.logПоиск открытых файлов в точках монтирования с fuser или lsof
# 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)
Приложение:
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Файл:
# 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
# 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 / # перемонтировать в режиме чтения|записи
# dd if=/dev/zero of=/swap2gb bs=1024k count=2000 # mkswap /swap2gb # создаем место для swap # swapon /swap2gb # запускаем swap. сейчас используется swap # swapoff /swap2gb # отключаем swap # rm /swap2gb
# 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:
username=winuser password=winpwdМонтируем:
# mount -t cifs -o credentials=/home/user/.smb //192.168.1.2/myshare /mnt/smbshare
# mount -t iso9660 -o loop file.iso /mnt # Монтируем CD-image # mount -t ext3 -o loop file.img /mnt # Монтируем образ с ext3 fs
# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notruncИспользуем mkisofs для создания CD/DVD образа из файлов в папке. Для переодоления ограничений на имена файлов: -r разрешает Rock Ridge расширения для UNIX истем, -J разрешает Joliet расширения используемые Microsoft ОС. -L разрешает имена согласно ISO9660.
# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dirЗапись:
# cdrecord -scanbus # Находим устройство для записи (1,0,0) # cdrecord dev=1,0,0 imagefile.iso # cdrecord dev=ATAPI -scanbus # Можно использовать native ATAPIКонвертируем Nero .nrg файл в .iso
# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300 # Nero просто добавляет 300Kb заголовок к нормальному iso
# 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, но менее безопасный.
# 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
# mount -t tmpfs -osize=64m tmpfs /memdisk
# 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
# 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
# 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 # Работа с arpeth0 из shell
# Вывод списка 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
# route -n # netstat -rn # ip routeДобавить/удалить маршрут
# 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
# 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
# ifconfig eth0 down # ifconfig eth0 hw ether 00:01:02:03:04:05Wireless:
# netstat -an | grep LISTEN # lsof -i # Просмотр всех соединений # socklist # Список открытых сокетов # netstat -anp --udp --tcp | grep LISTEN # netstat -tup # Активные соединения # netstat -tupl # Список открытых портов системы
# 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 # Удалить все цепочки
# 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 = 1
# 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.
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
# dig zabrosov.ru ;; ANSWER SECTION: zabrosov.ru. 600 IN A 77.221.130.2 ;; SERVER: 8.8.8.8#53(8.8.8.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:
# dig -x 77.221.130.2 # host 77.221.130.2 # nslookup 77.221.130.2Для локального преобразовния имен (в рамках системы) можно использовть файл /etc/hosts:
# cat /etc/hosts 127.0.0.1 myibm localhost.localdomain localhost 192.168.1.2 myibm.zabrosov.local myibm
# dhcpcd -n eth0 # Обновить (не всегда работает) # dhcpcd -k eth0 # ОсвободитьПолная информация о аренде:
/var/lib/dhclient/dhclient-eth0.leases
# 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Важные опции:
# 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 # параллельная работа с несколькими машинами
# Для модема с 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 1540
# 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
# tc -s qdisc ls dev eth0 # Состояние очереди # tc qdisc del dev eth0 root # Удалить все QoSРасчет диапазона портов и маски: tc фильтр определяет диапазон портов с портом и маской, которые мы будемем использовать для расчета. Определим 2^N границы диапазона портов, расчитаем диапазон и переведем в HEX. Это и есть маска. Например для 10000 -> 11024, диапазон 1024.
# 2^13 (8192) < 10000 < 2^14 (16384) # граница 2^14 = 16384 # echo "obase=16;(2^14)-1024" | bc # маска 0x3C00
# 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
# Передача папки 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
# 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!
zabrosov# nc -lp 4444 boss # nc 192.168.1.11 4444
# 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 < zabrosov.html; done # Петля на 80 порту, отдаёт html страничку # Бэкап по шифрованному тунелю, с автозакрытием в конце операции server# cat backup.iso | nc -l 3333 client# ssh -f -L 23333:127.0.0.1:3333 zabrosov@192.168.1.1 sleep 10; nc 127.0.0.1 23333 | pv -b > backup.iso
# ssh-keygen -t dsa -N '' # cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"Соединяемся с хостом без пароля используя public key аутентификацию
# 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
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)?
# 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
# localhost:localport <- destport:gate # ssh -L localport:desthost:destport user@gate # Хост назначения будет представлять из себя локальный порт # localhost:localport -> destport:gate # ssh -R destport:desthost:localport user@gate # Локальный порт будет перенаправлен на указанный порт удаленного хоста # ssh -X user@gate # Форвардинг Х сеанса
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate
# 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.
# 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
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
cliwin# ssh -R 15900:localhost:5900 user@gate cliadmin# ssh -L 5900:localhost:15900 admin@gate cliadmin# vncconnect -display :0 localhost
Мы не можете получить прямой доступ к ssh сервера,а возможно это только через промежуточные хосты(например из-за проблем с маршрутизацией), но получить соединение клиент-сервер необходимо, к примеру что-бы скопировать файлы через SCP или пробросить порт для SMB. Сделать это можно, организовав туннель из цепочки хостов. Допустим нам нужно перебросить ssh порт клиента к серверу, в два скачка. Когда туннель будет создан, будет возможно прямое подключение клиент - сервер.
Создание туннеля: cli -> host_1 -> host_2 -> сервер and dig tunnel 5678cli# 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
# ssh -p 5678 localhost # Соединение напрямую cli -> server # scp -P 5678 myfile localhost:/tmp/ # Копируем файлы через туннель # rsync -e 'ssh -p 5678' myfile localhost:/tmp/ # или rsync
#!/bin/sh COMMAND="ssh -N -f -g -R 3022:localhost:22 admin@gate" pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND exit 0crontab -e
1 * * * * admin /home/admin/port_forward.sh # Поддерживаем соединение
# Другой вариант, не проверял
# 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
# 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 < servers.txt # запускаем команды из списка на сервереПостоянное соединение:
# ssh -MNf user@host # Создать постоянное соединение с машиной, удобно для rsync/sftp/cvs/svn, работает в bg # Редактируем ~/.ssh/config или /etc/sshd_config ControlPath ~/.ssh/master-%r@%h:%p ControlMaster noPort Knocking
# 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
OpenSSH поддерживает устройства tun/tap, позволяющие создавать шифрованный туннель. Плюс протокола SSH в том, что для реализации не нужно устанавливать и настраивать дополнительный софт, минус - низкая производительность на медленных линиях.
В /etc/ssh/sshd_config, должны стоять опции:
PermitRootLogin yes PermitTunnel yes
Соединим два хоста client и server. Соединение инициирует client к server, при этом он должен обладать правами root. Конечные адреса туннеля 10.0.0.1 (server) и 10.0.0.2 (client), кроме того мы создаем устройство tun1.
# 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 клиент
Есть две сети, их нужно соединить, сеть А с адресом 192.168.51.0/24 и сеть Б с адресом 192.168.16.0/24. 192.168.51.0/24 (сеть A)|шлюз A <-> шлюз Б|192.168.16.0/24 (сеть Б)
# сеть 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
# rsync -a /home/zabrosov/ /backup/zabrosov/ # "archive" mode # rsync -a /var/ /var_bak/ # rsync -aR --delete-during /home/user/ /backup/ # Используется относительный путьКопируем через сет с компрессией. По-умолчанию, Rsync использует для передачи протокол SSH в том числе и с ключами, если таковые имеются. Символ ":" используется как в SCP.
rsync -axSRzv /home/user/ user@server:/backup/user/Исключить из процесса удаленного копирования директорию tmp в /home/user/ и сохранить иерархию, удаленная директория будет иметь структуру /backup/home/user/:
# 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 служит для того, что-бы избежать необходимости ввода пароля вручную.
# 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 # удаление файлов после передачи
tar - архивирование файлов и директорий. Сам по себе tar, это не сжатый архив, сжатые архивы имеют расширения .tgz или .tar.gz (gzip) или .tbz (bzip2).
# 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 -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 # Распаковать один файл
Полезно:
# 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/
dd ( disk dump или destroy disk ) - используется для копирования (конвертирования) дисков, разделов, и прочих операций копирования.
Синтаксис:
# dd if=<source> of=<target> bs=<byte size> conv=<conversion> # Опции conv: notrunc # Не обрезать нули в файле на выходе, записывая их как нули noerror # Продолжать после ошибок чтения sync # Дополнять каждый входящий блок нулями до размера ibs-size
Размер входных данных по-умолчанию 512 байт (1 блок). Увеличение размера блока ускоряет процесс копирования, но требует больше памяти.
# 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) меньше
dd считывает раздел поблочно, если на диске предположительно есть проблемы, нужно использовать опцию conv=sync,noerror, при этом dd будет пропускать битые блоки и записывать нули на диск назначения. Поэтому важно, установить размер блока, равным, или меньшим, чем размер блока на диске. Вполне подходящим будет размер блока в 1 килобайт, установить размер на входе и выходе можно опцией bs=1k. Если на диске имеются сбойные сектора, но основные данные нужно сохранить с данного раздела, можно создать файл образа, смонтировать образ и копировать данные на новый диск. С установленной опцией noerror, dd пропустит поврежденные блоки, записав на их место нули, при этом, потеряны будут, только данные, содержавшиеся в сбойных секторах диска.
# 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 # Обновить # Обновление диска, безопасная операция, но диск при этом должен быть размонтирован
# dd if=/dev/zero of=/dev/hdc # Удалить все данные с диска (забивает диск нулями) # dd if=/dev/urandom of=/dev/hdc # Удалить все данные с диска (более предпочтительный вариант, но дольше) # kill -USR1 PID # Посмотреть текущее состояние dd
MBR содержит код загрузчика и таблицу разделов. Первый 466 байт отводятся под загрузчик, 466-512 байт под таблицу размещения разделов.
# 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 # Восстановить таблицу размещения разделов
# sudo /etc/init.d/dhcpd restart # Запустить стартовый скрипт от имени root # sudo -u sysadmin whoami # Запустить команду от имени другого пользователяsudo конфигурируется в файле /etc/sudoers или с помощью команды visudo
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:
# Псевдонимы хоста, подсети или имена хостов 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 %dba ALL = (DBA) ALL # Группа dba может работать от имени пользователя базы данных # Все могут монтировать/размонтировать CDROM на рабочих станциях ALL DESKTOP = NOPASSWD: /sbin/mount /cdrom,/sbin/umount /cdrom
# 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 # Информация кэшируется, очистить кэшРабота с пакетами, без разрешения зависимостей:
# 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 # Данная переменная устанавливает путь к библиотекам
# 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-запретить проверку подписи
# 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
# 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)Обновить ядро:
# yum update kernel-PAE # yum list installed kernel\*
# mail mail@zabrosov.ru Subject: Servers:We are working! "All servers is work, well." . EOT #Другой вариант:
# echo "This is the mail body" | mail mail@zabrosov.ru
screen - оконный менеджер виртуальных терминалов
screen имеет две основные функции:
- Запуск нескольких сессий терминала, в одном окне.
- Запуск программ отдельно от терминала в фоновом режиме. Терминал может быть отключен и переподключен позже.
# screen # Запустили менеджер # tail -f /var/log/messages # Вывод логов для примера листинга # Отсоединим screen от физического терминала нажав: <Ctrl>+<a> <Ctrl>+<d> # screen -rd # Переподключиться # screen -x # Подключиться в многоэкранном режиме (полезно для совместной работы) # echo "defscrollback 5000" > ~/.screenrc # Увеличить буфер до 5000 (по умолчанию 100) # Все команды screen начинаются с <Ctrl>+<a> <Ctrl>+<a> <?> # Справка и список доступных функций <Ctrl>+<a> <c> # Создать новое окно (терминал) <Ctrl>+<a> <Ctrl>+<n> и <Ctrl>+<a> <Ctrl>+<p> # Переключиться на предыдущий или следующий экран <Ctrl>+<a> <Ctrl+<N> # Где N, число от 0 до 9, что-бы переключится на окно с соответствующим номером <Ctrl>+<a> <"> # Получить список запущенных окон <Ctrl>+<a> <a> # Очистить пропущенный <Ctrl>+<a> <Ctrl>+<a> <Ctrl>+<d> # Отключиться, оставив сессию запущенной в фоновом режиме <Ctrl>+<a> <x> # Заблокировать терминал паролем <Ctrl>+<a> <[> # запуск режима scrollback mode, для выхода <esc> <C>+<u> # Прокрутка на полстраницы вверх <C>+<b> # Прокрутка на страницу вверх <C>+<d> # Прокрутка на полстраницы вниз <C>+<f> # Прокрутка на страницу вниз </> # Поиск вперед <?> # Поиск назадСессия терминала прерывается, когда будет закрыта работающая программа и сделан выход с терминала.
Некоторые опции: -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 должна быть последней.
# find . -type f | xargs ls -l # Не будет работать при наличии пробелов в именах # find . -type f -print0 | xargs -0 ls -l # Будет работать нормально с пробелами # find . -type f -exec ls -l '{}' \; # Или используйте с -exec, ковычки '{}'
# 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 '//,/<\/p>/d' t.xhtml # Удалить строки, начинающиеся с p> # И заканчивающиеся </p> # sed '/ *#/d; /^ *$/d' # Удалить комментарии и пустые строки # sed 's/[ \t]*$//' # Удалить символы табуляции # sed 's/^[ \t]*//;s/[ \t]*$//' # Удалить пробелы в начале и конце # sed 's/[^*]/[&]/' # Заключить первый символ в квадратные скобки # sed = file | sed 'N;s/\n/\t/' # Порядковый номер в каждой строке
# awk '{ print $2, $1 }' file # Вывести из файла 2 колонки, поменя из местами # awk '{printf("%5d : %s\n", NR,$0)}' file # Форматирование вывода с номерами строк # awk '{print FNR "\t" $0}' files # Несколько измененный вариант # awk NF test.txt # Удалить из вывода пустые строки (аналогично grep '.') # awk 'length > 80' # Напечатать строки, длинной более 80 символов
[\^$.|?*+() # Специальные символы, остальные символы означают самих себя \ # Экранирует специальные символы * # Повтор 0 или 1 раз . # Любой символ, за исключением символа новой строки .* # Совпадает 0 или более символов ^ # Начало строки $ # Конец строки .$ # Совпадает с одним любым символ в конце строки ^ $ # Совпадает со строкой, состоящей из одного пробела [^A-Z] # Любые символы, не входящие в диапазон от А до Z
# 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:%s\n", $1, $2) }' > /usr/local/etc/apache2/passwd # testuser=$(cat /usr/local/etc/apache2/passwd | grep -v \ # Проверить пользователя в passwd # root | grep -v \*: | awk -F":" '{ printf("%s\n", $1) }' | grep ^user$) # :(){ :|:& };: # bash fork bomb :). Машина зависнет! # tail +2 file > file2 # Удалить первую строку из файла
Изменить расширение для кучи файлов
# 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 # Встроенными средствами
# 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 )
# ~/.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="\[\033[1;30m\][\[\033[1;34m\]\u\[\033[1;30m\]" PS1="$PS1@\[\033[0;33m\]\h\[\033[1;30m\]]\[\033[0;37m\]" PS1="$PS1\w\[\033[1;30m\]>\[\033[0m\]" export PS1='\033[00;32m\][`date +%d" "%h" "%Y" "%T`] \u@\h \w\n \$\[\033[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' # Используем сокращения для популярных комманд
<Ctrl>+<R> — вводишь слово, с которым надо найти команду в истории. Повторные <Ctrl>+<R> перебирают все команды в истории с этим словом.
<Ctrl>+<L> — очистка экрана.
<Ctrl>+<A> — замена <Home>, <Ctrl>+<E> — <End>
<Ctrl>+<U> — удаление текста от курсора до начала строки, <Ctrl>+<K> — удаление от курсора до конца строки, <Ctrl>+<Y> — вставить удаленный предыдущими примерами кусок текста, <Ctrl>+<C> — удаление всей строки (обычно работает как отмена команды).
<Ctrl>+<T> — меняет местами символ под курсором и предыдущий набранный (при опечатке вида /dev/dsa вместо /dev/sda)
^^ — После попытки выполнить команду, набранную с ошибкой, строка вида ^ошибка^правильно запустит на выполнение исправленную команду.
# — если вместо набранной команды надо сначала выполнить другую, можно закомментировать строку и нажать <enter>, впоследствии вернуться к команде в истории, раскомментировать и выполнить.
<Alt>+<.> — подставляет к текущей команде аргумент предыдущей.
# 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 # Проверка доступности принтера и длины очереди печати
Квоты распределяются на уровне файловой системы и поддерживаются ядром.
Пакет quota, нужно установит дополнительно, затем активировать дисковые квоты в файле fstab и перемонтировать раздел
/dev/sda2 /home ext3 rw,acl,user_xattr,usrquota 1 1 # mount -o remount /home # mount # Проверьте, активна-ли usrquota, иначе перезагрузитесь
Инициализация файла quota.user с помощью quotacheck.
# quotacheck -vum /home
# chmod 644 /home/aquota.user # Позволить пользователю просматривать свои квоты
# quota -v
По-умолчанию, дисковые квоты не накладывают никаких ограничений (установлены в 0). Установить необходимые лимиты для пользовательских квот можно с помощью программы edquota. Так-же лимиты можно дублировать на других пользователей. Размер блока по-умочанию, 1 kб. Время действия можно установить с помощью edquota -t
# edquota -u colin Disk quotas for user colin (uid 1007): Filesystem blocks soft hard inodes soft hard /dev/sda8 108 1000 2000 1 0 0
Команда edquota -p используется для дублирования квот на других пользователей.
# edquota -p refuser `awk -F: '$3 > 499 {print $1}' /etc/passwd` # edquota -p refuser user1 user2 # Дублируем на 2 пользователей # quota -u colin # Проверить квоты пользователя # repquota /home # Полный отчет по разделу для всех пользователей
info info
SSL - Secure Socket Layer, криптографический протокол, использующий шифрование открытым ключем, для защиты передаваемых по сети данных. Протокол SSL, является важным элементом политики безопасности системы. SSL сертификат - электронный документ, используемый для подтверждения принадлежности транзакции тому или иному серверу и установления защищенного соединения между клиентом и сервером с шифрованием трафика. Часто используется на защищенных Веб серверах (https) или Mail серверах (imaps)
- Клиент должен создать сертификат, со всеми необходимыми данными
- Отправить запрос на сертификацию в один из "центров сертификации" (CA). Так-же на данном этапе, будет создан приватный ключ на локальной машине
- После обработки запроса, сертификат подписывается секретным ключем CA. Клиент имея публичный ключ CA, проверяет подлинность сертификата и далее может использовать его
- Если необходимо, можно объединить сертификат и ключ в один файл
#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, и вы не планируете отправлять запрос на сертификацию, можно создать свой сертификат
# openssl req -new -x509 -days 730 -config /etc/pki/tls/openssl.cnf -keyout CA/private/cakey.pem -out CA/cacert.pem
# 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 сертификат является действующим.
# 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
# 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)
# openssl x509 -text -in servernamecert.pem # Посмотр информации о сертификате # openssl req -noout -text -in server.csr # Информация запроса # openssl s_client -connect zabrosov.ru:443 # Проверить сертификат Веб-сервера
Зашифровать и расшифровывать:
# 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 - # Расшифровать директории и распаковать архив
GnuPG известный способ шифрования и подписи электронных писем или других данных, кроме того gpg предоставляет расширенную систему управления ключами. В данных примерах рассматривается только шифрование файлов. Самым простым является симметричный шифр. В этом случае файл шифруется с помощью пароля, соответственно расшифровать его может тот, кто знает этот пароль, никаких ключей не требуется. GPG добавляет расширение "*.gpg" к имени зашифрованного файла
# gpg -c file # Зашифровать файл по паролю
# gpg file.gpg # Расшифровать файл ( -o другой файл)
Приватный ключ и публичный ключ, основа ассиметричной криптографии. О чем нужно помнить:
1.Ваш публичный ключ используется другими для шифрования файлов, которые, как получатель, можете расшифровать только вы (даже не тот, кто его шифровал).
2.Ваш приватный ключ зашифрован по паролю и используется для расшифровки файлов, зашифрованных Вашим публичным ключем. Приваиный ключ должен храниться в безопасном месте. Помните, если приватный ключ или пароль от него будут потеряны, вместе с ними пропадут и зашифрованные файлы.
3.Ключевой файл, может содержать несколько ключей.
Вначале нужно сгенерировать пару ключей. Значения по-умолчанию вполне подойдут, однако вам нужно будет ввести имя, адрес электронной почты и комментарий (не обязательно). Комментарий полезен при создании более одного ключа для данного имени/e-mail. Так-же вам нужно будет задать ключевую фразу (именно фразу а не слово).
# gpg --gen-key # Это может занять некоторое время ~/.gnupg/pubring.gpg # Содержит ваш публичный ключ а так-же импортируемые ключи ~/.gnupg/secring.gpg # Может содержать больше одного ключа # Опции -e Зашифровать данные -d Расшифровать данные -r ИМЯ зашифровать для получателя ИМЯ (или 'полное имя' или 'email@domain') -a Создать "ascii armored" вывод ключа -o Вывести в файл
Не требует экспорта/импорта какого либо ключа, они у вас уже есть.
# gpg -e -r 'Your Name' file # Зашифровать с помощью публичного ключа # gpg -o file -d file.gpg # Расшифровать. Используется опция -o, иначе пойдкт в stdout
Нам нужно экспортировать ваш публичный ключ, что-бы им могли пользоваться для расшифровки данных. Мы должны импортировать публичный ключ от Alice, что-бы шифровать файлы для нее. Ключи можно передать в обычном ascii файле. Например Alice экспортирует ключ, вы его импортируете себе, теперь вы можете шифровать для нее файлы и расшифровать их сможет только она.
# 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 для вас
# gpg --list-keys # Список публичных ключей с KEYIDS # KEYID следует за '/' например для: pub 1024D/D12B77CE - KEYID это D12B77CE # gpg --gen-revoke 'Your Name' # Сгенерировать CRL (certificate revocation list) # gpg --list-secret-keys # Список приватных ключей # gpg --delete-keys NAME # Удалмть публичный ключ с локальной "связки ключей" # gpg --delete-secret-key NAME # Удалить приватный ключ с локальной "связки ключей" # gpg --fingerprint KEYID # Показать отпечаток ключа # gpg --edit-key KEYID # Редактировать ключ (например подпись или добавить/удалить email)
Используем Linux dm-crypt ( device-mapper ) на ядре 2.6. Шифровать будем раздел /dev/sdc1, это может быть любой раздел, диск, USB или файл, созданный losetup. Здесь мы будем использовать /dev/loop0, смотрите Файловая система. Device mapper использует метку для идентификации раздела, в данном примере sdc1, но это может быть любая другая строка.
LUKS с dm-crypt очень удобен для шифрования разделов диска, он позволяет иметь несколько паролей для одного раздела а так-же с легкостью менять их. Что-бы проверить доступно-ли у вас использование LUKS, наберите: cryptsetup --help.
# Создать раздел
# dd if=/dev/urandom of=/dev/sdc1 # Опционально. Только для параноиков
# cryptsetup -y luksFormat /dev/sdc1 # Это уничтожит все данные на sdc1
# cryptsetup luksOpen /dev/sdc1 sdc1
# mkfs.ext3 /dev/mapper/sdc1 # Будет создана файловая система ext3
# mount -t ext3 /dev/mapper/sdc1 /mnt
# umount /mnt
# cryptsetup luksClose sdc1 # Отсоединить зашифрованный раздел
# Монировать
# cryptsetup luksOpen /dev/sdc1 sdc1
# mount -t ext3 /dev/mapper/sdc1 /mnt
# Размонтировать
# umount /mnt
# cryptsetup luksClose sdc1
# cryptsetup -y create sdc1 /dev/sdc1 # Или любой другой раздел, типа /dev/loop0 # dmsetup ls # Проверить, покажет: sdc1 (254, 0) # mkfs.ext3 /dev/mapper/sdc1 # Только если делается впервые! # mount -t ext3 /dev/mapper/sdc1 /mnt # umount /mnt/ # cryptsetup remove sdc1 # Отсоединить зашифрованный раздел
Делаем тоже самое, ( без создания fs ), что-бы переподключить раздел. При вводе некорректного пароля команда mount не будет выполнена. В таком случае просто удалите отображение sdc1 (cryptsetup remove sdc1) и создайте поновой.