Экспертам
Статистика tcp соединений
netstat -npat|grep ESTABLISHED | awk 'BEGIN{counter=0;} {split($5,a,":");ip=a[1];if(ip in ips)ips[ip]+=1;else ips[ip]=1;counter++;} END{for(i in ips)print i" = "ips[i]"\n"}'| sort | grep -vP '^\s*$'
Если убрать grep ESTABLISHED, то это добавит список ожидающих соединений.
Если оставить netstat -n то добавятся UDP
Текст в картинку (делаем скриншот консоли)
Учитываются системные шрифты, а вот цветовые схемы консоли не работают
$ ifconfig | convert label:@- ip.png $ ping -c 5 ya.ru | convert label:@- ya.png $ echo "Hello World" | convert label:@- hello.png
Архивация динамического списка файлов, с отображением прогресса
Стояла задача - в страшно разветвленной помойке директорий и файлов выцепить все файлы определенных типов и затарить их в архив /tmp/archive.tar.gz. Дополнительно хотелось наблюдать за прогрессом с прогнозом времени выполнения. Было решено средствами find, pv, gawk (только gawk, с mawk не заработало) следующим образом:
find -type f -o -name \*.c -o -name \*.h -o -name \*.xsl -print0 | xargs -0 du -bs | awk '{s+=$1;sub(/^[0-9]*\t/,"");n=$0"\0"n;printf"scan files: %d\r",++i}END{ORS="";print n|"tar --null -cT-|pv -s "s"|gzip -9> /tmp/archive.tar.gz"}'
Оживление запоротого насмерть BIOS
Рассказ о том, как я восстановил свой BIOS после неудачной прошивки coreboot. Примеры прошивки под DOS и Linux, немного фотографий и рассказ об одном из самых брутальных способов оживления мертвой материнки.
Замена песочным часам в терминале
Иногда в окне терминала требуется функциональность песочных часов. Предлагается решение:
Вывод сообщений статуса в bash скрипте
При написании shell скриптов часто возникает необходимость отображать действия скрипта и информацию о то выполнилось действие или нет, чтобы примерно выглядело как выполнение init.d скриптов при загрузке системы.
Примерно вот так:
* Производится действие 1 [DONE] * Производится действие 2 [FAIL] это ошибка действия 2
Узнать время в другом часовом поясе
Иногда нам хочется узнать время в другом часовом поясе. Иногда (но еще реже) нам нужно, чтобы таймзона нашего пользователя была не такой, как системная. Для этого существует переменная окружения TZ, в которую можно записать значение и получить нужный эффект.
$ date Fri Feb 18 10:22:53 EET 2011 $ TZ="America/Chicago" date Fri Feb 18 02:22:53 CST 2011
Узнать название зоны поточнее всегда можно в каталоге /usr/share/zoneinfo.
Пример замены n-го появления строки в файле
Задача была озвучена так:
20:19 < todd_dsm> hey all, I have 1 file to modify (httpd.conf) I need to change the 2nd of for occurrences of "AllowOverride None". Is there a way do change the 2nd occurrence and leave 1,3, and 4 untouched?
Примерный перевод
У меня есть httpd.conf. Мне надо заменить второе появление в файле "AllowOverride None". Есть возможность заменить второе появление, не тронув первое, третье и четвертое?
Ответ:
Пример заменяет второе появление "AllowOverride None" на "replace".
$ printf "AllowOverride None\nAllowOverride None\nAllowOverride None\nAllowOverride None\n" |
awk '/AllowOverride None/ && (++i == 2) {print "replace";next}{print}'На sed
$ printf "AllowOverride None\nAllowOverride None\nAllowOverride None\nAllowOverride None\n" |
sed -e '/AllowOverride None/{x;/^1$/{x;s/.*/replace/;x};s/$/1/;x}'Wget 1.12 what new
Вышел релиз Wget 1.12 , консольной программы для автоматического получения файлов по сети. В новой версии представлены следующие улучшения.
Информация о VCS (Version Control Systems) в приглашении zsh
При переходе на git пришла в голову мысль что было бы удобно видеть в приглашении zsh в каком состоянии локальный репозиторий.
Всевозможные rebase, am, merge и подобное сбивает с толку.
Сказано - сделано. Написал собственный велосипед. Потом нашел еще парочку велосипедов в интернете, разобрал на запчасти и прикрутил к своему велосипеду новенькие колеса и смазал педали. Но вскоре, к своему стыду, в мане zsh увидел уже готовый даже не велосипед, а целый танк с экипажем. И собакой в придачу.
Вот он
$ PAGER=less LESS='-p VERSION CONTROL SYSTEMS' man zshallТворчески переосмыслив пример из мана вот что получилось
autoload -Uz vcs_info # включаем только git svn svk cvs. Возможные VCS можно посмотреть командой vcs_info_printsys zstyle ':vcs_info:*' enable git svn svk cvs # домашняя директория из CVS репозитория. Исключаем ее и некоторые директории из домашнего репозитория zstyle ':vcs_info:*' disable-patterns "$HOME(|/.*|/bin)" # Модифицированная версия из man zshcontrib, добавлены флажки staged и unstaged изменений zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}%m%F{5}[ %F{2}%b%F{3}|%F{1}%a%F{5}][ %B%F{yellow}%c%F{red}%u%%b%F{5}]%f ' zstyle ':vcs_info:*' formats '%F{5}(%f%s%F{5})%F{3}%m%F{5}[ %F{2}%b%F{5}][ %B%F{yellow}%c%F{red}%u%%b%F{5}]%f ' zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r' zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' get-revision true setopt prompt_subst RPROMPT=$'${vcs_info_msg_0_}%b%F{cyan}%T%f' # в zsh >= 4.3.11 можно add-zsh-hook precmd vcs_info precmd () { vcs_info }
Ну и как всегда: Live demo! Ж:-)
Боремся с предупреждениями при статической линковке glibc в Linux
Этот совет вводит в заблуждение и ошибочен. -all-static линкует все динамически, в чем можно убедиться, выполнив ldd <наша программа>. Возможно, в комментариях кто подскажет как избавиться от динамической зависимости от glibc?
Несмотря на то, что статическая линковка в Linux это зло, иногда и ко злу приходится приобщаться по разным причинам... Если вы пытаясь слинковать все динамически получаете следующее или похожее предупреждение:
/usr/lib/gcc/i686-pc-linux-gnu/4.4.1/../../../libcrypto.a(dso_dlfcn.o): In function `dlfcn_load': (.text+0x7b6): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/i686-pc-linux-gnu/4.4.1/../../../libssh.a(misc.c.o): In function `ssh_get_user_home_dir': (.text+0x262): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/i686-pc-linux-gnu/4.4.1/../../../libssh.a(connect.c.o): In function `getai': (.text+0x663): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
что свидетельствует о том, что во время запуска программы все равно потребуется динамическая библиотека, поменяйтя ключ при линковке (обычно переменная LDFLAGS в Makefile) -static, на -all-static и возрадуйтесь! Впрочем не забывайте подключить также -lc, -lm и подобные статические библиотеки.
Полный аудит действий пользователей на файловом сервере под управлением SAMBA
Возникла необходимость видеть историю всех действий пользователей на файловом сервере под управлением SAMBA
после долгого чтения гугла пришел к выводу, что это бесполезно и погрузился в чтение манов самбы.
И вот какое решение родилось:
Логи в цвете
Узнал про интересную утилитку, которая подсвечивает логи, что облегчает их чтение. Очень удобно.
Имя ей CCZE. Правда она не обновлялась с 2003 года, но это и не нужно.
Ставим:
sudo aptitude install ccze
Юзаем:
ccze -A < /var/log/syslog | tail -f -n 20
Ключ -А нужен чтобы текст выводился "сырым", иначе всякие tail'ы да less'ы подглючивают.
Скрипт для импорта pgp-ключей с лаунчпада (для *buntu)
Не так давно я выкладывал скрипт для импорта ключей из PPA репозиториев, но, к сожалению, на сайте launchpad.net произошли изменения и старый скрипт уже не работает. Поэтому было решено это дело исправить, а заодно добавить приятную возможность :)
Вывод описания ошибки в стандартном assert
Стандартный макрос assert() в C применяется для внутренних допущений в фунции, которые всегда должны выполнятся. Иначе они являются последствиями программной ошибки. Например вызов фунции не с тем параметром или повредилась память.
Но этот макрос неудобен тем что выводит только условие срабатывания макроса, и нельзя вставить описание ошибки. Выйти из этого положения можно использую трюк с добавлением к условию самого сообщения.
Например имеем файлик assert.c:
#include <stdio.h> #include <assert.h> int main() { assert(2 + 2 == 4 && "описание ошибки если 2 + 2 не равно 4"); assert(2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5"); return 0; }
Тестируем что получится:
ramok@~tests/ make assert && ./assert
cc -W -Wall assert.c -o assert
assert: assert.c:7: main: Assertion `2 + 2 == 5 && "описание ошибки если 2 + 2 не равно 5"' failed.
[1] 29464 abort (core dumped) ./assertОграничение использования CPU каким-либо процессом
В этом поможет утилита cpulimit. )
Ставим:
$ aptitude install cpulimit
Выполняем:
stasikos@stas-desk:~$ sudo cpulimit -e dynamips -l 20
Process 12942 detectedРадуемся:
top - 16:01:06 up 4:47, 1 user, load average: 0.65, 0.88, 0.74
Tasks: 117 total, 2 running, 113 sleeping, 1 stopped, 1 zombie
Cpu(s): 13.2%us, 2.1%sy, 0.0%ni, 84.5%id, 0.0%wa, 0.2%hi, 0.0%si, 0.0%st
Mem: 1000948k total, 915980k used, 84968k free, 19792k buffers
Swap: 2048248k total, 215404k used, 1832844k free, 396968k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12942 stasikos 20 0 491m 213m 58m T 20 21.8 3:59.97 dynamipsfusion-icon и оконный декоратор gtk-window-decorator
Ошибкам подвержены следующие версии пакетов
x11-wm/compiz-fusion-0.7.8 x11-plugins/compiz-fusion-plugins-main-0.7.8 x11-plugins/compiz-fusion-plugins-unsupported-0.7.8 x11-plugins/compiz-fusion-plugins-extra-0.7.8 x11-apps/fusion-icon-0.1
Все из оверлея "desktop-effects"
Проблема:
В гноме видим оконный декоратор.

После запуска fusion-icon видим что хотя и выставлен декоратор gtk-window-decorator окно выглядит иначе

Лечение:
Как фильтровать абзацы
Иногда возникает необходимость отфильтровать только те абзацы в тексте, которые содержат какое либо слово или строку.
Под абзацами подразумевается текст отделенный от остального текста пустой строкой.
Практический пример:
при настройке мультимедийных клавиш, xev выводит очень быстро, очень много текста. Хочется фильтровать только описание событий связанных с определенными клавишами. Например пусть это будет XF86Forward и XF86Back.
Собственно пример команды
$ xev | sed -ne 'H;$bz;/^$/{:z;g;/XF86Forward\|XF86Back/p;s/.*//;x}'Запускаем это и нажимаем все мультимедийные клавиши в поисках нужных.
Как это работает:
1. Накапливаем в буфере (hold space) абзац
2. Если находим признак окончания абзаца (в нашем случае - пустая строка) или это последняя строка, забираем из буфера накопленный.
2.1 Проверяем если нужные слова в абзаце. Если есть - печатаем абзац.
2.2. Стираем обработаный абзац.
Google Earth через http прокси
Это делается очень просто и не надо будет никакой тульзы по направлению к прокси или т.п. И не надо трогать к иптаблес :) (как их ненавижу)
Короче эту делаю я так, надеюсь всем понятно
$ http_proxy=http://127.0.0.1:8090 googleearthМожно занести в ~/.bashrc или ~/.zshrc строчку
export http_proxy=http://127.0.0.1:8090
и тогда многие программы будут тоже ходить через прокси





