Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

forum.0day.kiev.ua _ Системное администрирование _ Скрипты для системных администраторов *NIX

Автор: pilson Dec 24 2010, 16:59

Предлагаю в этой теме делиться различными скриптами для маленьких и не очень нужд, для облегчения жизни себе, любимым drinks.gif
В основном для Bash, PERL, AWK, но также приветствуется и остальное.

Автор: reiten Dec 24 2010, 17:55

Для бытовых нужд:

Перегонка cue+flac в mp3

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Регулярный инкрементальный бекап данных (запускается по крону, для рабочей станции самое оно):
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: pilson Jan 5 2011, 13:49

Скрипт автоматизации создания SVN репозиториев и назначение пользователя, группы и прав на созданный репозиторий.
В качестве параметра скрипту указывается имя репозитория, который нужно создать. Можно указывать несколько репозиториев сразу, через пробел. Если параметр отсутствует - скрипт завершается с ошибкой.

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: gonivo Jan 9 2011, 1:07

Вот скрипт сваял для сервака обновления Nod32

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Создавался как замена обновляющей части одноименного скрипта с сайта лиссяры - оный после обновления перла стал глючить, но главная изюминка автонагугливание ключиков работает.
Eсли создать каталог ./loc и в него положить nod32.auth с строками username= password= то будет работать и сам.
Ну и + скачка свежих версий инсталлов нода

Автор: pilson Jan 10 2011, 17:39

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

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: ssslav77 Apr 7 2011, 8:14

Вот скриптик для рестарта conky (иногда в процесах висит, а на рабочем столе ничего не отображает):

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Коротко и ясно)
..создал скриптик, выложил на рабочий стол ярлычек - и все)

Установка "нужной" даты в виртуальной машине VirtualBox (из-под Ubuntu):

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Попрятал под спойлер


dance4.gif

Автор: Freestyler Apr 19 2011, 9:36

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

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: nerve Oct 1 2011, 19:00

помогите решить такую задачу:
есть n интерфейсов, которые получают адрес, маску, шлюз и днс по дхцп.
надо:
- потушить все интерфейсы

#!/bin/sh
ifconfig n1 down
ifconfig n2 down

- по-очереди включить каждый и для верности запустить получение адреса по дхцп
ifconfig n1 up
dhclient n1

- парсить вывод netstat -rn на предмет дефолтного шлюза
netstat -rn | grep default
default            1.1.1.1     UGS       12 73504426     -     8 fxp1

- или, если система смогла получить два значения параметра default, то парсим эти два адреса
netstat -rn | grep default
default            1.1.1.1     UGS       11 73406860     -     8 fxp1
default            2.2.2.2     UGS       11 73406860     -     8 fxp2

- если не смогла получить два шлюза, то выключаем n1, включаем n2 и находим значение другого шлюза
ifconfig n1 down
ifconfig n2 up
dhclient n2
netstat -rn | grep default
default 2.2.2.2 UGS 11 73406860 - 8 fxp2

- смотрим файл и вносим значение шлюза1 в первую попавшуюся строку $ext_gw1 = "сюда",
а шлюза2 в строку $ext_gw2 = ""
cat /etc/pf.conf | grep ext_gw1
ext_gw1 = "3.3.3.3"

- заносим значение любого из найденных шлюзов в файлик
echo '1.1.1.1' > /etc/mygate

включаем выключенные интерфейсы и получаем для них адреса. с большой долей вероятности после выкл/вкл параметр пары адрес-шлюз останется тот же. если же сменится, то запускаем скрипт второй раз или просто запускаем его два раза для надежности)
- ну и релоад конфига
pfctl -f /etc/pf.conf

надо для НАТ-а соурса в разные сетки через некстхоп, поэтому нужен параметр шлюза, чтоб корректно отрабатывать автоматом, после конца аренды выданного адреса.

Автор: I00matolog Nov 29 2011, 21:05

Есть список доменов
Надо както пробежатся по ним и посмотреть кто из них отдает телнет на 80 порт.
И сооветственно на вывод вывести - если есть 80 порт - живой домен, если нет то мертвый.
Оптимально баш.
Памажите пожалуйста.

Автор: pilson Nov 29 2011, 21:24

Синторрес погорячился, однако smile.gif Причем тут виндовс? smile.gif

Если навскидку - то:

for t in $(cat 1.txt); do echo -n "$t "; nmap $t -p 80 -P0 | awk '/80\/tcp/ {print $2}'; done
ya.ru open
google.com open
brig.emict.com filtered
1c.ru open
piccy.info open

Автор: I00matolog Nov 29 2011, 21:42

(pilson @ Nov 29 2011, 21:24) Перейти к цитате

Синторрес погорячился, однако smile.gif Причем тут виндовс? smile.gif

Если навскидку - то:
for t in $(cat 1.txt); do echo -n "$t "; nmap $t -p 80 -P0 | awk '/80\/tcp/ {print $2}'; done
ya.ru open
google.com open
brig.emict.com filtered
1c.ru open
piccy.info open


видимо у нас разные nmap. ваш синтаксис не подходит.

telnet hvost-oruzhie.com.ua  80                          
Trying 62.149.9.28...
Connected to hvost-oruzhie.com.ua.
Escape character is '^]'



[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -P0

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 21:41 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds
[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -P0 | awk '/80\/tcp/ {print $2}';

Автор: pilson Nov 29 2011, 21:48

(I00matolog @ Nov 29 2011, 21:42) Перейти к цитате

видимо у нас разные nmap. ваш синтаксис не подходит.
[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -P0

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 21:41 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds
[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -P0 | awk '/80\/tcp/ {print $2}';


Замечал в дебиане такой глюк. Из-под пользователя (не из-под рута) работает нормально, проверь.

Также еще попробуй в nmap не "-P0", а "-PN"

Автор: I00matolog Nov 29 2011, 22:05

(pilson @ Nov 29 2011, 21:48) Перейти к цитате

Замечал в дебиане такой глюк. Из-под пользователя (не из-под рута) работает нормально, проверь.

Также еще попробуй в nmap не "-P0", а "-PN"

неа..не пашет.

[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -PN | awk '/80\/tcp/ {print $2}';
[root@evaxua ~]# nmap hvost-oruzhie.com.ua  -p 80 -PN                              

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 22:00 EET
Nmap done: 1 IP address (0 hosts up) scanned in 0.29 seconds


это бсд

[root@evaxua ~]# uname -a
FreeBSD evaxua 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Tue Sep  9 15:06:38 EEST 2008     admin@evaxua:/usr/src/sys/i386/compile/EVAX-UA  i386
[root@evaxua ~]# nmap -v

Starting Nmap 5.00 ( http://nmap.org ) at 2011-11-29 22:00 EET



зы. фаер
[root@evaxua ~]# ipfw show
00100   33302273  49381428704 allow ip from any to any via lo0
00200          0            0 deny ip from any to 127.0.0.0/8
00300          0            0 deny ip from 127.0.0.0/8 to any
65000 1065996244 576900582440 allow ip from any to any
65535          0            0 deny ip from any to any

Автор: pilson Nov 29 2011, 22:07

покажи man nmap

Автор: I00matolog Nov 29 2011, 22:09

(pilson @ Nov 29 2011, 22:07) Перейти к цитате

покажи man nmap

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

Автор: rayder Nov 30 2011, 10:33

как вариант еще проверять скриптой из nrpe/nagios check_http,


#./check_http <domain>
HTTP OK: HTTP/1.0 302 Found - 635 bytes in 0.100 second response time |time=0.100290s;;;0.000000 size=635B;;;0


#./check_http <domain>
HTTP WARNING: HTTP/1.0 404 Not Found


#./check_http <domain>
Connection refused
HTTP CRITICAL - Unable to open TCP socket


ну и на основе ответа и/или error кода уже выдавать ответ

Автор: smeegul Nov 30 2011, 15:10

Перезапуск упавшего bind-а(для debian):

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: fli Sep 21 2012, 14:12

Не подскажите как сделать зеркалирования одной папки в другую?

Автор: Pilson Sep 21 2012, 14:19

(fli @ Sep 21 2012, 15:12) Перейти к цитате

Не подскажите как сделать зеркалирования одной папки в другую?

rsync -a /source/ /destination/

Автор: fli Sep 21 2012, 14:39

(Pilson @ Sep 21 2012, 15:19) Перейти к цитате

rsync -a /source/ /destination/

Хм, только если удалить файлы из source, в destination они не удаляются.

Автор: Pilson Sep 21 2012, 15:03

(fli @ Sep 21 2012, 15:39) Перейти к цитате

Хм, только если удалить файлы из source, в destination они не удаляются.

man rsync
man rsync | grep delete

Автор: baltazor Sep 21 2012, 16:58

(fli @ Sep 21 2012, 15:39) Перейти к цитате

Хм, только если удалить файлы из source, в destination они не удаляются.


через rsync можно синхронизировать рекурсивно: добавление новых файлов, удаление, обновление сущ. файлов

А так, тут хорошо расписано: http://www.opennet.ru/man.shtml?topic=rsync&category=1&russian=0

Автор: Navern Sep 21 2012, 22:54

Простенький скрипт бэкапа с отправкой на почту

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Pilson Sep 22 2012, 0:24

(Navern @ Sep 21 2012, 23:54) Перейти к цитате

Простенький скрипт бэкапа с отправкой на почту

Ну раз на то пошло - вот непростенький biggrin.gif
Есть два конфига:
1. sys_backup.conf
по одному архиву в одну строку
имя архива, директория, кол-во хранимых бекапов, опции (nocompress или encrypt). Можно комментировать строки.
Пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

2. exclude.conf
содержит список всего что НЕ надо архивировать (исключения).
по одному файлу или вайлдкарду в строке
Пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Если директория - это например уже сжатые архивы, и их нужно просто перенести на бекап сервер - то используется параметр nocompress. Тогда скрипт просто копирует директорию на бекап сервер в таком виде в каком она есть. Если боитесь что по дороге до сервера трафик могут перехватить - ставите параметр encrypt. Используется асинхронное шифрование с помощью gpg через публичный ключ. Расшифровка только через приватный ключ. На данный момент реализовано использование либо шифрования, либо простого переноса директории. В будущем будет вдохновение или необходимость на работе - буду думать как использовать оба параметра одновременно.
Внутри скрипта указывается путь к рабочей директории, куда будут складываться бекапы, путь к конфигам, имя gpg ключа, URL бекап сервера (используется rsync), файл с паролем для бекап сервера (дабы не светить пароль в списке процессов).
Также скрипт умеет дампить mysql (можно отключить - on|off) каждую базу в отдельный файл, архивировать его на лету и шифровать, и лишь конечный результат уже пишется на диск. Т.е. перехватить промежуточный результат не получится. Пароль от mysql также не светится в списке процессов. Он сохранен в конфиге mysql сервера, и на конфиг выставляются владелец root:root и права 600, дабы никто кроме рута не имел к нему доступ.
пример:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Также скрипт устанавливает на свою рабочую директорию пользователя root:root и права 600, дабы никто кроме рута не мог туда добраться.
Некоторые моменты внутри мне очень не нравятся - хочется, можно и нужно сделать элегантней, но пока лениво, да и особо некогда.
Скрипт нужно запускаь от рута, и, например, через крон.

Теперь, собственно - сам скрипт:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Как создавать связку ключей - приватный и публичный - я тут не описывал. Также не описывал как сконфигурировать на сервере и запустить rsync в режиме демона.
Идеи по функционалу приветствуются smile.gif

Автор: tischenkov Nov 21 2012, 20:25

Доброго дня.

Есть написанный скрипт для копирования информации с сайта и сохранения в файл .txt. в данном случае это копирование улиц киева. с сайта http://sezamka.kiev.ua/streets.htm

Написанный скрипт не переходит на следующую страницу.

Пожалуйста, подскажите, как правильно сделать. за ранее благодарен.


for count in seq 1 50; do links -dump "http://sezamka.kiev.ua/streets$count.htm" | grep район -A50 | tail -n10 >> addresses.txt; sleep 3;done

Автор: olexande Nov 23 2012, 10:28

Попробуйте добиться в ручном режиме "грабинга" любой 1 отдельной страницы.
Потом уже сможете запускать скрипт в цикле, обходя все страницы по очереди.

Автор: $w@mp Dec 20 2012, 19:50

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

Машина, на которой выполняется скрипт и роутер - разные устройства . До роутера можно достучатся только по телнету.

Автор: baltazor Dec 20 2012, 20:00

Что то типа:


ping -c2 x.x.x.x >/dev/null

if [ $? -eq 0 ]; then
    echo "ok"
else
    /sbin/reboot
fi

Автор: $w@mp Dec 20 2012, 20:22

(baltazor @ Dec 20 2012, 20:00) Перейти к цитате

Что то типа:


ping -c2 x.x.x.x >/dev/null

if [ $? -eq 0 ]; then
    echo "ok"
else
    /sbin/reboot
fi


Не подходит - машина, на которой выполняется скрипт и роутер - разные устройства . До роутера можно достучатся только по телнету.

Автор: Sintorres Dec 20 2012, 20:26

$w@mp,
Для виндов http://forum.0day.kiev.ua/index.php?s=&showtopic=71198&view=findpost&p=1637235

Автор: $w@mp Dec 20 2012, 20:32

(Sintorres @ Dec 20 2012, 20:26) Перейти к цитате

$w@mp,
Для виндов http://forum.0day.kiev.ua/index.php?s=&showtopic=71198&view=findpost&p=1637235

а для линукса?

Автор: Sintorres Dec 20 2012, 20:45

#!/usr/bin/expect
spawn $env(SHELL)
send -- "telnet 192.168.1.1 23\r"
expect -- "login"
send -- "root\r"
expect -- "Password: "
send -- "Admin\r"
expect -- "#"
send -- "kill -1 `cat /var/run/ppp0.pid`\r"
expect -- "#"

нарыл тут _ttp://www.beta.acorp.ru/forum/viewtopic.php?t=2123&postdays=0&postorder=asc&start=15
тут еще глянь.
http://forum.dlink.ru/viewtopic.php?f=6&t=139290
ПС у меня для виндов есть приблуда, которая пингует и ребутит adsl модем

Автор: Sintorres Dec 20 2012, 21:01

наверное http://anoxy.ru/%D0%9F%D0%B5%D1%80%D0%B5%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-ADSL-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BC%D0%B0-%D0%BF%D1%80%D0%B8-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B5-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD%D0%B0.html оно

Автор: $w@mp Dec 20 2012, 21:31

Спасибо за помощь - все работает clapping.gif

Автор: nerve Feb 1 2013, 12:10

как в одну строчку через пайп сделать svnadmin dump и tar так что бы сразу создавался архив дампа?

Автор: Sera Feb 13 2013, 20:28

Возможно немного с опозданием, но все таки отвечу на вопрос. Есть вот такие варианты решений:

svnadmin dump /var/lib/svn/repositories/repo_name | split -b 700m - .dump.tar.gz

где split -b 700m выпонит нарезку архивов размером по 700Мб
cat dump.tar.gz* | svnadmin load /var/lib/svn/repositories/repo_name


Вариант с gzip:
svnadmin dump /var/lib/svn/repositories/repo_name | gzip -9 > dump.gz


gunzip -c dump.gz | svnadmin load /var/lib/svn/repositories/repo_name

Автор: nerve Feb 14 2013, 9:40

да, с gzip вариант рабочий, а вот с первым я таки не понял

Автор: chagarna Feb 21 2013, 0:16

просьба помочь написать скриптик, последовательность такая:
1) монтируется винт с ext4
2) проходит 1 минута
3) создается папка например 19.03.2013 и в ней подпапки, например 1, 2, 3 и тд
4) с определённых папок копируются данные в эти папки 1 2 3 и тд
5) после окончания копирования проходит 1 минута
6) размонтируется винт

убунта сервак smile.gif решил таким способом бекапить smile.gif только тапками не кидайтесь, пытаюсь сам разобратся, но только пытаюсь..

Автор: nerve Mar 7 2013, 17:17

(Pilson @ Sep 22 2012, 0:24) Перейти к цитате

Идеи по функционалу приветствуются smile.gif

не совсем в тему, но проблема такая:
1) работает, отправляет
NOW=`date +%d%m%y`
mysqldump -u root -p123 db > /root/backup/db.dump
tar czf /root/db$NOW.tar.gz -C /root/backup db.dump
mutt -s "mysql db for $NOW" -a /root/db$NOW.tar.gz -- backup@gmail.com < /root/text.txt

2) работает, отправляет, но gmail не принимает
NOW=`date +%d-%m-%y`
rm -rf /root/backup/*.tar.gz.*
tar cz /etc/mail \
/etc/cron.d /etc/rc.d/init.d /etc/unicorn /etc/yum.repos.d \
/etc/httpd /etc/nginx /etc/sysconfig /etc/ssh \
/etc/fstab /etc/hosts ... | split -d -b 15M - /root/backup/host-$NOW.tar.gz.
mutt -s "host for $NOW part 1" -a /root/backup/host-$NOW.tar.gz.00 -- backup@gmail.com < /root/text.txt
mutt -s "host for $NOW part 2" -a /root/backup/host-$NOW.tar.gz.01 -- backup@gmail.comt < /root/text.txt

2)если делать тоже самое с гзипом - то gmail принимает, но гзип следует по симлинкам в директориях, а это не подходит
gzip -cr /etc/mail \
/etc/cron.d /etc/rc.d/init.d /etc/unicorn /etc/yum.repos.d \
/etc/httpd /etc/nginx /etc/sysconfig /etc/ssh \
/etc/fstab /etc/hosts ... | split -d -b 15M - /root/backup/host-$NOW.gz.
mutt -s "host for $NOW part 1" -a /root/backup/host-$NOW.gz.00 -- backup@gmail.com < /root/text.txt

не пойму, что ему не нравится в tar.gz разбитом сплитом..
хелп!

Автор: loky12 Mar 9 2013, 16:57

(nerve @ Mar 7 2013, 17:17) Перейти к цитате

не пойму, что ему не нравится в tar.gz разбитом сплитом..
хелп!

Насколько помню gmail'у не нравится много расширений попробуйте не дописывать tar.

Автор: nerve Mar 11 2013, 9:27

Yo! чувак, ты гений!!
поменял host-$NOW.tar.gz. на host-$NOW.
и все отправилось/принялось сразу)

Автор: santer Mar 27 2013, 14:03

Вопрос от новичка d.gif
Скрипт запускается каждый час
Например запустился он в 25.03.2013 15:00, нужно что бы он выполнил запрос на получения данных с бд за период времени 25.03.2013 14:00 - 15:00 . Если запустился в 16:00 то выбрать 15:00-16:00 и т.д
Каким способом возможно доставать время из системы и дальше передать в переменную ? dash2.gif
Зарание благодарен O_o.gif

Автор: baltazor Mar 27 2013, 20:13

(santer @ Mar 27 2013, 14:03) Перейти к цитате

Вопрос от новичка d.gif
Скрипт запускается каждый час
Например запустился он в 25.03.2013 15:00, нужно что бы он выполнил запрос на получения данных с бд за период времени 25.03.2013 14:00 - 15:00 . Если запустился в 16:00 то выбрать 15:00-16:00 и т.д
Каким способом возможно доставать время из системы и дальше передать в переменную ? dash2.gif
Зарание благодарен O_o.gif


date +%k-%M - текущее время на сервере

Час назад:
date -d '1 hour ago' +%k

Автор: artem.ultra Sep 10 2013, 15:40

помогите сделать скрипт
есть два текстовых файла 1.txt и 2.txt
надо провести анализ содержимого двух файлов и если есть одинаковые данные во втором файле, то удалить их в первом.
в файлах мейлы клиентов, каждый мейл с новой строки
в первом файлы вся база мейлов, во втором не рабочие мейлы

Автор: Dieselist Sep 10 2013, 16:11

(artem.ultra @ Sep 10 2013, 16:40) Перейти к цитате

помогите сделать скрипт
есть два текстовых файла 1.txt и 2.txt
надо провести анализ содержимого двух файлов и если есть одинаковые данные во втором файле, то удалить их в первом.
в файлах мейлы клиентов, каждый мейл с новой строки
в первом файлы вся база мейлов, во втором не рабочие мейлы


например так:

$ cat mail_cleaner.sh
#!/bin/bash

sort $1 > /tmp/wholebase.lst
sort $2 > /tmp/addresses_to_remove.lst
for mail in `comm /tmp/wholebase.lst /tmp/addresses_to_remove.lst -12`
do
echo "address to remove: $mail"
sed -i "/$mail/d" $1
done


первым аргументом скрипту скармливаем первый файл (полную базу), вторым - базу с не рабочими мейлами

Автор: Pilson Sep 10 2013, 17:28

(Dieselist @ Sep 10 2013, 17:11) Перейти к цитате

например так:

первым аргументом скрипту скармливаем первый файл (полную базу), вторым - базу с не рабочими мейлами

Чего уж тогда просто не читать второй файл построчно и скармливать sed`у эти строки? Найдет совпадение - удалит.

Или для каждой строки из второго файла создать правило для sed, через точку с запятой, и не отдать в конце его sed`у.


И кстати, правильней будет указывать так:
sed -i "/^$mail/d" $1
т.е. поиск строго с начала строки.
Иначе возможен вариант когда во втором файле будет например vasya@mail.com, а в первом - t_vasya@mail.com, и строка удалится, т.к. проверка была не строгая.

Автор: Dieselist Sep 10 2013, 17:48

(Pilson @ Sep 10 2013, 18:28) Перейти к цитате

Чего уж тогда просто не читать второй файл построчно и скармливать sed`у эти строки? Найдет совпадение - удалит. Или для каждой строки из второго файла создать правило для sed, через точку с запятой, и не отдать в конце его sed`у.


первое что пришло в голову pardon.gif

(Pilson @ Sep 10 2013, 18:28) Перейти к цитате

И кстати, правильней будет указывать так:
sed -i "/^$mail/d" $1
т.е. поиск строго с начала строки.
Иначе возможен вариант когда во втором файле будет например vasya@mail.com, а в первом - t_vasya@mail.com, и строка удалится, т.к. проверка была не строгая.


согласен smile.gif только если уж пошла такая жара - надо так:
sed -i "/^$mail$/d" $1
а то вдруг у нас есть и vasya@mail.com и vasya@mail.com.ua wink.gif

Автор: artem.ultra Sep 10 2013, 20:12

ох ребята вас понесло)))
спасибо!
завтра утрячком попробую)

Автор: artem.ultra Sep 10 2013, 21:47

уже пробую!

cat cleaner_mail.sh
#!/bin/bash

sort $1 > /root/1.txt
sort $2 > /root/2.txt
for mail in `comm /root/1.txt /root/2.txt -12`
do
echo "address to remove: $mail"
sed -i "/^$mail$/d" $1

файлик /root/1.txt становится пустым

в консоли скрипт не заканчивается приходиться ложить его руками sad.gif

Автор: Dieselist Sep 10 2013, 21:56

(artem.ultra @ Sep 10 2013, 22:47) Перейти к цитате

уже пробую!
cat cleaner_mail.sh
#!/bin/bash

sort $1 > /root/1.txt
sort $2 > /root/2.txt
for mail in `comm /root/1.txt /root/2.txt -12`
do
echo "address to remove: $mail"
sed -i "/^$mail$/d" $1

файлик /root/1.txt становится пустым

в консоли скрипт не заканчивается приходиться ложить его руками sad.gif


Потому что сам скрипт править не надо было. Оставь скрипт как есть в моем варианте (разве что с правкой предложенной товарщем Pilson, если мейлы и правда могут так совпадать), и вызови скрипт из консоли таким образом:
# cleaner_mail.sh /root/1.txt /root/2.txt

Если что по прежнему непонятно/ не работает - пиши в ПМ, чтоб не засорять тему.

Автор: Freestyler Sep 11 2013, 9:14

Зачем для такой простой задачи скрипт?
grep -iv -f 2.txt 1.txt > out.txt
файл out.txt будет содержать вычтенную информацию с файла 1.txt по списку в файле 2.txt

Автор: nerve Sep 11 2013, 16:53

$ cat mail1.txt
123@mail.ru
1123@mail.ru
123@mail.sru
12234@mail.sru
$ cat mail2.txt
123@mail.ru
123@mail.sru
$ sudo grep -iv -f mail2.txt mail1.txt > mail3.txt && cat mail3.txt
12234@mail.sru

Автор: Dieselist Sep 11 2013, 17:14

(nerve @ Sep 11 2013, 17:53) Перейти к цитате

$ cat mail1.txt
123@mail.ru
1123@mail.ru
123@mail.sru
12234@mail.sru
$ cat mail2.txt
123@mail.ru
123@mail.sru
$ sudo grep -iv -f mail2.txt mail1.txt > mail3.txt && cat mail3.txt
12234@mail.sru



$ grep -ivw -f mail2.txt mail1.txt
1123@mail.ru
12234@mail.sru

Автор: nerve Sep 23 2013, 10:03

Функция spentdaily должна выполняться с вторника по субботу, а функция spentweekly только в понедельник. правильно ли я написал условие проверки?

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Автор: Dieselist Dec 31 2013, 16:30

(nerve @ Sep 23 2013, 10:03) Перейти к цитате

Функция spentdaily должна выполняться с вторника по субботу, а функция spentweekly только в понедельник. правильно ли я написал условие проверки?
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «



Не лучше ли так?


DATE=$(date +%u)
case $DATE in
[1]) spentweekly;;
[2-6]) spentdaily;;
esac

Автор: fli Aug 18 2014, 20:01

Задача: засинкать директорию, удалив содержимое source dir.
rsync -av --remove-source-files src/ dest/
Но при этом зашифровать все файлы gpg.
Подскажите, в каком направлении двигаться?

UPD. Подсказали:
find src/ -type f -exec gpg .... {} \;
find src/ -type f ! -name '*.gpg' -exec rm {} \;

Автор: Pilson Aug 18 2014, 20:07

(fli @ Aug 18 2014, 21:01) Перейти к цитате

Задача: засинкать директорию, удалив содержимое source dir.
rsync -av --remove-source-files src/ dest/
Но при этом зашифровать все файлы gpg.
Подскажите, в каком направлении двигаться?

Эммм... Зашифровать потом перенести/удалить?

Автор: artem.ultra Sep 30 2014, 11:50

пильнул скрипт smile.gif если можно так назвать))

#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id

и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?

Автор: mak_v_ Sep 30 2014, 15:01

(artem.ultra @ Sep 30 2014, 12:50) Перейти к цитате

пильнул скрипт smile.gif если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id

и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?


&&  sleep 40 && mail -s "что копирование завершено" user@yourmaildomain.com

Автор: santer Sep 30 2014, 15:14

(artem.ultra @ Sep 30 2014, 12:50) Перейти к цитате

пильнул скрипт smile.gif если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id

и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?

#!/bin/bash
SUBJECT = " "
EMAIL = " "
EMAILMESSAGE = "/tmp/emailmessage.txt"
echo "текст" >> $EMAILMESSAGE
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && sleep 40 &&
virsh start vm_id && /bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE

http://postfix.state-of-mind.de/patrick.koetter/smtpauth/postfix_configuration.html - Как настроить отправку почту через смтп. Это нужно для работы mail -s
https://rtcamp.com/tutorials/linux/ubuntu-postfix-gmail-smtp/ гугловский смтп

Автор: mak_v_ Sep 30 2014, 16:09

santer, мне бы пременных побольше, побольше.... girl_cray2.gif

Автор: santer Sep 30 2014, 16:44

(mak_v_ @ Sep 30 2014, 17:09) Перейти к цитате

santer, мне бы пременных побольше, побольше.... girl_cray2.gif

Простите, это просто было под рукой d.gif
echo "This is the message body" | mail -s "This is the subject" mail@mail

Автор: Fill Oct 1 2014, 1:50

Подскажите пжлст.
Есть конструкция вида


... some code was here...

check_proc() {
  pgrep -u $USER -f $PGREP_STRING >/dev/null
}
killproc() {
  pkill -u $USER -f $PGREP_STRING
}

check_proc
  if [ $? -eq 0 ]; then
    echo "$NAME launched, killing process. Wait a bit..."
    killproc
    until [ $? -ne 0 ]; do
      sleep 1
      echo "Rechecking..."
      check_proc
    done
    check_proc
    if [ $? -eq 0 ]; then
      log_failure_msg "Error stopping $NAME."
      exit -1
    else
      log_success_msg "Stopped $NAME."
    fi
  else
    log_failure_msg "$NAME is not running or you don't have permission to stop it"
  fi


Нужно после, например, сотой итерации until валить скрипт с ошибкой или пользовать pkill -9 java.
Как добавить?

Автор: mak_v_ Oct 1 2014, 9:42

(Fill @ Oct 1 2014, 2:50) Перейти к цитате

Нужно после, например, сотой итерации until валить скрипт с ошибкой или пользовать pkill -9 java.
Как добавить?

Вставить в конец цикла счетчик

Автор: protrue Oct 1 2014, 9:49

(Fill @ Oct 1 2014, 1:50) Перейти к цитате

Подскажите пжлст.


Стандартная конструкция с инит скрипта для SQUID:

SQUID_PIDFILE_TIMEOUT=${SQUID_PIDFILE_TIMEOUT:-20}
SQUID_SHUTDOWN_TIMEOUT=${SQUID_SHUTDOWN_TIMEOUT:-100}

start() {
        # Check if $SQUID_PIDFILE_DIR exists and if not, lets create it and give squid permissions.
        if [ ! -d $SQUID_PIDFILE_DIR ]; then mkdir $SQUID_PIDFILE_DIR; chown -R $SQUID_USER.$SQUID_DIR $SQUID_PIDFILE_DIR; fi
        probe

        parse=`$SQUID -k parse -f $SQUID_CONF 2>&1`
        RETVAL=$?
        if [ $RETVAL -ne 0 ]; then
                echo -n $"Starting $prog: "
                echo_failure
                echo
                echo "$parse"
                return 1
        fi
        for adir in $CACHE_SWAP; do
                if [ ! -d $adir/00 ]; then
                        echo -n "init_cache_dir $adir... "
                        $SQUID -z -F -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
                fi
        done
        echo -n $"Starting $prog: "
        $SQUID $SQUID_OPTS -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
                timeout=0;
                while :; do
                        [ ! -f /var/run/squid.pid ] || break
                        if [ $timeout -ge $SQUID_PIDFILE_TIMEOUT ]; then
                                RETVAL=1
                                break
                        fi
                        sleep 1 && echo -n "."
                        timeout=$((timeout+1))
                done
        fi
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID
        [ $RETVAL -eq 0 ] && echo_success
        [ $RETVAL -ne 0 ] && echo_failure
        echo
        return $RETVAL
}

stop() {
        echo -n $"Stopping $prog: "
        $SQUID -k check -f $SQUID_CONF >> /var/log/squid/squid.out 2>&1
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
                $SQUID -k shutdown -f $SQUID_CONF &
                rm -f /var/lock/subsys/$SQUID
                timeout=0
                while :; do
                        [ -f /var/run/squid.pid ] || break
                        if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
                                echo
                                return 1
                        fi
                        sleep 2 && echo -n "."
                        timeout=$((timeout+2))
                done
                echo_success
                echo
        else
                echo_failure
                if [ ! -e /var/lock/subsys/$SQUID ]; then
                        RETVAL=0
                fi
                echo
        fi
        rm -rf $SQUID_PIDFILE_DIR/*
        return $RETVAL
}


(artem.ultra @ Sep 30 2014, 11:50) Перейти к цитате

пильнул скрипт smile.gif если можно так назвать))
#!/bin/bash
virsh shutdown vm_id && cp /home/vm-pool/vm_id.img /home/vm_id.img-`date +%d-%B-%Y` && virsh start vm_id

и вот нужно сделать паузу после virsh shutdown vm_id, 40сек и после virsh start vm_id отправить мейл, о том что копирование завершено.
подскажет кто?

Если не настраивать релей локально то можно почитать о .msmtprc .muttrc

Автор: Fill Oct 1 2014, 14:06

protrue, это я понимаю. Не могу врубиться, как в цикл until всунуть две переменные, чтоб цикл вертелся, пока первая не true. Если сунуть что-то типа until : ; то из цикла вылетит сразу.

Автор: Pilson Oct 1 2014, 14:32

(Fill @ Oct 1 2014, 15:06) Перейти к цитате

protrue, это я понимаю. Не могу врубиться, как в цикл until всунуть две переменные, чтоб цикл вертелся, пока первая не true. Если сунуть что-то типа until : ; то из цикла вылетит сразу.

Зачем until для этого?
kill -15 PID
sleep 10
kill -9 PID

по-русски:
послали процессу стандартный сигнал завершения.
подождали 10 секунд
прибили процесс жестко.

Автор: Fill Oct 1 2014, 14:50

Pilson, затем, что инит-скрипт для кучи разных java-процессов и все ведут себя по-разному + там еще есть кусок кода, который срет в почту при ошибке.

Автор: Pilson Oct 1 2014, 15:13

Так может стоит каждый процесс разнести по своим скриптам?

Автор: Fill Oct 1 2014, 15:30

Pilson, не получится в силу определенных ограничений.
PID не используется, используется pkill $PROCESS_NAME
Пока пробую обойтись конструкцией вида

    (( count = 5 ))
    while [[ $count -ne 0 ]]; do
          echo "Rechecking... $count tries left"
          check_proc
          if [[ $? -eq 0 ]]; then
                (( count = 1 ))
          echo "Failed to stop gracefully, killing process..."
         pkill -9 -u $USER -f $PGREP_STRING
        fi
                (( count = $count - 1 ))
        echo "$? $count"
        sleep 1

Еще причёсываю.

Автор: Fill Oct 1 2014, 17:35

Причесал d.gif

(( count = 60 ))
    # Make sure it's dead before we return
    until [ $kill -ne 0 ]; do
      sleep 1
      echo "$count tries left before comfirmed kill, rechecking..."
      check_proc
      kill=$?
        if [[ $count -eq 0 ]]; then
        echo "Failed to stop $NAME gracefully, trying to kill it with fire..."
        pkill -9 -u $USER -f $PGREP_STRING
        rm -f $HOME/RUNNING_PID
        exit 0
        fi
     (( count = $count - 1 ))
    done

Автор: Fill Oct 1 2014, 18:43

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

Автор: Pilson Oct 2 2014, 12:34

(Fill @ Oct 1 2014, 19:43) Перейти к цитате

Еще задачка, но извратная.
Нужен интерактивный запрос параметра (читай - пароля) на выполнение скрипта.



echo -n "Ты кто такой? "
read item
case "$item" in
    babaka) echo "Превед, продолжаем..."
;;

    *) echo "Давай досвидания..."
        exit 10
;;

esac

echo "Продолжение."

biggrin.gif

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

А вот если сделать это через подсчет любого хеша, например md5, то узнать правильный пароль можно только брутфорсом.
Пример (пароль тот же - babaka):
echo -n "Ты кто такой? "

read item

if [ $(echo -n $item | md5sum | sed 's/\s.*//g') != "500063f4fd2c78cbcfc34f39a66e7273" ]; then
    echo "Давай досвидания..."
    exit 10
fi

echo "Превед."

Автор: Fill Oct 2 2014, 12:49

Pilson, я думал через сравнение сделать [ $a -eq $b ], где $a берется из консоли, а $b запрятать поглубже.
Нужна просто защита от дурака, чтоб случайно не натравили скрипт на продакшн.

Автор: Pilson Oct 2 2014, 12:59

(Fill @ Oct 2 2014, 13:49) Перейти к цитате

Pilson, я думал через сравнение сделать [ $a -eq $b ], где $a берется из консоли, а $b запрятать поглубже.
Нужна просто защита от дурака, чтоб случайно не натравили скрипт на продакшн.

А чем тебя md5sum не устраивает в качестве спрятать поглубже?

Впрочем что первый вариант, что второй, делают по факту одно и то же - сравнивают что-то с чем-то.

Если уж совсем хочется тупо а = б - на:
echo -n "Ты кто такой? "

read a
b="babaka"

if [ $a != $b ]; then
    echo "Давай досвидания..."
    exit 10
fi

echo "Превед."

Автор: Fill Oct 2 2014, 13:01

Pilson, устраинвает, пасиба, но это слишком далеко d.gif Все равно будет видно введенный параметр, даже если его захэшировать.

Автор: nerve Jan 14 2015, 17:13

на работе поставили точку доступа Интертелеком.
на случай падения основного канала есть маленький скриптик, который сидит в кроне и каждые 5 минут проверяет.

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: sahasaha Jun 2 2015, 14:39

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

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Только не пойму сработает ли, если по ID не будет ничего.

ЗЫ. И как лучше, так, или всё-так запихнуть в sh

Автор: lega150493 Jun 4 2015, 13:26

Привет всем. Может кто еще в хостинг компании работает.
Скрипт поиска спамеров на cPanel:

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: Pilson Jun 4 2015, 23:59

То же самое, но короче и менее прожорливей:

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

Автор: artem.ultra Dec 12 2016, 13:35

товарищи! выручайте smile.gif
есть такое вот:
iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d'
с выводом:
sda
и вот так: iostat -d | awk '{print $1}'
Linux
Device:
sda
нужно запилить на одном сервере, но там хранилище немного другое (hp)

iostat -d | awk '{print $1}'
Linux
Device:
cciss/c0d0
cciss/c1d0

собственно iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d' дает пустой вывод
помогите плз blush.gif

Автор: Koka-ftp Dec 12 2016, 14:22

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

как-то так smile.gif
iostat -d | awk '{print $1}' | grep cciss | sed -e 's/cciss\///'

или так)
iostat -d | awk '/cciss/ {print $1}' | sed -e 's/cciss\///'


Автор: artem.ultra Dec 12 2016, 14:25

Koka-ftp
поехало! пасиб!

Автор: nerve Dec 19 2016, 13:28

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

output
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

desired output
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «

ps. maybe fixed
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Автор: xfiles May 24 2019, 16:45

Проверяем корректно ли работает домен. Чекаем serial, ptr, dns propagation, status, current ns, ttl сразу одним махом. Когда работаешь в хостинге, и каждый день проверять по 1-20 доменов, скрипт сильно оптимизирует рабочее время.

Скрин:

» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «


Скрипт:
» Нажмите, чтобы показать спойлер - нажмите опять, чтобы скрыть... «




Invision Power Board
© Invision Power Services