Настольная книга по Linux

(перенаправлено с «Linux-hand-book»)


Все системные администраторы рано или поздно начинают записывать команды в текстовый файлик сразу с нужными параметрами и опциями, чтобы заново не перечитывать man’ы. Было принято решение его структурировать, и лучше wiki инструмента не нашлось. Информация собрана здесь коллективным разумом, накоплена с опытом, подсмотрена на различных сайтах и в книгах. Убедительная просьба к системным администраторам — давайте синхронизировать наши знания!

Работа в командной строке Bash

править

Конфигурационные файлы

править
  • ~/.bashrc — исполняется в начале каждой новой сессии Bash.
  • ~/.bash_profile — исполняется один раз в начале входа в систему.
  • ~/.bash_logout — исполняется один раз после выхода из системы.
  • ~/.inputrc — настройка горячих клавиш для пользователя.

Обычно в ~/.bashrc добавляются псевдонимы для некоторых команд с целью сократить время на ввод. Обычно они добавляются так:

  • echo "alias iconv='iconv -f cp1251 -t utf8'" >> .bashrc — добавление псевдонима для команды iconv.

Если для некоторой команды есть псевдоним и требуется пресечь вызов по псевдониму (например в сценариях), следует добавлять обратный слеш в начало команды. Например, для псевдонима, который мы ввели выше, запись в сценарии должна быть такой \iconv.

Горячие клавиши

править

Ниже приведены некоторые ходовые горячие клавиши для командной оболочки.

  • Esc+. или Alt+. — ввести последний аргумент предыдущей команды.
  • ⇧ Shift+PageUp — пролистать экран консоли на одну страницу наверх.
  • Ctrl+a или Home — переместить каретку в начало командной строки.
  • Ctrl+e или End — переместить каретку в конец командной строки.
  • Ctrl+r и Ctrl+s — поиск по истории команд соответственно вперед и назад.
  • Ctrl+n или стрелка вниз — пролистать историю в командной строке вперед.
  • Ctrl+u — вырезать впередистоящий от каретки фрагмент.
  • Ctrl+w или Alt+← Backspace — вырезать впередистоящее от курсора слово.
  • Ctrl+k — вырезать фрагмент от каретки и до конца командной строки.
  • Alt+b — переместить каретку на одно слово назад.
  • Alt+f — переместить каретку на одно слово вперед.
  • Alt+d — вырезать следующее слово от каретки.
  • Ctrl+y — вставить вырезанный фрагмент.
  • Ctrl+l — очистить экран (вызов команды clear).
  • Ctrl+d — ввести в командную строку символ EOF. Для командной оболочки это означает завершить сеанс.
  • Ctrl+z — ставит на паузу исполняемую на переднем плане команду и возвращает управление оболочке. Командой fg <идентификатор> перевести задачу с указанным идентификатором на передний план. Командой bg <идентификатор> перевести задачу на задний план.
  • Ctrl+s — остановить прием символов терминальным устройством.
  • Ctrl+q — возобновить прием символов терминальным устройством.

Некоторые ходовые псевдонимы и функции .*shrc

править
# Поиск запущеных приложений по имени
alias psgrep='ps aux | grep --color $(echo "$1" | sed "s/^\(.\)/[\1]/g")'
# или
alias psgrep='ps aux | egrep -i'

# Список отсортированных по размеру директорий в текущей рабочей директории
alias dirsz='du -s `pwd`/* | sort -nr | cut -f 2- | while read a; do du -sh "$a"; done'

# Открыть доступ к директории через HTTP-сервер в библиотеке Python.
# Сервер слушает порт 8000.
alias sharethis='python -m SimpleHTTPServer'

# Поиск в истории команд по ключевому слову без учета регистра
alias hh='history | egrep -i'

# Пинг публичного dns-сервера
alias p='ping 8.8.8.8 -A'

# Выводит внешний IP-адрес вашего интернет-шлюза
myip(){ lynx --dump 2ip.ru | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | uniq; }
# или
myip(){ curl -s checkip.dyndns.org | sed 's/[^0-9.]//g'; }
# или
myip(){ curl ifconfig.me; }

# Убить процессы по имени исполняемого файла
ki() {
   [[ $1 = '' ]] || [[ $1 = '-h' ]] || [[ $1 = '--help' ]] && echo "usage: $0 <program1..programN>" && return 1
   for process in $*; do 
	  { kill -9 `pidof $process` 2>/dev/null && echo "$process" killed; } ||
	  { echo $process not found: seems like nothing to kill; }
   done
}

# Вывести файл без комментариев и пустых строк
# Пример: gr /etc/fstab
gr(){ egrep -v '^#|^$' "$1"; }

# Генерирование 10-и запоминаемых восьмизначных паролей (pwgen -B 8 10), c цифрами (-n), с буквами из верхнего регистра (-с), и вычислить MD5-хеш к нему.
alias pwg='pwgen -cnB 8 10 | while read PASS; do echo -n -e "$PASS\t"; echo -n "$PASS" | md5sum | cut -f1 -d" "; done'

# Эмуляция утилиты service в Red Hat
service()
{
   init_path="/etc/rc.d"
   if [ -f ${init_path}/${1} ]; then service=${1}
	 if [ "$uid" != "0" ] && {command -v sudo 2>&1 >/dev/null;}; then
		  sudo_cmd="sudo"
     fi
   fi
   case "$2" in
	  force-restart)
                ${sudo_cmd} ${init_path}/${service} force-restart;;
	  force-reload)
                ${sudo_cmd} ${init_path}/${service} force-reload;; 
	  reload)
                ${sudo_cmd} ${init_path}/${service} reload;;
	  setup)
		        ${sudo_cmd} ${init_path}/${service} setup;;
	  start)
                ${sudo_cmd} ${init_path}/${service} start;;
      stop)
                ${sudo_cmd} ${init_path}/${service} stop;;
      restart)
                ${sudo_cmd} ${init_path}/${service} restart;;
	  setup)
                ${sudo_cmd} ${init_path}/${service} setup;;
	  *)
               echo "usage: $0 <service name> <action>" ;;
   esac
}

# Делает снимок участка экрана, выделенного мышью, и отправляет его на хостинг изображений
screenshot() {
	scrot -s "%Y-%m-%d_$wx$h.png" -e 'ompload  $f ; rm $f'
}

Скрипты

править

Калькуляторы

править
  • let "a = 2 + 2" — вычисления командой let.
  • bс -l — утилита bc позволяет производить вычисления в интерактивном режиме. Опция -l определяет стандартную библиотеку.
  • echo $((2+2)) — вычисления через подстановку.
  • awk 'BEGIN { print exp(1)+2^(1.0/3); }' — вычисления через команду awk.
  • perl -le "print 3*5" — вычисления через Perl.
  • python -c "print (9*5)" — вычисления через Python.
  • mysql -e "select 1+2*(1+2)"

Утилита screen

править
Пример работы screen. На один экран терминала выведено два экрана сессии screen

Screen — оконный менеджер, разделяющий один физический терминал между несколькими процессами. Обычно используется для создания нескольких экранов в рамках одной SSH-сессии во время удаленного администрирования.

Основы работы с утилитой

править

Простой ввод команды screen создаст новую сессию утилиты с одним экраном. Находясь на любом экране, вы можете использовать последовательности клавиш для быстрой работы с ними. Все комбинации начинает Ctrl+a и далее идет клавиша.

  • Ctrl+a, c — создать новый экран.
  • Ctrl+a, w — посмотреть список открытых экранов.
  • Ctrl+a, <цифра> — переключиться на указанный экран. Экраны отсчитываются с нуля.
  • Ctrl+a, " — переключиться на нужный экран из списка.

Если вы хотите видеть что происходит на каждом экране на одном мониторе, то экран терминала можно разделить на несколько подокон и в каждое из них поместить по открытому экрану утилиты.

  • Ctrl+a, S — разделить экран терминала по горизонтали на два. Обратите внимание, что S должна вводиться в верхнем регистре, т.е. нужно зажать ⇧ Shift перед вводом.
  • Ctrl+a, | — разделить экран терминала по вертикали.

По умолчанию в новых подокнах будет пусто. Чтобы там появился экран, нужно переключиться на внутреннее окошечко и через вышеописанные комбинации, либо переключиться на уже открытый экран, либо создать новый. Утилита не запрещает в разных внутренних окнах размещать один и тот же экран, но ввод команд происходит только в то окно, на которую нацелен фокус.

  • Ctrl+a, Tab ↹ — переключиться на внутреннее окно в прямую сторону, т.е. слева направо, сверху вниз.
  • Ctrl+a, X — закрыть подокно, которое сейчас в фокусе.
  • Ctrl+a, Q — закрыть все подокна, оставив только текущее.

У каждого внутреннего окна в нижней части можно увидеть ярлычок, например 0 john@server:~. При желании его можно изменить на более информативный для вас через комбинацию Ctrl+a, A, а затем дополнить или переписать содержимое.

  • Ctrl+a, \ — закрыть все активные экраны и завершить сессию screen.
  • Ctrl+a, d — отключиться от текущей сессии screen без закрытия, при этом вам будет сообщен ее идентификатор для повторного подключения. Чтобы подключиться к существующей сессии, утилита должна вызываться например с ключом -r.

Если вы забыли комбинацию, то вы можете вывести подсказку сочетанием Ctrl+a, ?.

Опции утилиты

править
  • screen -ls — вывести идентификаторы активных сессий screen списком.
  • screen -r 4541.pts-1.mail — восстановить сессию с идентификатором 4541.pts-1.mail.
  • screen -x 4541.pts-1.mail — параллельное подключение к сессии screen, для совместной работы в одном терминале нескольких пользователей. Для этого сначала нужно войти в систему под пользователем, создавшим сессию screen.

Утилита tmux

править

Более продвинутый аналог screen. К основным преимуществам tmux по сравнению со screen можно отнести:

  • наличие информативной псевдографики;
  • поддержка мыши, если псевдотерминал открыт в оконной среде;
  • поддержка собственной командной строки.

Основы работы с утилитой

править

Простой вызов tmux создаст сессию с одним экраном. Если вы привыкли к screen, то не все так плохо, так как разработчики оставили многие комбинации похожими, но теперь они начинаются на Ctrl+b.

  • Ctrl+b, c — создать еще один экран в текущей сессии.
  • Ctrl+b, w — выбрать один из открытых экранов из списка.
  • Ctrl+b, <число> — переключиться на открытый экран по его номеру. Экраны отсчитываются с нуля.
  • Ctrl+b, d — отсоединиться от текущей сессии tmux.
  • Ctrl+b, , — переименовать ярлычок активного экрана.
  • Ctrl+b, " — разделить экран терминала на две части по горизонтали.
  • Ctrl+b, % — разделить экран терминала на две части по вертикали.

Теперь между внутренними окошками можно перемещаться по стрелкам в любом направлении, т.е. Ctrl+b, <стрелка>. Размеры внутренних окошек можно менять по размеру, для чего нужно использовать серию Ctrl+b, Ctrl+<стрелка>, причем стрелку нужно зажимать в этом случае.

  • Ctrl+b, o — переместить фокус на следующее внутреннее окно.
  • Ctrl+b, ; — переместить фокус на предыдущее внутреннее окно.
  • Ctrl+b, x — закрыть текущее внутреннее окно.
  • Ctrl+b, : — перейти к командной строке tmux.

Если вы работаете без мыши, то копировать содержимое нужно следующим образом:

  1. Перейдите в режим копирования нажав серию Ctrl+b, [.
  2. Чтобы выделить некоторую часть, стрелками переместите каретку на первый копируемый символ, а затем нажмите Ctrl+Space, после чего перемещение каретки будет приводить к выделению последующих символов. Стрелками выделите копируемый фрагмент.
  3. Для копирования нажмите Ctrl+w, после чего вы перейдете в нормальный режим.
  4. Для вставки скопированного фрагмента нажмите серию Ctrl+b, ].
  5. Чтобы выйти из режима копирования без копирования, нажмите q или Esc.

При копировании с помощью мыши, нужно выделять фрагмент через зажатую левую кнопку мыши, при этом зажимая клавишу ⇧ Shift. Все что будет выделено при зажатой клавише, будет скопировано в буфер.

Чтобы отключиться от сессии, нужно нажать Ctrl+b, d. Сессия будет активна пока активен сервер tmux.

Командная строка tmux

править

В отличие от Screen, Tmux имеет свою командную строку, которая вызывается Ctrl+b, :. Обычно все команды, которые туда вводятся, имеют аналог в форме горячих клавиш, поэтому вы не часто будете пользоваться этой возможностью.

Опции команды

править
  • tmux new-session -s <имя> — создать сессию с указанным именем.
  • tmux attach -t <имя> — подключиться к сессии с указанным именем.
  • tmux list-clients — посмотреть список всех открытых сессий на tmux-сервере.

Работа с файлами

править

Создание

править
  • fallocate -l 10m filename — резервирование диска под файл размером 10 мегабайт
  • chmod -R 741 /var/www/files — Сменить права рекурсивно (-R) во всей папке files на rwx r-- --x, где: 4 — чтение (r), 2 — запись (w), 1 — выполнение (x)
  • chmod -R u+rwx, g+r-xw, a-rw+x /var/www/files — Смена прав рекурсивно (-R) во всей папке files на rwx r-- --x, где u+rwx — u (user — владелец файла) добавить rwx, g+r-xw (group — пользователи группы владельца) добавить r убрать xw, a-rw+x (all — для всех пользователей, эквивалентно ugo) убрать rw добавить x, где r — чтение, w — запись, x — выполнение
  • chattr +Sai — Добавление атрибутов к файлу, синхронное изменение всех данных на диск, без кэширования (S); только добавление данных, удаление и переименование запрещено (a); запрещено удаление, изменение или переименование (i) (immutable)
  • chmod g+ws, o= /tmp/test/ — Включить наследование группы к которой принадлежит /tmp/test/ для всех вновь создаваемых объектов
  • cd <dir> && chown user.user -R . — Рекурсивное изменение группы и пользователя всех объектов в <dir>
  • locate foo — Быстрый поиск по файлам, заранее проиндексированным посредством updatedb
  • mlocate foo — То же самое, но updatedb.mlocate не индексирует заново не изменявшиеся файлы
  • pinfo bash — Удобная замена info
  • find /usr/bin -type f -mtime −10 -iname '*.log' — Найти все файлы в '/usr/bin', созданные или изменённые в течение последних 10 дней, с именем заканчивающимся на «.log» без учета регистра
  • find /usr/project \(-name *.htm -o -name '*.html' \) -exec enconv -V --convert-to=UTF-8 {} \; — Конвертировать найденные файлы в правильную кодировку
  • find -iname '*.mp3' -print0 | xargs −0 mid3iconv -eCP1251 --remove-v1 — Конвертация тегов в UTF-8 (должен быть установлен python-mutagen)
  • find /bakdir -name bak-20??-??-??.tar.gz | sort | head -n −7 | egrep -v 20[01][0-9]-[01][0-9]-01 | while read I ; do rm -v «$I»; done — Вымученная изящная конструкция, по очистке бэкап архивов, которая оставляет файлы за последнюю неделю и каждое первое число. find выводит список наших бэкап файлов, формат которых bak-год-месяц-число.tar.gz, sort правильно сортирует, head передает все файлы, кроме последних 7-ми, egrep исключает файлы за первое число, конструкция while удаляет остальное
  • ls /bakdir/bak-20??-??-??.tar.gz | head -n −7 | egrep -v '20[01][0-9]-[01][0-9]-01' | while read I ; do rm -v «$I»; done — Еще более изящная и ресурсоемкая конструкция
  • rm -rf `find ./ -iname '*.svn'` — удаляет все служебные папки SVN
  • find . -name «*.*»| while read i;do cat «$i» | grep -H --label="$i" -n «что нужно найти»;done — поиск по содержимому файлов в папке
  • grep -r «что нужно найти» /путь/до/папки — поиск по содержимому файлов в папке
  • shopt -s globstar; builtin echo **/*.txt — рекурсивный поиск по шаблону в директории (используется только /bin/bash)
  • tar -cjvf /home/user/etc_`date '+%Y-%m-%d' -d yesterday`.tar.bz2 /etc — (с)Запаковать в (f)tar-архив и (j)сжать bzip2 папку /etc c текущей датой в имени файла, с (v)подробным выводом
  • tar -C каталог_источника --exclude={«/home*»,"/etc/passwd*"/,"/etc/shadow*"}-czpvf — . | ssh user@REMOTE_IP «cat > каталог_назначения/backup.tgz» — Запаковать с соответствующими исключениями и передать посредством ssh на удаленный сервер
  • tar -xzvf /home/user/Downloads/centerim-4.22.6.tar.gz -С /opt/ — (x)Распаковать (z)gzip-архив в /opt
  • tar --use-compress-program=xz -xvf kernel.txz — Распаковать xz-архив
  • grep -v ^# /etc/mail.conf | grep -v ^$  — Показать файл без комментариев и пустых строк (неоптимально)
  • egrep -v '^\s*(#|$)' /etc/mail.conf — Показать файл без комментариев и пустых строк (оптимально)
  • ls -f1 /var/log/packages/ | wc -l — Вывести количество строк (wc -c — байт)
  • diff -y httpd.conf httpd.con.new — Сравнение в две колонки
  • diff -u httpd.conf httpd.con.new — Унифицированное cравнение (в один столбец, но читаемо). (рек. colordiff)
  • tail -n +5 /file — Вывести строки, начиная с 5-ой
  • egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' — Вывести только IP
  • … | awk '{print($1"STRING")}' — Вывести то что в пайпе, добавив STRING
  • awk '$1=="string" {print $2}' file1 >> file2 — Считать файл file1 , если данные в первом столбце равны 'string' добавить в файл file2 данные из второго столбца этой строки
  • … | tr '\n' ' ' — Заменить все переносы строки на пробелы
  • … | awk '{s += $2} END {print s*9}' — Сложить второй столбец и вывести результат умноженный на 9
  • TIME=$(LANG=en_US.UTF-8 date -d '2 min ago' '+\[%d\/%b\/%Y:%H:%M:');awk «/$TIME/,/END/» /var/log/nginx/access.log | awk '$0~"GET / HTTP" {print $1}' | sort -rg | uniq -c | awk '$1>5 {print $2}' >> black.list — Еще один вымученный скрипт против DDOS, если host попросил больше 5 раз за 2 минуты главную страницу вашего сайта, то он добавляется в black.list, дальше можно и в ipset
  • cat /tmp/text | /usr/local/bin/topnwords.pl | head -n 5 — показать TOP5 слов в файле text
#! /usr/bin/env perl

#file /usr/local/bin/topnwords.pl

my %x;
while(<>) {
    ($x{$_} ||= 0)++ foreach split;
}
print "$x{$_}  $_\n" foreach sort { $x{$b} <=> $x{$a} } keys %x;

Модификация

править
  • sed -i 's/foo/too/' — Заменить foo на too*
  • sed -i 's/[^[:digit:]]//g' — Убрать все символы, кроме цифр ([:digit:])
  • sed -i '14d' /file — Удалить 14ю строку
  • sed -i '/[Nn]etwork/d' /file — Удалить строку содержащую Network или network
  • sed -i '$ a \\n[mounts]\nuser root' /etc/munin/config — Добавить в конец файла «[mounts]» затем перенос на новую строка и «user root»
  • sed '14a\ echo \"graph_category logger\"' /etc/munin/plugins/command — После 14ой строки добавить «echo „graph_category logger“»
  • sed '1i \# vim: ft=ruby\n' — Вставить в начало файла '# vim: ft=ruby' и перенос строки
  • sed -i '/LOGREJECT/d' /var/log/messages — Удалить строки содержащие 'LOGREJECT'
  • tr -d '<символ>' — Удалить символ. Можно использовать классы символов POSIX (вроде '[:space:]')
  • tr -s '<X>' '<Y>' — Заменить символ <Х> на <Y>. Можно использовать классы символов POSIX (например, cat /etc/fstab | tr -s «[:lower:]» «[:upper:]»)
  • cat /etc/fstab | tr -s 'a-z' 'A-Z' — Заменить все строчные буквы в соответствующем файле на прописные (подобным образом можно делать и транслитерацию)
  • cp /dev/null file.txt — Быстрая очистка содержимого файла file.txt
  • echo "« > file.txt — Быстрая очистка содержимого файла file.txt
  • > file.txt — самая быстрая очистка содержимого файла
  • cat /proc/PID/cmdline | tr '\000' ' '  — Cделать cmdline читаемым
  • cat /proc/PID/cmdline | xargs −0 echo — То же самое
  • Пример, заменяющий шаблон ip-адрес/маска на '*.*.*.*', '/префикс' на '/*' и поднимающими регистр букв:
ip ad | sed 's/\([[:digit:]]\{1,3\}\.\)\{3\}[[:digit:]]\{1,3\}/*.*.*.*/g;s/\/[[:digit:]]\{1,2\}/\/*/g;s/\(.*\)/\U\1/g'

  • Пример, поднимающий регистр букв в файле /etc/fstab в строках, содержащей 'sda' кроме самой подстроки 'sda':
cat /etc/fstab | sed 's/\(.*\)\(sda\)\(.*\)/\U\1\L\2\U\3/g'

  • Пример, заменяющий последний октет ip адреса на ноль:
echo 192.168.23.46 | sed 's/[[:digit:]]*/0/4'

Кодировки

править
  • iconv -f koi8-r -t utf-8 < file.php > file2.php — Конвертация KOI8-R в UTF8
  • recode KOI8-R..UTF-8 blah.php — Конвертация KOI8-R в UTF8

Работа с дисками

править

Состояние дисковой подсистемы

править
  • rescan-scsi-bus -l — После добавления sata-диска, чтобы он определился системой (полезно для горячей замены!)
  • partprobe — реинициализация дисков и разделов
  • cat /proc/scsi/scsi — Посмотреть подключенные диски
  • fsarchiver probe — Выводит список дисков и разделов
  • df -h — Показывает занятость подмонтированных дисков
  • dfc -h — Цветной df
  • pydf — Правильная замена df
  • du -smc --exclude={proc, sys, dev} /* | sort -gr — Получаем отсортированный список самых „тяжелых“ каталогов в мегабайтах
  • du -ha --max-depth=0 --threshold=500M ./* | sort -n — узнать размер файлов и каталогов свыше 500М в ГБ в текущей директории
  • du -Sha --threshold=500M ./* | sort -g - узнать размер файлов и каталог (без подкаталогов) и сортировать их в текущей директории
  • find . -size +<размер>k — Поиск файлов размер которых превышает указанный (или c — для байтов, M — мегабайт, G — гигабайт. В примере, соответственно, килобайты)
  • ls -lSrh — В конце вывода увидим самые большие файлы
  • vdir — расширенный вывод содержимого директории
  • hdparm -tT /dev/sda — Тестирование производительности диска, ей же можно тонко настроить производительность (обычно не нужно, так как современные системы корректно определяют параметры)
  • dd if=/dev/sdx of=/dev/null bs=1M — Вроде как выявление проблем с диском.[1]
  • smartctl -s on -S on -t long /dev/sda Запуск процесса диагностики диска
  • hddtemp /dev/sd[a-z] — Температура жестких дисков в системе (раб.<60 °C)
  • testdisk — Анализ и восстановление файловых систем
  • parted — Подходит для создания и восстановления разделов

Горячее подключение дисков SATA

править
  • echo „- — -“ > /sys/class/scsi_host/host1/scan — Сканирование и инициализация нового устройства на порту host1.
  • ls −1 /sys/class/scsi_host/ — Вывести список портов host используемых для подключения дисков.
  • ls /sys/class/scsi_host/host?/device/target?:?:?/?:?:?:?/block — Показать на каких портах hostX подключены диски /dev/sdX.
  • echo 1 > /sys/block/sdb/device/delete — Деактивировать и удалить из системы диск /dev/sdb.

Разметка диска

править

Разметка диска, по сути — запись (таблица разделов в самом начале диска начиная с 447 байта 64 байта) о том где и какие разделы расположены физически на диске. То есть редактируя таблицу разделов, данные (находящиеся на жестком диске) остаются нетронутыми.

  • sfdisk -luM /dev/sda — Информация о разделах на диске (-uM) в мегабайтах.
  • partprobe -s /dev/sda — Перечитывает таблицу разделов блочного устройства.
  • cat /proc/partitions — Tаблица разделов, с которыми работает ядро.
  • mkfs.ext3 -L fsroot /dev/sda6 — Создать файловую систему ext3 c меткой „fsroot“.
  • tune2fs -L fsroot /dev/sda6 — Присвоить метку „fsroot“ диску, для удобства монтирования (или e2label /dev/sda6 fsroot).
  • blkid — Отображает атрибуты: UUID, метку, тип ФС блочных устройств.
  • mount LABEL=fsroot /mnt/data — Монтрирование по метке раздела.
  • sfdisk -d /dev/sda | sfdisk /dev/sdb — Копирование таблицы разделов с sda на sdb.
  • sfdisk -d /dev/sda > sda.mbr.bak — Копирование MBR в файл (файл можно редактировать).
  • sfdisk /dev/sda < sda.mbr.bak — Восстановление MBR из файла.
  • fdisk -p ad2 > /tmp/slices — Скопировать таблицу слайсов в файл.
  • fdisk -f /tmp/slices ad0 — Применить таблицу слайсов из файла к ad0.
  • dd if=/dev/sda of=/root/sda.mbr.img bs=512 count=1 — Копирование MBR в файл, самый надежный способ.
  • dd if=/dev/zero of=/dev/hda bs=512 count=1 — Очищаем MBR (внимательно!). Если без таблицы разделов, то bs=446
  • dumpfs -m /dev/sda2
  • yum install cloud-utils-growpart.x86_64; growpart /dev/vdb 1; xfs_growfs /srv/vdb1/ — Расширение xfs раздела налету

Монтирование

править
  • cat /proc/mounts — подробная инфа о примонтированных устройствах. Можно заменить вызовом mount без аргументов. column -t /proc/mounts или mount | column -t то же, но отформатированное. Если нужно коротко, то df -h
  • mount -t cifs //192.168.0.122/data /mnt/amigoglobal/data -o user=USER,pass=PASSWORD,uid=1000 — Монтирование виндовых разделов
  • curlftpfs ftp://<ftp_user>:@<ftp_server_ip> /<local_directory> — Монтирование фтп-ресурса
  • mount -o loop /mnt/bak/disk/LiveCD/newcd/live.iso /mnt/cdrom/ — Монтирование образа диска
  • mount -a — Монтировать все из fstab (напр. при добавлении ресурсов)
  • mount -o remount /dev/sda1 / — Перемонтировать. Например, при изменении опций
  • mount --bind olddir newdir — Примонтировать одну директорию к другой
  • fuser -v /opt — Узнать, кто занимает ресурс. Например, если не дает размонтировать
  • fuser -km /opt — Принудительное размонтирование раздела
  • umount -l /dev/sdb1 — Размонтировать, когда ресурс освободится
  • archivemount archivemount /home/directory.zip /mnt — Примонтировать архив в директорию /mnt

Шифрование раздела

править

Осторожно! Использовать только после изучения манов и тренировки на тестовом разделе!

  • dd if=/dev/random of=<key.file> bs=1 count=256 — Создаём файл-ключ. Не теряйте его!
  • cryptsetup -h=sha256 -c=aes-cbc-essiv: sha256 -s=256 -d=<key.file> luksFormat /encrypted/part — Собственно, шифруем раздел
  • cryptsetup -d=<key.file> luksOpen /encrypted/part decrypted — Получаем новое блочное устройство decrypted, с которым можно работать, как с обычным разделом

Шифрование директории

править
  • mv /images /images_bak — Переименовываем директорию, которую хотим зашифровать, чтобы освободить имя директории
  • mkdir /images/ — Создаем директорию, которую будем шифровать
  • mount -t ecryptfs /images /images — Монтируем шифрованную директорию. Отвечаем на вопросы : 1, 1, n, n
  • cp -av /images_bak/* /images/ — Копируем файлы в зашифрованную директорию. Если директорию размонтировать теперь, файлы будут зашифрованы. Архив можно удалять (rm -fr /images_bak)
  • mkswap -L swap /dev/sda5 — создаём файловую систему для раздела подкачки, устанавливаем метку swap
  • swapon /dev/sda5 — подключаем раздел.
  • swapon -a — подключаем все разделы с подкачкой прописаные в /etc/fstab.

Создаем файл подкачки вместо раздела. Позволяет перераспределить дисковые ресурсы(при LVM, RAID, XEN), но слегка замедляет работу подкачки. Обычно размер файла подкачки предпочитают устанавливать равным объему оперативной памяти.

  • dd if=/dev/zero of=/file.swp bs=1M count=1024 — создаем файл необходимого размера (у нас 1Гб).
  • mkswap /file.swp — создаём файловую систему внутри файла.
  • swapon /file.swp — подключаем.
  • swapoff /dev/sda5 — отключаем подкачку.
  • swapoff -a — отключаем все использующиеся файлы и устройства подкачки.
  • /file.swp none swap sw 0 0 — запись в fstab
  • echo 0 > /proc/sys/vm/swappiness — использовать swap в крайнем случае

Образ диска

править
  • dd if=/dev/zero of=/null bs=1024 ; rm -f /null — Забиваем свободное место на диске нулями, чтобы dd мусор не сохранял, и сразу удаляем.
  • dd if=/dev/sda2 bs=16M | gzip -c > /mnt/bak/sda2.img.gz — где bs=16M — размер кэша на винчестере. Побитное копирование раздела с последующей упаковкой, я использую для бэкапа свеже настроенных систем (копирует вместе с файловым мусором, зато надежно).
  • gunzip -с /mnt/bak/sda2.img.gz | dd of=/dev/sda2 bs=16M — Восстановление из сжатого образа.
  • На оригинальной системе: dd if=/dev/sdX bs=16065b | netcat <REMOTE_IP> <REMOTE_PORT>. На целевой системе: netcat -l -p <PORT> | dd of=/dev/sdY bs=16065b — Копирование раздела по сети.
  • На оригинальной системе: cat /dev/sda | netcat <REMOTE_IP> <REMOTE_PORT>. На целевой системе: netcat -l -p <PORT> | > /dev/sda  — Копирование раздела по сети. Вариант без использования dd

Работа с CD/DVD

править
  • dd if=/dev/cdrom of=cd_image.iso bs=1M — Копирование образа (а так же: cp /dev/cdrom cd_image.iso или cat /dev/cdrom > cd_image.iso)
  • wodim dev=/dev/cdrom -eject -v mycd.iso — Запись диска
  • wodim -v blank=fast dev=/dev/cdrom — Стирание диска
  • genisoimage -f -v -J -o /home/${USERNAME}/ARCH/DIR.iso /home/${USERNAME}/DIR — Создать iso-образ директории

Наблюдаем за работой dd:

править
  • dd status=progress if=/dev/disk of=disk.iso (для coreutils>8.24)

Набираем из другой консоли:

   kill -s USR1 $(pidof dd)

dd нам вывалит что-то вроде:

   825599+0 записей считано
   825599+0 записей написано
   скопировано 422706688 байт (423 MB), 16,1309 c, 26,2 MB/c

и продолжит работу.

Наберите в соседней консоли:

   watch -n 10 'sudo kill -s USR1 $(pidof dd)'

и на консоли с dd увидите обновление статуса dd каждые десять секунд.

   2804193+0 записей получено
   2804193+0 записей отправлено
   1435746816 байт (1,4 GB, 1,3 GiB) скопирован, 214,006 s, 6,7 MB/s
   3778113+0 записей получено
   3778113+0 записей отправлено
   1934393856 байт (1,9 GB, 1,8 GiB) скопирован, 322,185 s, 6,0 MB/s
   3867969+0 записей получено
   3867969+0 записей отправлено
   1980400128 байт (2,0 GB, 1,8 GiB) скопирован, 332,218 s, 6,0 MB/s
   3958457+0 записей получено
   3958457+0 записей отправлено
   2026729984 байт (2,0 GB, 1,9 GiB) скопирован, 342,228 s, 5,9 MB/s
   4037161+0 записей получено
   4037161+0 записей отправлено
   2067026432 байт (2,1 GB, 1,9 GiB) скопирован, 352,277 s, 5,9 MB/s
   4125009+0 записей получено
   4125009+0 записей отправлено

Более изящный способ, с помощью pv:

   $ dd if=/dev/disk | pv >~/disk.iso
   278MB 0:00:05 [57,7MB/s] [      <=>                                             ]

А можно и так:

   $ dd if=/dev/disk | pv -s $(du -sb /dev/disk | cut -f 1) >~/disk.iso
   1,24GB 0:00:49 [26,6MB/s] [=============>                                       ] 28% ETA 0:02:03


Или даже так:

   $ watch -n 1 du -h ~/disk.iso
  • vgscan — Поиск по системе виртуальных групп VG
  • vgchange -ay — Активизировать виртуальную группу (-an — деактивизировать)
  • pvscan — Поиск доступных физических томов и отображение сравнительной информации о них
  • pvdisplay /dev/sda1 — Просмотр полной информации о физическом томе.
  • pvs /dev/sda1 — Просмотр краткой информации о физическом томе.
  • pvcreate /dev/sda1 — Подготовка физического тома PV (тип раздела 8Eh)
  • pvmove /dev/sda1 — Освобождение физического тома (перенос данных на другие физические тома)
  • pvresize /dev/sda2 — Расширить физический том
  • vgdisplay VG — Просмотреть полную информацию о виртуальной группе
  • vgs VG — Просмотреть краткую информацию о виртуальной группе
  • vgcreate VG /dev/sda1 /dev/sdb1 — Создание виртуальной группы на основе двух физических томов
  • vgremove VG — Удаление виртуальной группы
  • vgextend VG /dev/sdc1 — Добавление физического тома к виртуальной группе
  • vgreduce VG /dev/sda1 — Удаление физического тома из виртуальной группы
  • vgexport VG — Подготовка виртуальной группы для переноса на иную машину
  • vgimport VG /dev/sda1 /dev/sda2 — Импорт виртуальной группы (с другой машины)
  • lvcreate -L1500 -nlv00 VG — Создание логического тома (LV) с именем nlv00 и размером 1500 Мб
  • lvcreate -l 100 %FREE -n nlv00 VG — Создаем „логический том“ на все доступное пространство
  • lvremove /dev/VG/home — Удаление логического тома
  • lvextend -L120M /dev/VG/home — Увеличение размера логического тома до указаной величины
  • lvextend -L+100M /dev/VG/home — Увеличение размера логического тома на указанную величину
  • lvextend -l +100 %FREE /dev/mapper/scientific-root — Расширить размер логического тома на максимально возможную величину
  • lvresize -L +10G /dev/VG/home — Добавляет в логический том 10Гб, при их наличии в физическом томе.
  • lvreduce -L120M /dev/VG/home — Уменьшение размера логического тома до указаной величины
  • lvreduce -L-100M /dev/VG/home — Уменьшение размера логического тома на указанную величину
  • resize2fs /dev/VG/home — Расширяем раздел находу на все доступное пространство (для ext3)
  • mkfs.ext3 /dev/VG/home — Создаем файловую систему

Работа с программами

править
  • echo '0-5 20,22 * * 1-5 root bak.sh' >> /etc/crontab — Запись в означает, что bak.sh будет выполняться cron’ом с нулевой по пятую минуту в 20 и в 22 каждый день с понедельника по пятницу
  • echo '*/15 * 3 * root bak.sh' >> /etc/crontab — bak.sh будет выполняться каждые 15 минут, каждое третье число
  • ps aux | grep process — Вывод системной информации по конкретному процессу
  • kill -TERM `cat /usr/local/apache2/logs/httpd.pid` — Послать сигнал процессу
  • pgrep <PROGRAM_NAME> — Выводит PID’ы процессов
  • pidof <PROGRAM_NAME> — Выводит PID’ы процессов
  • pkill httpd — Послать сигнал найденным процессам
  • killall /usr/sbin/httpd — Послать сигнал процессу только по полному имени
  • nice -n −20 command — Запустить command с наивысшим приоритетом (-n 19 — наименьший)
  • ionice -c3 command — Запустить command с наименьшем приоритетом по системе ввода-вывода (-с1 — наивысший). (только для планировщика CFQ)
  • LANG=en_EN[.UTF-8] command — Запуск программы в другой локали [.кодировке]
  • gnome-screenshot --window --delay=5 — Сделать скриншот активного окна, с задержкой 5 секунд
  • espeak -v ru „таки да“ --stdout -s 60 | aplay — Сгенерировать и озвучить слова в кавычках с помощью синтезатора речи. Язык — русский, скорость 60 (слов в минуту)
  • CREATE ROLE test_user; GRANT ALL privileges ON DATABASE test_database TO test_user; ALTER ROLE test_user WITH LOGIN; ALTER USER staging_rb_user WITH PASSWORD 'testPassWord;' — Дать права пользователю на БД (postgres)

Управление пакетами

править

debian-разработчиками рекомендуется apt-get, так как aptitude устарел.

Действие\система apt (deb)

Debian, Ubuntu

yum (rpm)

Fedora, CentOS

zypper (rpm)

SuSe, OpenSuSe

pkgtools

Slackware

ports

FreeBSD

packages

FreeBSD

portage

Gentoo, Sabayon

pacman

ArchLinux

Установка пакета из репозитория apt[-get] install foo yum install foo -y zypper install foo cd /usr/ports/foo && make install pkg_add -r foo emerge foo pacman -S foo
Установка локального пакета dpkg -i foo.deb yum localinstall foo.rpm

rpm -ivh foo.rpm

zypper install foo.rpm

rpm -Uvh foo.rpm

installpkg foo.tgz pkg_add foo.tgz ebuild foo.ebuild setup pacman -U foo.pkg.tar.gz
Обновления списка пакетов из репозиториев. apt[-get] update yum check-update zypper list-updates - pkg_version emerge --sync pacman -Sy
Обновление существующих пакетов apt[-get] upgrade yum update foo zypper update upgradepkg foo.tgz emerge -uDN world pacman -Su
Удаление пакета apt[-get] remove foo yum erase foo zypper remove foo removepkg foo cd /usr/ports/foo && make deinstall pkg_delete foo emerge -C foo pacman -R foo
Поиск по имени пакета apt-cache search foo yum list foo zypper search foo - whereis fullnamefoo или make search key=foo emerge -s foo или eix foo pacman -Ss foo
Поиск по описанию и имени пакета aptitude search foo yum search foo zypper search foo - http://www.freebsd.org/ports/ - emerge -S foo или eix -S foo pacman -Ss foo
Показать информацию о пакете aptitude show foo yum info foo zypper info foo - pkg_info -L foo-1.0 | less emerge -s foo или eix foo pacman -Si foo
Список пакетов установленных в системе dpkg -l yum list installed

rpm -qa

rpm -qa ls /var/log/packages/ ls /var/db/pkg/ pkg_info eix -Ic pacman -Q
Поиск имени пакета по файлу apt-file search file или dpkg-query -S file yum provides file zypper what-provides file, cnf file grep -R file /var/log/packages/ equery b file pacman -Qo file
Файлы установленные пакетом dpkg-query -L foo rpm -ql foo rpm -ql foo equery f foo pacman -Ql foo
  • aptitude install debian-archive-keyring — Обновить ключи репозиториев

Сборка пакетов

править
  • rpm -i foo-1.2.src.rpm && cd /usr/src/redhat/SPECS && rpmbuild -bb foo-1.2.spec — Собрать foo.rpm
  • cd /usr/ports/foo && make package — Собрать package для FreeBSD
  • quickpkg foo — Собрать пакет для portage из уже установленного в системе
  • emerge -B foo — Собрать пакет для portage, не устанавливая его

Система

править
  • shutdown -P now — Выключить машину сейчас
  • shutdown -P +10 — Выключить машину через 10 минут
  • shutdown -r 05:00 — Запланировать перезагрузку на 05 часов 00 минут (время в 24-м формате, от 0 до 23)
  • shutdown -c — Отменить запланированную кем-нибудь перезагрузку
  • ls --time-style=long-iso -clt / | tail -n 1 | awk '{ print $7, $6}' - узнать дату установки ОС по самому старому файлу

Планировщик задач

править
  • cron — Для периодического выполнения заданий
    • crontab -e — править список заданий
    • crontab -l — вывести список заданий
  • at — Для разового выполнения заданий
# at 7:30
warning: commands will be executed using /bin/sh
at> /sbin/reboot
at> <EOT>
job 1 at Thu Feb 23 07:30:00 2012

Конфигурация

править
  • ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime — Установка часового пояса
  • ntpdate ntpserver — Жесткая синхронизация времени (быстрая смена времени может быть вредна некоторым сервисам, рек. ntpd)
  • sysctl -a — Вывести текущие настройки ядра
  • sysctl -p — Применить настройки ядра /etc/sysctl.conf (для слаки вероятно параметры задавать в rc.local)
  • hostname -F /etc/hostnamefile — Установить сетевое имя из файла (см. ниже)
  • sysctl hw.model hw.ncpu hw.physmem machdep.tsc_freq — Сведения о системе (FreeBSD)

Для Debian-like

править
  • /etc/hostname — Прописываем имя машины
  • dpkg-reconfigure locales — Установка системной локали

Для RHEL-like

править
  • /etc/sysconfig/network — Прописываем имя машины (напр. HOSTNAME=localhost.localdomain)
  • /etc/sysconfig/clock — Правка часового пояса

Для Slackware

править
  • /etc/HOSTNAME — Прописываем имя машины.

Пользователи и группы

править
  • chfn — изменение информации о пользователе
# chfn -o 'User for ftp' userftp
  • useradd -r -N -g <groupname> --uid 1000 <username> — Создать системного пользователя <username>. -N не даёт создавать одноимённую группу для пользователя, -g <groupname> — назначает основной для пользователя группу <groupname>
  • userdel -r <username> — Удалить пользователя <username> вместе с домашним каталогом
  • usermod -g <group_main> -G <Group1>, <Group2> <username> — Назначить пользователю <username> основной группу <group_main> и включить его в две дополнительные группы <Group1> и <Group2>
  • vipw — Редактор vi блокирует /etc/passwd, так, чтобы другие команды не могли модифицировать его в то же самое время
  • vigr — Редактор vi блокирует /etc/group, так, чтобы другие команды не могли модифицировать его в то же самое время
  • visudo — Спец редактор vi для правки /etc/sudoers. (visudo -c — проверка синтаксиса)
  • PASS=666; useradd testuser -m -p $(echo $PASS | mkpasswd -m sha-512 -s) — Создание пользователя в скрипте сразу с паролем
  • Использование утилиты newusers для массового создания системных пользователей по шаблону „user1 — userN“ со случайными паролями; список пользователей с настройками и паролями выводится в файл users.txt:
uid=`cat /etc/passwd | cut -d ":" -f 3 | sort -gr | head -1`
for user in {1..100}; do
        uid=$(( uid + 1  ))
        echo user${user}:$(pwgen -cnB 8 1):${uid}:1000:user${user}:/home/user${user}:/bin/zsh
done | tee users.txt | newusers
  • groupadd <group_name> — Создать группу <group_name>
  • groupdel <group_name> — Удалить группу <group_name>
  • groupmod -n <new_group_name> <old_group_name> — Переименовать группу <old_group_name> в <new_group_name>
  • ssh sudouser@servername '/usr/bin/sudo /usr/sbin/usermod --expiredate 1 username &&/usr/bin/sudo /usr/bin/pkill -u username' — запускается удаленно, под пользователем у которого есть sudo, лочит (lock) юзера в независимости от типа авторизации (пасс/key) в отличии от usermod -L и passwd -l, pkill выкидывает (kick) из сессии.
  • ssh sudouser@servername '/usr/bin/sudo /usr/sbin/usermod --expiredate 99999 username' — Разблокировать пользователя.

Авторизация по флешке

править
  • sudo pamusb-conf --add-device <flash> — Добавить устройство авторизации
  • sudo pamusb-conf --add-user <username> — Добавить пользователя, который будет авторизовываться по этому устройству
  • sudo pamusb-check username — Проверка настроек.

Автовход в систему

править
  • Для GNOME добавить в /etc/gdm/custom.conf (Для новых версий в /etc/gdm3/daemon.conf)
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=username
  • Для KDE добавить в /etc/kdm/kdmrc
[X-:0-Core]
AutoLoginEnable=true
AutoLoginUser=username
AutoLoginPass=userpassword
  • Для LXDE и всего остального сначала установить пакет autologin. Потом создать и отредактировать файл /etc/sysconfig/autologin:
AUTOLOGIN=yes
USER=username
EXEC=/usr/bin/startx
  • Автологин и запуск иксов без *DM(Display Manager):

Для LXDE добавить в /etc/rc.local

su - user -c startx

Изменить в /etc/X11/Xwrapper.config

allowed_users=anybody

Добавить в ~/.xinitrc

exec ck-launch-session dbus-launch startlxde

Железо (Модули)

править
  • lsmod — Показать загруженные модули ядра
  • modinfo foo — Показать информацию о модуле (зависимости и т. п.)
  • modprobe foo — Включить модуль
  • modprobe -vr foo — Удалить неиспользуемый модуль (почти тоже что и *rmmod foo*)
  • modprobe -vr pcspkr — Выключить динамик на материнской плате. А еще лучше echo 'blacklist pcspkr' >> /etc/modprobe.d/blacklist
  • cat /dev/dsp > wave-file.wav — Записываем несжатый аудио‐поток с микрофона компьютера через вход звуковой карты
  • cat wave-file.wav > /dev/dsp — Проиграть файл

Мониторинг

править
  • htop — Правильная замена top
  • vmstat 5 — Подробные сведения о системе виртуальной памяти
  • dstat — Удобный генератор статистики по ресурсам.
  • iostat 5 -m -x — Нагрузка на разделы дисков в мегабайтах, с усредненным значением за 5 секунд
  • iotop — Анализ нагрузки отдельными программами на дисковую подсистему (python)
  • atop — расширенный top (диски, память, сеть)
  • tailf или tail -f /путь/к/логу — Просмотр изменений лога
  • Нажатие Shift+f в less аналогично поведению tailf
  • iftop — Статистика по сетевому интерфейсу в реальном времени
  • vnstat — Простой, но весьма полезный учётчик трафика
  • ifstat -TtSnqA -i wimax0 — Статистика по конкретному сетевому интерфейсу и по общему трафику в реальном времени
  • apachetop и mytop — Статистика в реальном времени по запросам apache и mysql соответственно
  • iptraf — Грамотный сетевой монитор
  • watch -n 1 <program> — Запускать программу раз в 1 секунду. Удобно наблюдать за выводом программ
  • script -t 2> timingfile — Записать лог терминальной сессии с отметками времени
  • scriptreplay timingfile — Проиграть записанный лог
  • nethogs — Показывает сетевое потребление трафика процессом
  • tcpstat — Статистика сетевых интерфейсов
  • cat /proc/net/nf_conntrack — Посмотреть таблицу трансляции сетевых адресов (NAT)
  • Перенаправляем вывод какого-нибудь лога (скажем, syslog) на консоль (скажем, девятую) — заносим (или раскомментируем) в файле /etc/rsyslog.conf подобные строки:
   daemon,mail.*;\
          news.=crit;news.=err;news.=notice;\
          *.=debug;*.=info;\
          *.=notice;*.=warn       /dev/tty9
  • Монитор через некоторое время выключается. Как исправить?

Добавляем

   setterm -powersave off -powerdown 0 -blank 0

в файл /etc/rc.local и можно любоваться логами сквида (постфикса, дхцп etc) круглосуточно.

Журналирование

править
  • /home/adm/script.sh 2>&1 | /usr/bin/logger -t event_name — запись всех сообщение от script.sh в системный журнал
  • lsmod — Показать загруженные модули ядра
  • modprobe foo — Включить модуль
  • modprobe -vr foo — Удалить неиспльзуемый модуль (почти тоже что и *rmmod foo*)

Пересборка ядра

править
  1. Скачать архив с исходными файлами, распаковать и перейти в распакованный каталог:
    cd /usr/src/linux-2.6.30
    
  2. Генерация конфигурации .config (можно использовать также menuconfig или xconfig). Для надежности можно взять конфигурацию уже рабочей системы и править его (cp /boot/config-generic-2.6.29.4 /usr/src/linux-2.6.30/.config):
    make config
    
  3. Создание дерева зависимостей:
    make dep
    
  4. Удаление предыдущей сборки:
    make clean
    
  5. Компиляция ядра:
    make
    
  6. Посмотреть версию скомпилированного ядра:
    make kernelversion
    
  7. Установка собранного ядра:
    make install
    
    # или вручную
    cp arch/i386/boot/bzImage /boot/bzImage-2.6.23.1
    cp System.map /boot/System.map-2.6.23.1
    
  8. Компиляция модулей:
    make modules
    
  9. Установка модулей:
    make modules_install
    
  10. Пересборка образа initrd:
    cd /boot; mkinitrd -c -k 2.6.30 -m mbcache: jbd: ext3 -f ext3 -r /dev/sda2
    
  11. Добавить ядро в конфигурацию загрузчика.
Уровень стека протоколов Протоколы Описание
Прикладной (в стек не входит) DHCP, SSH, SMTP, HTTP, FTP, DNS На этом уровне работают пользовательские приложения. Передаваемые данные называются сообщениями.
Транспортный TCP (сегменты), UDP (дейтаграммы), RTP, SCTP, DCCP Этот уровень поддерживают все устройства, участвующие в сетевом обмене информацией (тонкие клиенты, рабочие станции, серверы, сетевые принтеры). В TCP соединение устанавливается прозрачно (между конечными сторонами).
Межсетевой (сетевой) Для TCP/IP это IP (пакет) (IPv6); вспомогательные протоколы, вроде ICMP (пинги, диагностика соединения) и IGMP работают поверх IP, но являются частью сетевого уровня; ARP не работает поверх IP. На этом уровне работают маршрутизаторы (router) и коммутаторы третьего уровня стека протоколов TCP/IP (L3 switch)
Канальный (уровень доступа) Ethernet (фреймы), Token ring, PPP, IEEE 802.11 Wi-Fi, ISDN На этом уровне работают коммутаторы (switch), хабы (hub) работают на физическом уровне.
Физический Определяет: тип среды передачи (медь, оптика, радиоэфир, окружающее пространство); метод передачи информации (широкополосный, узкополосный); тип синхронизации (синронный, асинхронный — в последовательных интерфейсах; в параллельных интерфейсах для передачи информации о синхронизации используется отдельный проводник); на этом уровне также осуществляется мультиплексирование сигналов.

Конфигурация

править
  • /etc/resolv.conf — DNS-сервера провайдера (для RHEL-like можно также указать в конфиге DNS{1,2}=80.80.111.254, он приоритетней)
  • /etc/sysctl.conf — Для маршрутизации пакетов в системе net.ipv4.ip_forward = 1 (или в rc.local добавить строку: echo 1 > /proc/sys/net/ipv4/ip_forward)
  • ip route add 192.168.124.0/24 via 192.168.0.220 — Добавить маршрут (временно, до первой перезагрузки)
  • ip r a 192.168.124.0/24 via 192.168.0.220 — Добавить маршрут (краткая запись предыдущей команды)
  • route add default gw 192.168.1.1 — Добавить маршрут по умолчанию через шлюз 192.168.1.1 (временно, до перезагрузки)
  • ip addr add 192.168.0.100/24 dev eth0 — Добавить IP-адрес интерфейсу (временно, до первой перезагрузки); для совместимости с ifconfig в конце добавить „label eth0:0“
  • vconfig <NET_DEV> <VLAN_ID> — Добавить тегированный интерфейс (предварительно убедиться, что подгружен модуль 802.1q); устаревший вариант
  • ip link add link wimax0 name mgmt type vlan id 123 — Добавить тегированный интерфейс с именем mgmt и vlan_id равным 123 на интерфейсе wimax0; современный вариант
  • ip -details link show dev mgmt — Посмотреть созданный интерфейс
  • ip -s link show up — Вывести статистику по поднятым интерфейсам
  • brctl addbr <BRIDGE_NAME> — Создать контейнер интерфейсов для коммутатора (нужен модуль ядра bridge)
  • brctl addif <BRIDGE_NAME> <IFACE> — Добавить интерфейс в созданный коммутатор

Для Debian-like

править
  • /etc/network/interfaces — Файл конфигурации интерфейсов

Для RHEL-like

править
  • /etc/sysconfig/networking/devices/ifcfg-eth0 — Файл конфигурации интерфейса (/etc/sysconfig/network-scripts/ifcfg-eth0 — жесткая ссылка на него же)
  • /etc/sysconfig/network-scripts/route-eth0 — Файл статической маршрутизации, с синтаксисом: 192.168.124.0/24 via 192.168.0.220 dev eth0 или ADDRESS0=192.168.124.0

Для Slackware

править
  • /etc/rc.d/rc.inet1.conf — Файл конфигурации интерфейсов.
  • /etc/udev/rules.d/70-persistent-net.rules — Переопределение имени инт. (напр. eth1 -> eth0)

Мониторинг

править
  • traceroute -i eth3 ya.ru — Трассировать через определенный интерфейс (для отладки маршрута)
  • ping -I eth1 -i4 -c3 host — Пропинговать хост через eth1 три раза с интрервалом в 4 секунды
  • mtr ya.ru — traceroute и ping в одном флаконе
  • ifconfig — Вывод конфигурации всех интерфейсов (рек. ip addr)
  • netstat -tunap — Список всех портов и соединений (lsof -i -n)
  • netstat -tnlpu — Список всех слушающих приложений и соответствующих tcp/udp портов. Чтобы видеть все приложения, запускать необходимо от рута
  • arp — Вывод arp-таблицы (нужно для выяснения физической доступности в сети, или выяснения МАС-адреса соседа). Правильнее ip neigh (или ip n)
  • tcpdump -vvvnnni eth0 not port ssh and not 3389 and not 80 and not 5191 and not 443 and not 53 and not 2222 and not 5223 and not udp port 5001 — Ищем незнакомый трафик в сети
  • tcpdump -c 100 -nni vlan100 dst megahost.ru and icmp — Отфильтровать 100 сообщений ICMP для megahost.ru
  • ip neigh (ip link, ip address, ip route, ip rule, ip tunnel и пр.) — Показать соседей канального уровня (линки, ip-адреса, маршруты, таблицы правил маршрутизации: утилиты из состава iproute2)
  • ethtool eth0 — Статистика интерфейса, режимы текущего соединения и поддерживаемых соединений и прочее
  • iptstate — Мониторинг contrack из iptables, показывает активные трансляции с возможностью их прибить

Сетевые сервисы и утилиты

править
  • rsync -avz -e „ssh -p 9876“ root@192.168.222.20:/home/$USRNAME/Desktop/ /home/$USERNAME/Desktop --del --exclude=»*.avi" --bwlimit=75 — Синхронизировать содержимое директории /home/Desktop на двух машинах посредством rsync через ssh (ssh-сервер на порту 9876, ограничение пропускной способности — 75 килобайт в секунду)
  • rdesktop 192.168.0.1 -u admin -p 'pass' -fzPa8 -k ru — Подключение к RDP серверу со сжатием, кэшированием, на полный экран, с русской раскладкой.
  • xfreerdp 192.168.0.1 -u admin -p 'pass' -k common -g 1280x1024 — Подключение к RDP серверу под соответствующим пользователем с соответствующим паролем, раскладкой, в окне соответствующего разрешения. Клиент — допиленный rdesktop
  • pdsh -w root@host-0[1-7,10] uptime — Выполнить команду uptime на хостах с 1 по 7 и на 10ом. Предварительно должен быть настроен вход ssh по ключам.
  • pdcp -w root@host-0[1-7,10], root@otherhost /home/user/.vimrc /root/ — Копировать локальный файл .vimrc в папку /root на удаленных хостах. pdsh должен быть установлен на всех хостах
  • trickle — Шейпер трафика (неудобный)
  • knockd — Забавный инструмент ограничения доступа к портам
  • ngrep — Простой и удобный сниффер
  • netsed — Модификация трафика на лету
  • autossh — Поддержания ssh соединения
  • iperf — Анализ пропускной способности канала (генератор TCP и UDP трафика). iperf -s — на сервере, iperf -c <server_ip> — на клиенте
  • #pptpsetup --create <CONNECTION_NAME> --server <PPTP_SERVER_IP> --username <USERNAME> --password <PASSWORD> --encrypt mschap --start — Создать и поднять pptp соединение
  • #pon <CONNECTION_NAME> — Поднять туннель
  • #poff <CONNECTION_NAME> — Отключить туннель
  • mausezahn — Грамотный конструктор сетевых пакетов-генератор трафика
  • nemesis — Также конструктор сетевых пакетов-генератор трафика
  • nmap — Сетевой сканер
  • zenmap — gui к нему
  • ipcalc — Калькулятор для расчёта сетей
  • clusterssh — Мультиплексор для ssh (и telnet) подключений
  • hping — сканер и конструктор сетевых пакетов
  • fping -sq 192.168.1.1 192.168.1.254 — Пропинговать диапазон адресов
  • redir --laddr=<IP 1> --lport=80 --caddr=<IP 2> --cport=80 — Простое перенаправление tcp сервиса на другой ip адрес и порт
  • siege mysite.ru -d1 -r10 -c250 — Нагрузочное тестирование сайта
  • ssh user@domen.ru -p 2233 — Подключится к серверу на нестандартный порт 2233 под пользователем user.
  • ssh 192.168.1.100 «uptime» — Выполнить команду на удаленном сервере.
  • ssh -X 192.168.1.200 «iceweasel &» & — Запустить графическое приложение, установленное на удаленном сервере.
  • ssh -L 5555:192.168.0.10:80 root@213.37.57.236 — После установки соединения твой локальный порт 5555 будет проброшен на 192.168.0.10:80
  • ssh -f -N -L 4080:internal_server:22 proxy_user@proxy_server — Пробросить 22 порт internal_server’а на свой локальный 4080 порт через внешний proxy_server
  • ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa — Создать пару ключей (секретный и публичный) длинной 2048 бит и положить их в ~/.ssh/id_rsa и ~/.ssh/id_rsa.pub соответственно
  • ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host_ip' — скопировать публичный ключ (id_rsa.pub) на удаленную машину user@machine. Это позволить заходить на machine по ssh без ввода пароля
  • scp remote_user@remote_host_ip:/etc/rc.d/autostart.sh /<local_dir> — Копирование файла /etc/rc.d/autostart.sh с удаленного хоста в локальную директорию <local_dir>
  • sftp -i ~/.ssh/id_rsa remote_host_ip — Подключиться к удаленному, встроенному в openssh, sftp-серверу с авторизацией по ключу
  • sshfs -o allow_other user@host:/home/user/ /mnt/host_user/ — монтирует /home/user/ удаленного хоста(host) в /mnt/host_user/. Опция allow_other позволяет другим пользователям обращаться к ресурсу
  • Просмотр статистики неудачного логина
sudo cat /var/log/auth.log* \
    | awk '/Failed password/ && /sshd/ {print $1,$2}' \
    | sort -k 1,1M -k 2n | uniq -c
  • Отметим, что если добавить выполняющего эту команду пользователя в имеющую доступ к файлам /var/log группу adm, использование sudo станет ненужным.
Проброс UDP трафика через SSH туннель
править
Проброс UDP трафика с узла A на узел C через промежуточный узел B, к которому есть доступ по ssh:

— на узле A — проброс 12345 порта с узла A на порт 6789 узла B

ssh -tNf -L12345:127.0.0.1:6789 "B" -l user

— на узле B — переводим содержимое TCP пакетов в FIFO и тут же забираем и упаковываем в UDP и отсылаем на узел C порт 2056:

mkfifo /tmp/fifo
nc -l -p 6789 < /tmp/fifo | nc -u "C" 2056 > /tmp/fifo

— на узле A — переводим содержимое UDP пакетов, отсылаемых локальным сервисом на localhost:2056 в FIFO и сразу забираем из FIFO и отправляем на localhost:12345:

mkfifo /tmp/fifo
nc -l -u -p 2056 < /tmp/fifo | nc 127.0.0.1 12345 > /tmp/fifo
  • corkscrew — Утилита для работы ssh через https прокси

Сеть PPPoE

править
  • pppoeconf — поиск и настройка концентратора pppoe в псевдографическом режиме.
  • pon dsl-provider — установить соединение.
  • poff — разорвать соединение.
  • rp-pppoe - настройка концентратора pppoe в терминале в ручном режиме.

Принтеры, сканеры

править
  • pdf2ps -dASCII85EncodePages=true -dLanguageLevel=1 input.pdf out.ps — кодирование PDF в PostScript версии 1
  • psnup -PA2 -pA3 −1 out.ps | lp -d Printer -t input.pdf -o media=A3 - — меняем формат с А2 на А3 и печатаем 1 копию на бумагу формата A3. Имя задания — input.pdf

Криптография

править
  • openssl req -x509 -nodes -days 730 -subj '/C=Russia/ST=Center/L=Moscow/CN=mysite.org' -newkey rsa:1024 -keyout my_cert.pem -out my_cert.pem  — Создать файл с сертификатом, действительным 2 года, закрытым ключом и соответствующими параметрами
  • openssl x509 -text -in my_cert.pem  — Просмотреть сертификат (если нужно вычленить ключ или сертификат, то cat my_cart.pem и вырезать соответствующую часть)
  • grub-crypt --md5 — Создать хеш пароля для /etc/shadow
  • openssl passwd −1 «PassWorD»  — Создать хеш пароля для /etc/shadow
  • openssl aes-128-cbc -d -salt -in pass.aes -out /tmp/pass.txt — Расшифровать файл
  • openssl aes-128-cbc -salt -in /tmp/pass.txt -out pass.aes; rm -f /tmp/pass.txt — Зашифровать файл
  • openssl s_client -host mail.ru -port 443 — Соединиться с хостом по шифрованному соединению
  • openssl s_client -starttls imap -connect mymail.ru:993 — Протестировать imap через старттлс

Кластеры

править
  • pcs resource create int_ip ocf: heartbeat:IPaddr2 ip=10.10.10.10 cidr_netmask=32 op monitor interval=30s — Создать ресурс

Мультимедиа

править
  • ffmpeg -i file.avi -vn output.mp3 — «Вырезать» звук из видеофайла и переконвертировать в mp3

mplayer, mencoder

править
  • shnsplit -f *.cue -o flac -t '%p-%a-%n-%t' -m \ _ *.ape- Разделить образ диска ape на отдельные композиции
  • cuetag sample.cue track*.flac- Прописать теги
  • mplayer dvd:// -dvd-device <dir> — воспроизведение контента DVD из каталога <dir>
  • mplayer -vf cropdetect — определение кропа
  • mplayer -vf crop=704:416:8:80 — воспроизведение с кропом
  • mplayer -af volume=20.1:0 — увеличение громкости
  • mplayer -idx file.avi — воспроизведение файла с «битым» индексом

:

mplayer file.avi -dumpaudio -dumpfile audio.ac3
mplayer file.avi -vo null -ao pcm: fast: file=filename.wav

Кодирование

править

Запись видео с вебкамеры:

$ mencoder tv:// -tv driver=v4l:device=/dev/video0:width=640:height=480:forceaudio -ovc \
lavc -oac lavc -lavcopts vcodec=mpeg4:acodec=mp3 -ffourcc divx -o test.avi

«Склеиваем» два видеофайла:

$ mencoder -oac copy -ovc copy out.avi file_1.avi file_2.avi

Вырезаем пятисекундный кусок из видеофайла:

$ mencoder -oac copy -ovc copy -ss 00:00 -endpos 0:05 file.avi -o out.avi

Кодируем видеофайл в 3gp:

$ ffmpeg -i file.avi -b 200Kb -r 12 -s qcif -ac 1 -ab 12.2k -ar 8000 out.3gp

Исправляем «битые» индексы:

$ mencoder input.avi -forceidx -oac copy -ovc copy -o output.avi

или же:

$ avifix -i input.avi

Скрипт для кодирования DVD:

#!/bin/bash

TITLE=
ABR=128
VOLUME=5
DVDDEV="./"
OUT=out
VBR=600000

while true ; do
        case "$1" in
        --vers | --versi | --versio | --version)
        echo $"`basename $0` 0.3"
        printf $"Copyright '(C)' %s Free Software Foundation, Inc.\nThis is free software; \
see the source for copying conditions.\nThere is NO warranty; not even for MERCHANTABILITY \
or FITNESS FOR A PARTICULAR PURPOSE.\n" "2009"

printf $"Written by %s aka %s.\n" "Zakhary Akulov" "hozzzar"
printf $"Feel free to email me about possible bug at %s.\n" "hozzzar@gmail.com"
        exit 0
        shift
;;
        -h | --h | -help | --help)
        echo $"Использование: `basename $0` [-t title] [-ab bitrate] [-vb bitrate] [-v volume] [-d dvd-device]
        -ab, --abitrate         требуемый аудиобитрейт, по умолчанию -- 128 kbps
        -vb, --vbitrate         требуемый видеобитрейт, по умолчанию -- для 700Mb диска
        -d, --dvd               путь к каталогу DVD
        -t, --title             номер тайтла
        -v, --volume            громкость, по умолчанию 5
        -s, --start             начало фрагмента, MM:SS
        -e, --end               продолжительность фрагмента, MM:SS
        --scale                 масштабирование в пикселах, ширина:высота
        -o, --output            файл вывода, без пробелов и расширения
        -h, --help              показать эту справку и выйти
        --version               показать версию и выйти"
        exit 0
        shift
;;
        -ab | --ab | -abitrate | --abitrate)
        ABR="$2"
        shift 2
;;
        -vb | --vb | -vbitrate | --vbitrate)
        VBR="$2"
        shift 2
;;
        -d | --d | -dvd | --dvd)
        DVDDEV="$2"
        shift 2
;;
        -t | --t | --title | -tile)
        TITLE="$2"
        shift 2
;;
        -v | --v | -volume | --volume)
        VOLUME="$2"
        shift 2
;;
        -s | --s | -start | --start)
        SPOS="-ss $2"
        shift 2
;;
        -e | --e | -end | --end)
        EPOS="-endpos $2"
        shift 2
;;
        --scale)
        SCALE=",scale=$2"
        shift 2
;;
        -o | --o | -output | --output)
        OUT="$2"
        shift 2
;;
        --)           # Останов.
        shift; break
;;
        -*)
        echo >&2 $"`basename $0`: не могу распознать опцию '$1'"
        echo >&2 $"Наберите '`basename $0` --help' для получения справки."
exit 1
;;
        *)
        break
;;

esac
done

mplayer dvd://${TITLE} -dvd-device ${DVDDEV} -vf cropdetect \
-ss 10:00 -endpos 00:05 > cropfile

CROP=`awk -F' ' '{print($24)}' cropfile |grep -m 1 crop | sed 's/..$//g'`

mencoder dvd://${TITLE} -dvd-device ${DVDDEV} ${SPOS} ${EPOS} -ovc frameno -oac mp3lame \
-lameopts abr:br=${ABR}:mode=1:vol=${VOLUME} -o frameno.avi

mencoder dvd://${TITLE} -dvd-device ${DVDDEV} ${SPOS} ${EPOS} -ovc xvid \
-xvidencopts pass=1:vhq=1:vhq=4:gmc \
-vf ${CROP}${SCALE},hqdn3d=2:1:2 -oac copy -o /dev/null

mencoder dvd://${TITLE} -dvd-device ${DVDDEV} ${SPOS} ${EPOS} -ovc xvid \
-xvidencopts pass=2:vhq=1:vhq=4:gmc:bitrate=-${VBR} \
-vf ${CROP}${SCALE},hqdn3d=2:1:2 -oac copy -o ${OUT}.avi

Обработка графики

править
  • convert input.tiff output.pdf — конвертация изображения tiff в pdf
  • convert -geometry 60x80 in.png out.png — привести изображение к указанному разрешению
  • gs -r384 -sDEVICE=jpeg -dNOPAUSE -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sOutputFile=passport.jpg — passport.pdf — конвертирование PDF в JPEG
  • pdftk 1.pdf 2.pdf cat output 1_plus_2.pdf — объединить файлы pdf в один
  • docker run -it -p 22:22 debian - скачивание образа и запуск контейнера debian, с последующим входом в терминал внутри контейнера debian (-it), а так же проброс портов 22 между контейнером и хостом (-p 22:22)
  • docker run -d --rm nginx - запуск контейнера nginx в фоновом режиме (-d), а после остановки контейнера автоматически удалить его из локального репозитория (--rm)
  • docker ps -as - показать все контейнеры, с занимаемым пространством
  • docker container prune - удалить все остановленные контейнеры
  • docker container inpect d3dbb46de006 - все детали контейнера с ID d3dbb46de006
  • docker exec -it d3dbb46de006 bash - подключить дополнительный процесс (Bash) к контейнеру
  • docker run -v local_dir:docker_dir nginx - Использование локальной директории внутри директории контейнера образа nginx

Примечания

править
  1. Если простое считывание окажется для него серьёзной нагрузкой. Лучше сделать дамп диска, а потом сравнить хэши.