gladilov.org.ru gladilov.org.ua

49 заметок с тегом

сисадминство

Всякие системные и просто нужные компьютерные фичи. Настройка софта, иногда восстановление железа, и прочее, что входит в сферы интересов от эникейшика до «full stack admin’а». В придачу — симулятор системного администратора.



Релиз эмулятора QEMU 3.0

Представлен релиз проекта QEMU 3.0.0. Значительное изменение номера версии связано с переходом проекта на новую схему нумерацию выпусков, в соответствии с которой первая цифра в номере версии будет увеличиваться раз в год. Никаких кардинальных изменений или нарушений совместимости изменение первой цифры не отражает.

В качестве эмулятора QEMU позволяет запустить программу, собранную для одной аппаратной платформы, на системе с совершенно иной архитектурой, например, выполнить приложение для ARM на x86-совместимом ПК. В режиме виртуализации в QEMU производительность выполнения кода в изолированном окружении близка к нативной системе за счёт прямого выполнения инструкций на CPU и задействования гипервизора Xen или модуля KVM.

Показать

Изначально проект был создан Фабрисом Белларом (Fabrice Bellard) с целью обеспечения возможности запуска собранных для платформы x86 исполняемых файлов Linux на архитектурах, отличных от x86. За годы разработки была добавлена поддержка полной эмуляции для 14 аппаратных архитектур, число эмулируемых аппаратных устройств превысило 400. При подготовке версии 2.12 внесено более 2300 изменений от 169 разработчиков.

Разработчики напоминают, что в будущем возможно будет прекращена поддержка платформ GNU/kFreeBSD, DragonFly BSD, Solaris и Haiku, из-за отсутствия сопровождающих или инфраструктуры для тестирования.

Источник

15 августа   в мире   интересное   сисадминство   софт

Напильник для Tiny Tiny RSS

 Как я недавно писал тут, после переезда на VDS’ку на сервере из-за недостатка памяти стала отваливаться сессия screen’а, в которой крутится демон опроса и наполнения БД новостей Tiny Tiny RSS. Для контроля того, что screen-сессия и процесс демона опроса и агрегирования новостей запущены, я написал скриптик на похапе, который опрашивает состояние этих процессов и отображает на WEB-странице. Показать

Возможны 22 вариантов:

  1. Скрин запущен, демон запущен: Показать
  1. Скрин запущен, демон выпал: Показать
  1. Скрин отвалился, демон вместе с ним: Показать
  1. Четвёртый вариант я не привожу, так как демона не в скрине я никогда не запускаю.

Однако мне достаточно быстро надоело открывать новую вкладку со страницей статистики каждый раз, когда у меня возникало подозрение о том, что скрин/демон отвалился. Поэтому я интегрировал индикаторы работы прямо на страницу Tiny Tiny RSS.

Ищу две картинки индикаторов  ON и  OFF, создаю файл скрипта опроса (допустим, readerstates.php) в том каталоге, где развёрнут TT RSS, с таким содержимым:

<?php $screen=exec("ps aux | grep -e 'SCREEN -dmS reade[r]'");
$daemon=exec("ps aux | grep -e 'php <путь к скрипту демона>/update_daemon2.ph[p]'");
$scrn_t=$dmn_t='не запущен';
$scrn=$dmn='off';if($screen){$scrn='on';$scrn_t='запущен';}
if($daemon){$dmn='on';$dmn_t='запущен';}?>
<img src='/... путь к картинке .../<?php echo$dmn;?>.png' title='Демон <?php echo$dmn_t;?>' />
<img src='/... путь к картинке .../<?php echo$scrn;?>.png' title='SCREEN <?php echo$scrn_t;?>' />

Затем прописываю require в файле index.php:

<?php
    foreach (PluginHost::getInstance()->get_hooks(PluginHost::HOOK_TOOLBAR_BUTTON) as $p) {
        echo $p->hook_toolbar_button();
    }
    require_once "readerstates.php";
?>

После этого все вышеописанные ситуации выглядят у меня на странице так:

  1. Скрин запущен, демон работает: Показать
  1. Скрин запущен, демон нет: Показать
  1. Скрин отвалился, демон тоже: Показать
28 июля   HTML   досуг   маленькие хитрости   мну   сисадминство   скрипт   софт

Сисадминдень2018

Сегодня последняя пятница июля, значит... — сегодня ТОТ САМЫЙ ДЕНЬ!!! Хочу поздравить всех системных администраторов по профессии и по призванию с их профессиональным и заслуженным праздником!

Желаю профессиональных свершений, космического терпения, недюжего юмора, стабильного высокоскоростного доступа в интернет, чтобы в жизни не было сбоев, вирусов и багов. Ваш нелёгкий труд требует достаточно знаний и опыта.

Пускай мониторы приветливо светятся, вирусы и ошибки лечатся, вопросы легко решаются.
Здоровья вам и побольше сил, чтобы каждый из вас легко любого «трояна» победил.

Поздравляю!

27 июля   в мире   досуг   памятные даты   праздник   сисадминство   события

Автозапуск команды в screen’е

После переезда моего  сайта на VDS’ку шум раздолбанного вентилятора Asus EEE PC 710 перестал меня беспокоить, но теперь периодически вываливается screen-сессия, в которой крутится демон опроса и наполнения БД новостей TTRSS (чаще всего демон отваливался с ошибкой 12 «недостаточно памяти», но иногда и сам процесс скрина отъезжал).

Показать

Для повторного запуска я сначала стартовал сам скрин

screen -S reader

нажимал Enter и уже в нём запускал демона:

php <путь к скрипту демона>/update_daemon2.php

Теперь, если я вижу, что сессия скрина пропала, то стартую её заново и в ней автоматом запускаю демона:

screen -dmS reader sh && screen -S reader -X stuff "php <путь к скрипту демона>/update_daemon2.php^M"

Осталось написать демона, который будет контролировать работу запущенного демона.

Но об этом позже...

18 июля   BASH   досуг   маленькие хитрости   ОС   сисадминство   скрипт   софт

Получение списка устройств в сети

Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.

Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.

Показать

<?php
// задаю необходимые переменные
$home_iface='eth0'; // интерфейс, посредством которого система включена в домашнюю сеть
$lan='192.168.120.0/24'; // определитель домашней сети (или её гостевого сегмента)
$temp_file='/tmp/dev.tmp'; // путь к временному файлу
// функция анализа и вывода MAC'а на странице
function DrawDevice() { ... }
// получаю MAC интерфейса $home_iface
$home_mac=exec("sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'");
// отображаю его на странице
DrawDevice(trim($home_mac));
// удаляю временный файл, если он есть
if(file_exists($temp_file))exec("rm -f {$temp_file}");
// сканирую сетевой диапазон $lan
exec("fping {$lan} -age -r 1 >/dev/null 2>/dev/null");
// вычленяю устройства с ответившими MAC'амм
// и записываю во временный файл,
// можно писать в базу данных для получения динамики
exec("ip n | grep 'lladdr' | awk '{print $5}' > {$temp_file}",$h);
// получаю список ответивших MAC'ов из временного файла
$h=file_get_contents($temp_file);
// и удаляю его
if(file_exists($temp_file))exec("rm -f {$temp_file}");
$mac=array();
// убираю из списка символы новой строки
$mac=explode("\n",$h);
// в цикле вывожу MAC'и
foreach($mac as$host){DrawDevice($host);}
?>

    Требования:
  • 1. в системе должен быть установлен пакет fping (или любой другой с аналогичной функциональностью, например nmap);
  • 2. пользователь, от которого запущен WEB-сервер, обычно www-data, можно проверить командой
    ps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1
    должен иметь возможность выполнения команды ifconfig от имени суперпользователя (sudo ifconfig) или запускать эту утилиту непостредственно по пути её расположения, обычно /sbin/ifconfig, можно проверить командой 
    whereis ifconfig

Статья написана для Блога «Умного дома».

14 июля   BASH   досуг   маленькие хитрости   ОС   сеть   сисадминство   скрипт   софт

Свершилось!

Моя жена меня приятно удивила. Она теперь знает в IT больше меня! Конечно, не во всех сферах, в определённой, а именно — в IPv6. Вчера она зарегалась на сайте Hurricane Electric, где есть определённая система ранжирования — сначала Newbie, затем (при условии захода на их сайт с помощью туннельного брокера) — Enthusiast, затем — Explorer, и т. д.

Сейчас у неё статус «энтузиаст», надеюсь, что скоро станет «эксплорером», для этого надо написать им письмо с почтовика, выходящего в инет только по IPv6 через этого туннельного брокера.

Показать

2018   досуг   семья   сеть   сисадминство   события   учёба

Хитрости BASH и тонкости его настройки

BASH (bourne again shell) — командная среда, используемая по умолчанию во многих современных Linux-дистрибутивах. Если используется ОС из семейства Linux, то, скорее всего, используется и bash. Ниже приведены команды, опции настройки и разные трюки, придающие пользователю терминала более комфортную среду для работы (в BASH).

Показать

Настройка автодополнения и поиска в ~/.inputrc

Для одинарного нажатия Tab при автодополнении в ~/.inputrc (или в /etc/inputrc для всех пользователей)

set show-all-if-ambiguous On


Вывод по клавишам и  из истории только тех команд, которые начинаются с уже набранных букв

"\e[A": history-search-backward
"\e[B": history-search-forward

Тонкости настройки ~/.bashrc

Для записи истории команд сразу, а не только при выходе из шела, необходимо добавить

shopt -s histappend
export PROMPT_COMMAND="history -a"


Для запрета записи дубликатов команд в историю

export HISTCONTROL="ignoredups"


Можно запретить логирование определённых команд

export HISTIGNORE="ls:[bf]g:exit"

Список исключений — через двоеточие, можно использовать шаблоны.


Эвристическое исправление ошибок а именах директорий

shopt -s cdspell


Звуковой сигнал при запуске оболочки

export PROMPT_COMMAND="echo -ne '\a'"

можно использовать по разнному, например — включить мигание окна KiTTY.


Для того, чтобы не разрывать многострочные команды, используется

shopt -s cmdhist


Если вписать

export HISTTIMEFORMAT='%d %h %Y %H:%M:%S '

то в истории будут записаны дата и время выполнения команды.


Использование регистронезависимых масок файлов

shopt -s nocaseglob

Тогда, к примеру

ls *.jpg

выведет не только *.jpg, но и *.JPG.

Хитрости BASH

Возврат в предыдущую директорию

cd -


При нажатии ESC и сразу за этим . (в терминологии *nix — Meta .) в строку подставится последний использованный объект. Например, если первой строкой набрано

ls /home/smbdy/logs

во второй наберите

rm ESC .

получите

rm /home/smbdy/logs


Реализация ввода пользовательского пароля с проверкой:

echo -n "Пользователь: "
read username
echo -n "Пароль: "
read -s password
echo -en "\nПовторите пароль: "
read -s password2 && echo -e "\n"
if [ "$password" != "$password2" ]; then
    echo -e "Пароли не совпадают.\nЗавершение работы." && exit 1
fi
echo -n "Всё верно, $username. Продолжаем." && echo -e "\n"


Копирование config.cfg в config.cfg-old

cp config.cfg{,-old}


Узнать, какой шел запущен

echo $0


Строка вида ^строка1^строка2 запустит предыдущую команду с заменой строки1 на строку2

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz


Переименование файла в такой-же, но с префиксом

mv long-file-name.txt prefix-!#^

Например, команда

mv file-with-long-name-typed-with-tab-completion.txt old-!#^

переименует ’file-with-long-name-typed-with-tab-completion.txt’ в файл с именем ’old-file-with-long-name-typed-with-tab-completion.txt’.


Функция быстрого переименования расширений

renamer() {
   local fn
   for fn in *."$1"; do
     mv "$fn" "${fn%.*}"."$2"
   done
}

Пример: renamer doc txt — переименует все доки в txt’шники в текущем каталоге.


Если определить функцию command_not_found_handle (), то можно обрабатывать ситуацию «команда не найдена». До выдачи сообщения о не обнаруженной команде bash поместит в $1 введенную строку и выполнит код этой функции. При этом, если функция возвращает код завершения 127, то сообщение о ненайденной команде будет выведено на экран.


Для добавления алиаса с автоприменением определяем новый алиас в ~/.bash_aliases

alias editalias=’edit ~/.bash_aliases && source ~/.bash_aliases’


Имейте в виду, что для работы алиасов из этого файла он должен быть явно включён в вашем ~/.bashrc:

[ -f ~/.bash_aliases ] && source ~/.bash_aliases




2018   BASH   интересное   маленькие хитрости   ОС   сисадминство   скрипт   софт

Запись и воспроизведение команд в консоли

Иногда требуется записать все, что вы вводите в терминале, для того чтобы самому запомнить, что и как делали или передать кому-то другому для анализа или обучения, или просто записать терминальную сессию вместо записи видео с захватом экрана. Все привыкли пользоватся скриншотами и записью видео с экрана. Есть даже мануалы, как делать скрины в голой консоли.

Однако существует интересный способ, как делать «видеозапись команд» в консоли без лишних телодвижений (я не говорю обо всяких доставляемых ttyrec, termrec & ipbt). Выполните в терминале, к примеру, следующие команды:

Показать

script -t 2> timing -a ttyoutput
pwd
cd /
pwd
cd -
pwd
exit

После команды exit запись с терминала прервётся и с помощью команды

scriptreplay timing ttyoutput

можно воспроизвести записанные действия и ответы системы. Для выхода можно использовать комбинацию клавиш Ctrl + D в обычном шеле или набрать exit или logout в csh (если переменная ignoreeof не задана — то Ctrl + D тоже сработает).

Для вывода списка вводимых команд без проигрывания всех действий с установленными временными интервалами достаточно ввести команду

awk '/@/' ttyoutput

А чтобы получить полный список вводимых команд и ответы интерпретатора:

awk '/./' ttyoutput

Можно даже интерактивно передавать вводмые команды, например — с помощью ключа

‒f (‒‒flush)

один пользователь вводит команды в терминал

mkfifo ttyoutput2; script -f ttyoutput2

другой — наблюдает за операциями в реальном времени с помощью

cat ttyoutput2

Сетевой обмен между удалёнными машинами можно организовать с помощью утилиты netcat.

P. S. Команды script и scriptreplay входят в пакет util-linux, поставляемый вместе с операционной системой (по крайней мере в Linux, хотя впервые утилита script появилась в системе 3.0BSD), поэтому они доступны сразу после установки системы.

P. P. S. Альтернативы — уже упоминавшиеся termrec, ipbt, ttyrec/ttyplay — имеет сходный функционал, есть утилита ttycast, осуществляющая широковещательную передачу команд терминального сеанса в реальном времени.
Также существуют такие утилиты:
TermRecord@github — пишет в html и воспроизводит в браузере.

pip install TermRecord
TermRecord -o /path/to/output_html


asciinema.org — свбодная утилита с открытым исходным кодом для записи сеансовых команд и выкладывания их в сеть.

curl -sL https://asciinema.org/install | sh
asciinema rec


showterm.io — похож на asciinema, но оперирует только с текстом.

gem install showterm
showterm
# or if you have not installed showterm, you can run the standalone
bash <(curl record.showterm.io)


monitor — утилита, перехватывающая ввод/вывод терминала и отправляющая на сайт commands.com.

curl commands.io/install-monitor-(ubuntu|macosx|redhat)
monitor -u myusername

2018   маленькие хитрости   ОС   сисадминство   скрипт   софт

Сервер и клиент Debian для тестов


Для тестовых задач создал две виртуалки в  Виртуалбоксе — сервер и клиент. Обе виртуалки ставил с образа диска Debian 9.3.0 Netinst CD с архитектурой amd64). Виртуальная машина ’server’ выступает в роли DHCP-, DNS- и прокси-сервера, а также шлюза для машины ’client’. Выкладываю тут последовательность действий, чтобы потом не забыть и использовать в дальнейшем. Действия рутинные, доступны в любом мануале, но для быстроты воспроизведения собрал их здесь вместе.

Показать

Оглавление

Сервер
Софт
Автовход
Сетевые интерфейсы
Узлы
Запрет IPv6 и форвард
DHCP-сервер
DNS-сервер
Маскарадинг
Сквид

Клиент
Софт
Автовход
Сетевые интерфейсы
Узлы



Сервер. Имеет 2 сетевых интерфейса — enp0s3 (WAN — <DHCP>, сетевой мост во внешнюю сеть) и enp0s8 (LAN — 192.168.17.1/24, внутренняя сеть).

Ставлю нужный софт:

apt-get install aptitude isc-dhcp-server squid3 bind9 dnsutils sudo most fping nmap net-tools mc ccze

Перейти к оглавлению


Делаю автовход в любой консоли, для этого в файле /lib/systemd/system/getty@.service прописываю юзера для автологина

ExecStart=-/sbin/agetty --noclear -a <юзер> %I $TERM

Перейти к оглавлению


Настраиваю сетевые интерфейсы в /etc/network/interfaces

auto lo enp0s3 enp0s8

iface lo inet loopback

iface enp0s3 inet dhcp
up iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j DROP

iface enp0s8 inet static
ipaddr 192.168.17.1
netmask 255.255.255.0
broadcast 192.168.17.255

Перейти к оглавлению


Добавляю узлы в /etc/hosts:

127.0.1.1 server
192.168.17.10 client

Перейти к оглавлению


Запрещаю IPv6 в /etc/sysctl.conf

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1


Разрешаю форвард там же

net.ipv4.ip_forward = 1

Перейти к оглавлению


Настраиваю DHCP-сервер: в файле /etc/default/isc-dhcp-server указываю

DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
DHCPDv4_PID=/var/run/dhcpd.pid
INTERFACESv4="enp9s8"

В файле /etc/dhcp/dhcpd.conf

option domain-name "<домен>";
option domain-name-servers 192.168.17.1, 4.2.2.2;
subnet 192.168.17.0 netmask 255.255.255.0 {
  range 192.168.17.10 192.168.17.50;
  option routers 192.168.17.1;
}

и перезагружаю сервис

systemctl restart isc-dhcp-server.service

Перейти к оглавлению


Настройка DNS-сервера — в работе
Перейти к оглавлению


Настраиваю маскарадинг:

iptables -A FORWARD -i enp0s8 -o enp0s3 -j ACCEPT
iptables -t nat -A POSTROUTING -o enp0s3 -s 192.168.17.0/24 -j MASQUERADE
iptables -A FORWARD -i enp0s3 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp0s3 -o enp0s8 -j REJECT

Перейти к оглавлению


Делаю бэкап /etc/squid/squid.conf в /etc/squid/backup-squid.conf, затем прописываю настройки сквида:

acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT
acl MyNet src 192.168.17.0/24
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access allow MyNet
http_access deny all
http_port 192.168.17.1:3128 transparent
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
cache_mem 512 MB
maximum_object_size_in_memory 512 KB
cache_dir ufs /var/squid_cache 1024 16 256
maximum_object_size 2 MB
https_port 192.168.17.1:3128 transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/root/keys/squid.pem key=/root/keys/squid.key
sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
always_direct allow all

coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320

создаю директорию для кэша сквида и дэ-начу весь траф с внутренней сети на прокси:

mkdir -p /var/squid_cache
chmod o+w /var/squid_cache
iptables -t nat -A PREROUTING -i enp0s8 ! -d 192.168.17.0/24 -p tcp -m multiport --dport 80,443 -j DNAT --to 192.168.17.1:3128

Перейти к оглавлению


Клиент. Имеет 1 сетевую — enp0s3 (LAN — <DHCP>, внутренняя сеть).

Ставлю софт:

apt-get install aptitude dnsutils sudo most fping nmap net-tools mc ccze

Перейти к оглавлению


Делаю автовход в любой консоли (по аналогии с сервером), для этого прописываю автологинящегося пользователя в файле /lib/systemd/system/getty@.service:

ExecStart=-/sbin/agetty --noclear -a <юзер> %I $TERM

Перейти к оглавлению


Настраиваю сетевой интерфейс в /etc/network/interfaces

auto lo enp0s3 enp0s3

iface enp0s3 inet dhcp
up iptables -A INPUT -p icmp -m icmp --icmp-type 3 -j DROP

Перейти к оглавлению


Добавляю узлы в /etc/hosts:

127.0.1.1 client
192.168.17.1 server

Перейти к оглавлению


2018   Linux   виртуальные ОСи   досуг   ОС   сеть   сисадминство   софт

Напильник для Эгеи, часть 2

      Устроил для блога ревизию — все длинные статьи спрятал под спойлер, ведь ката в Эгее нет в принципе, разработчик объяснил причину этого в своей статье.

Реализацию спойлера подсмотрел у других, у себя реализовал следующим образом:

Показать

В файле /user/extras/header-pre.tmpl.php прописал следующие строки:

<script type="text/javascript" src="/blog/user/extras/spoiler-hider.js"></script>
<link rel="stylesheet" href="/blog/user/extras/spoiler-hider.css">


spoiler-hider.js:

// Спойлеры для Эгеи
$(function(){
    $('.spoiler-controller').click(function(){
        var aClasses = this.className.split(/\s+/);
        for (var i in aClasses) {
            if (aClasses[i] == 'spoiler-controller' || aClasses[i] == 'spoiler-shown') {
                aClasses.splice(i, 1);
            }
        }
        if ($(this).hasClass('spoiler-shown')) {
            this.innerHTML = this.innerHTML.replace('Скрыть', 'Показать');
            $(this).removeClass('spoiler-shown');
        } else {
            this.innerHTML = this.innerHTML.replace('Показать', 'Скрыть');
            $(this).addClass('spoiler-shown');
        }
        for (i in aClasses) {
            if (!aClasses[i]) continue;
            var jContainer = $('.'+aClasses[i]).not('.spoiler-controller');
            jContainer.slideToggle();
        }
    });
});

spoiler-hider.css

.spoiler-controller { border-bottom: 1px dashed black; cursor: pointer; }
.spoiler-controller:hover { color: #b30; border-color: #b30; }
.spoiler { display: none; }

Теперь в нужном месте страницы пишу код

<p><b class="spoiler-controller pop-up_camper_<уникальный идентификатор>">Показать</b></p>
<section class="spoiler pop-up_camper_<уникальный идентификатор>"><p></p>

а в конце текста (и спойлера)

</section>


Также изменил размер заголовка блога, указав в /themes/plain/styles/main.css

.title h1 {...; font-size: 24px ;...}


Изменил подсвечивание кода (по этой статье) с помощью highlight.js:

<link rel="stylesheet" href="//yandex.st/highlightjs/7.3/styles/github.min.css">
<script src="//yandex.st/highlightjs/7.3/styles/github.min.css"></script>
<script>
	hljs.tabReplace = '    ';
	hljs.initHighlightingOnLoad();
</script>

hljs.tabReplace нужен для того, чтобы табуляции в коде заменялись на пробелы. highlight.js сам определяет на каком языке написан код, но можно явно указывать язык, добавляя class к тегу pre.


2018   HTML   досуг   маленькие хитрости   сисадминство   софт
Ранее Ctrl + ↓
Наверх