Сообщения

Показаны сообщения с ярлыком "Фишки Linux"

Проблема с Wait IO в Linux

Изображение
Wait I/O - это параметр который показывает какой процент времени работающие процессы были заблокированы, ожидая когда операция ввода -вывода закончится. Вот и мне пришлось столкнуться с такой проблемой. Стал замечать, что один из серверов стал периодически "залипать". Вывод команды top показал что в этот момент wa-процент составлял от 90% до 100%, что было просто не допустимо. Запустим vmstat, чтобы убедиться в наличии проблемы Как видно на картинке - действительно параметр wa подскакивает до 100. Чтобы отследить "проблемный" процесс - воспользуемся небольшим сочетанием команд: while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done Через некоторое время виновник был найден Оказалось что в cron попал скрипт который предназначался не этому серверу. Скрипт был убран и все стало на свои места.  Также хочу добавить, что причина Wait IO может быть различна. Но всегда ответ кроется в процессах с...

Поиск IP адресов в файле, используя bash

Понадобилось мне тут вывести список всех IP-адресов, встречающихся в файле. Сделать это можно следующей командой cat /etc/named.conf | grep listen-on | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

Как узнать ip адрес интерфейса и вывести только его

Маленький пример о том как использовать ifconfig, cut и awk чтобы вывести только ip адрес. Вывод команды ifconfig будет таким $ /sbin/ifconfig lo        Link encap:Local Loopback           inet addr:127.0.0.1  Mask:255.0.0.0           inet6 addr: ::1/128 Scope:Host           UP LOOPBACK RUNNING  MTU:16436  Metric:1           RX packets:69527 errors:0 dropped:0 overruns:0 frame:0           TX packets:69527 errors:0 dropped:0 overruns:0 carrier:0           collisions:0 txqueuelen:0           RX bytes:41559546 (39.6 MiB)  TX bytes:41559546 (39.6 MiB) eth0      Link encap:Ethernet  HWaddr 00:17:9A:0A:F6:44           inet addr:192.168.2.1  Bcast:192.168.1.255  Mask:255.255.255.0         ...

Установка драйвера для NetGear WNA1100 USB WiFi адаптера

Изображение
Попросили меня на днях подключить драйвер для WiFi адаптера NetGear WNA1100 USB. Выглядит сей девайс следующим образом (см. картинку). Интересен он тем, что может работать в режиме Access Point в связке с hostapd . Итак, втыкаем этот девайс в машину и смотрим что адаптер определился: [root@host src]# lsusb  Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 002: ID 0846:9030 NetGear, Inc.  Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Если у вас также - значит поехали далее. Устанавливаем linux-headers, build-essential и качаем драйвера: [root@host ~]# apt-get install linux-headers-$(uname -r) [root@host ~]# apt-­get install build-essential [root@host src]# cd /usr/src [root@host src]# wget h...

Выполнение скрипта при обращении к хосту

Однажды у меня возникла задача - как сделать так, чтобы при обращении к определенному ip на шлюзе запускался некий скрипт или программа. В этом посте я хочу привести пример на perl с использованием tcpdump. В этом скрипте если было обращение с хоста 192.168.0.104 к 93.158.134.61 произойдет перезапуск DLNA сервера. Я использую его в связке со своим телевизором подключенном к локальной сети. Таким образом мне удалось перезапускать DLNA службу, если я открыл на телевизоре сайт yandex.ru. Ну и собственно сам скрипт: #!/usr/bin/perl $LIMIT = shift || 5000; $|=1; open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |"); while (<>) {     if (/^\S/) {   last unless $LIMIT--; while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g)  {        #print "$client -> $host\t$&\n";        if(($host=="93.158.134.61") and ($client="192.168.0.104")){           ...

PS1 или меняем строку приглашения

Изображение
Работая  одновременно с большым количеством линуксовых серваков я подумал что было бы удобно, если в строке риглашения выводилось не только сообщение о хосте, пользователе но и ip адресе текущей машины. Сказано - сделано. Открываем файл .bashrc в домашнем каталоге и дописываем в него строку export "PS1=[`/sbin/ifconfig eth0 | /usr/bin/perl -ne 'if ( m/^\s*inet (?:addr:)?([\d.]+).*?cast/ ) { print qq($1\n); exit 0; }'`][\u@\h \W] # " Сохраняем и переподключаемся. И в результате видим нашу красоту. Теперь я буду путаться гораздо меньше =)

Примеры замены подстроки в файлах на perl, sed, awk

Часто бывает нужно заменить какую то 1 строку в конфигурационном файле из скрипта. Чтобы далеко не ходить можно использовать следующие примеры скриптов. 1. Замена подстроки в одном файле с помощью sed $ cat ./file.txt I have three dogs. $ sed -e 's/dog/cat/g' ./file.txt I have three cats. 2. Замена подстроки в одном файле с помощью perl (вариант короче, но нужен perl) perl -e 's/dog/cat/g' -pi ./filename 3. Замена подстроки в нескольких файлах с помощью простого bash-скрипта #!/bin/bash f="cat" t="dog" for i in `egrep -r $f ./www | grep -v svn | cut -d ":" -f1` do     reg="s/$f/$t/g"     sed -e $reg $i > ${i}.bak     mv ${i}.bak $i     echo $i done 4. Замена подстроки в нескольких файлах с помощью perl одной командой egrep -rl "dog" ./ | xargs -i perl -pi -e 's/dog/cat/g' '{}' 5. Замена подстроки в нескольких файлах с помощью awk одной командой  awk '{gsub("cat...

Пересылка с почты gmail apps

Давно ничего не писал. Вот решил описать небольшой "костыль", который пришлось сделать для почты gmail apps. В одной организации, которую я обслуживаю, почтовая система привязана на gmail apps. Организация не большая - 20 сотрудников. Необходимо было просто создать ящик all@domain.com, почта с которого должна была пересылаться на ящики сотрудников. Вроде бы задача тривиальна, но не все так просто. Если пользоваться стандартными средствами gmail apps, переадресация происходила (если зайти через web-морду письмо лежит в ящике), но всякого рода outlook-и не хотели принимать переадресованное письмо. Я решил сделать это через алиасы на одном из linux серверов. Общая схема проста: получаем почту с помощью fetchmail с ящика all@domain.com, прописываем алиасы и почта отсылается всем сотрудникам. Итак, что для этого надо: 1. Создаем пользователя для получения почты(можно конечно и root использовать, но тогда все что вам валится на почту root будет валиться пользователям, что не хор...

Проверяем запущен ли asterisk

#!/bin/sh p=`ps aux | grep asterisk | grep SCREEN | wc -l` if [ $p -ne 1 ] then killall asterisk /usr/bin/screen -L -d -m -S asterisk /usr/sbin/asterisk -vvvvcd else echo 'asterisk is started' > /dev/null fi ветеринарная помощь дома

Как определить какими библиотеками и файлами пользуется программа

В Linux очень просто определить какие файлы и библиотеки использует та или иная программа. Для теста посмотрим какие библиотеки использует культовый консольный файловый менеджер Midnight Commander. Для этого достаточно выполнить следующую команду: debian@localhost# ldd /usr/bin/mc А для того чтобы определить какие файлы открывает программа: debian@localhost# sudo apt-get install strace debian@localhost# strace mc

Небольшая заметка по утилите screen

Иногда бывает нужно, чтобы запускаемая программа или процесс висели в "отдельной" консоли. Можно, конечно, запустить 2 и более ssh-клиентов, но это не решает некоторых проблем и является несколько неудобным(при определенных условиях). Решением проблемы является утилита screen . В репозитариях она присутствует. Установить ее можно следающим образом: $sudo apt-get install screen В моем случае стоит задача запустить сервер ip-телефонии asterisk при загрузке Debian Linux не только в фоне, но и чтобы можно было подключиться к консоли asterisk. Для этого в файле /etc/rc.local я прописал автозапуск следующим образом: /usr/bin/screen -L -d -m -S asterisk /usr/sbin/asterisk -vvvvcd Теперь у нас asterisk запуститься в отдельной консоли. Возникает вопрос: "как к ней(консоли) подключиться?". А очень просто. Необходимо выполнить команду: screen -r asterisk Чтобы выйти из консоли необходимо просто нажать сочетание клавишь: зажимаете Ctrl и последовательно "A"->"...

Добавление нового пользователя в mysql

Mysql-сервер я настраиваю нечасто, в основном не для массового использования. Поэтому иногда требуется добавить нового пользователя на базу. Делать через web-интерфейс не интересно, а через командную строку запоминать лень. Поэтому для лентяев как я следующий код: GRANT ALL PRIVILEGES ON testbase.* TO testuser@localhost IDENTIFIED BY 'testpass'; flush privileges; А тут можно купить бассейн надувной

Смена MAC адреса в Linux

Останавливаем интерфейс eth0, назначаем новый MAC, перегружаем сеть ifconfig eth0 down ifconfig eth0 hw ether 00:00:00:00:00:00 /etc/init.d/networking restart Чтобы MAC менялся и при загрузке открываем файл /etc/network/interfaces и к интерфейсу добавляем в качестве параметра к сетевому интерфейсу: hwaddress ether 00:00:00:00:00:00 А вот тут можно обменять деньги webmoney

Инициализация iptables при загрузке debian

В последних версиях Debian отсутствует скрипт инициализации iptables. Приведу маленький пример, как решить данный вопрос. Когда вы уже решили что все в iptables настроено и отлажено: iptables --list Сохраняем настройки командой: iptables-save > /etc/firewall.conf После чего выполняем последовательность команд echo "#!/bin/sh" > /etc/network/if-up.d/iptables echo "iptables-restore > /etc/network/if-up.d/iptables chmod +x /etc/network/if-up.d/iptables В тут можно узнать цены на услуги colocation в москве

Как сделать безопасный рестарт, если Debian(Ubuntu) завис

А вот что: удерживая кнопки Alt+SysRq (PrintScreen) нажимайте последовательно следующие кнопки: R, E, I, S, U, B. После этого ваш компьютер перезагрузится. Да, это магия. Просто запомните последовательность нажатия кнопок REISUB . R - возвращает управление мышке и клавиатуре. E - посылает сигнал SIGTERM всем запущенным процессам, кроме init. Другими словами производится попытка безопасного (с сохранением данных) завершения всех процессов, кроме процесса init. I - посылает сигнал SIGKILL всем запущенным процессам, кроме init. Это значит, что все процессы кроме init будут уничтожены и данные будут утеряны. S - переписывает все данные из кэш-памяти на жесткий диск, происходит синхронизация, уменьшает шанс повреждения данных. U - перемонтирует все примонтированные файловые системы в режиме только чтение. После использования этого ключа вы можете перезагружать систему нажатием Alt + SysRq + B без ущерба для системы. B - перезагрузка системы. Использование этого ключа без использования други...

Сохранение статистики pppd в MySQL

Вот такой код я использую, чтобы вести учет статистики для PPP соединений в MySQL. Этот код помещается в скрипт /etc/ppp/ip-down. Используются переменные окружения, устанавливаемые pppd. #!/bin/sh # echo "INSERT INTO pppdstats VALUES ( `date +%Y%m%d`, `date +\'%T\' -d\"-${CONNECT_TIME} sec\" ` , '$PEERNAME', '$IPREMOTE', '$CONNECT_TIME', '$BYTES_SENT', '$BYTES_RCVD', '$DEVICE', `date +\'%T\'`);" | mysql -uuser -ppassword database Формат таблицы: CREATE TABLE pppdstats ( c_date date, c_start_time time, user varchar(128), ip_addr varchar(15), online_time int(11), send_bytes int(11), recv_bytes int(11), device varchar(15), c_end_time time ); PS: Естественно, что изменив перенаправление можно записывать статистику в обычный текстовый файл.

Как ограничить через iptables максимальное число одновременных соединений с одного IP.

# Максимум 10 одновременных соединений к 80 порту с одного IP iptables -A INPUT-p tcp --dport 80 -m iplimit --iplimit-above 10 -j REJECT # Блокируем на стадии SYN iptables -I INPUT -p tcp --syn --dport 80 -j DROP -m iplimit --iplimit-above 10 # 20 соединений на сеть класса С iptables -p tcp --dport 80 -m iplimit --iplimit-above 20 --iplimit-mask 24 -j REJECT

Как вести лог блокировок в iptables и ipfw

Linux: - Перед правилом блокировки нужно вставить "log" правило: iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 \ -j LOG --log-level debug --log-prefix "outgoing mail" iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 -j DROP - Проверить запущены ли в системе klogd и syslogd. - Настроить /etc/syslog.conf на прием kern.debug логов: kern.=debug -/var/log/kernel/info FreeBSD: Добавить ключ log в ipfw, например: ipfw add 1000 deny log tcp from any to 192.168.10.10 22 via fxp0 ipfw add 1000 deny log logamount 0 tcp from any to 192.168.10.10 80 via fxp0 Для ведения логов ядро должно быть собрано с IPFIREWALL_VERBOSE или нужно выставить "sysctl -w net.inet.ip.fw.verbose=1" Далее проверить чтобы в /etc/syslog.conf было упоминание LOG_SECURITY: security.* /var/log/security Через параметр logamount передается число записей которые будет записано в лог, после превышения записи перестанут появляться в логе, до тех п...

Как заблокировать через iptables пакеты отправленные из определенной ОС

Модуль ost был написан для использования в iptables правилах результатов пассивного определения типа операционной системы, из которой был отправлен TCP SYN пакет. Загружаем исходные тексты модуля или ставим из patch-o-matic: wget http://tservice.net.ru/~s0mbre/archive/osf/osf-2008_06_14.tar.gz В Makefile через переменную IPTABLES указываем путь к заголовочным файлам iptables (iptables.h и libiptc/). Собираем модуль ipt_osf.ko: make Собираем библиотеку libipt_osf.so, после чего копируем ее в /lib/iptables или /lib64/iptables: make lib Собираем утилиты для загрузки сигнатур ОС и ведения лога (load, osfd, ucon_osf): make bin Загружаем список сигнатур: wget http://www.openbsd.org/cgi-bin/cvsweb/src/etc/pf.os Загружаем модуль ядра: insmod ./ipt_osf.ko Загружаем сигнатуры: ./load ./pf.os /proc/sys/net/ipv4/osf Пример правила для принятия пакетов с Linux машин, с занесением всех остальных в лог: iptables -I INPUT -j ACCEPT -p tcp -m osf --genre Linux --log 0 --ttl 2 При отпра...

Запускаем 1С под Debian Linux

Не вдаваясь в детали хотелось бы описать процесс сего действия. Будем считать что работа с wine для вас не новость. Если так, то лучше для начала почитать различные статьи на эту тему. Итак, начнем: 1. Обязательно удаляем все что касается wine с вашего компьютера(нужны права root) #dpkg -P wine 2. Выкачиваем все что есть отсюда ftp://ftp.etersoft.ru/pub/Etersoft/WINE@Etersoft-1.0.8/WINE/Debian/4.0/ 3. Удалить каталог .wine из домашнего каталога пользователя $ rm -rf ~/.wine 4. Переходим в каталог куда скачали файлы с ftp сервера. 5. Установливаем пакеты WINE@Etersoft(нужны права root) # dpkg -i ./*wine*.deb 6. Если все прошло удачно, вводим от имени обычного пользователя команду: $ wine Это нужно чтобы в личном каталоге пользователя создать рабочее обружение среды wine. 7. Смотрим версию: $ wine --version WINE@Etersoft 1.0 Network (1.0.8) 8. Далее в каталог c:\windows\system32 копируем все файлы *.dll из ОС Window...