Разное
Запуск скрипта каждые 1,5, 10 или 30 секунд
#!/bin/sh while true; do ls -al >> /home/user/dir.list sleep 10 done
Очистить конфиг файл от комментариев
cat squid.conf.orig | egrep "^[^#]" > squid.conf
Скрипт меняет кодировку всех файлов в текущей директории с cp1251 на UTF-8:
#/bin/sh dir=. for i in $dir/* do if [ -f $i ] then cp $i $i.utf iconv -f cp1251 -t utf-8 $i -o $i.utf mv $i.utf $i fi done
Скрипт меняет строку charset=windows-1251 на charset=UTF-8 в каждом файле текущей директории:
#bin/sh dir=. for i in $dir/* do if [ -f $i ] then cp $i $i.ed sed 's/charset=windows-1251/charset=UTF-8/g' $i > $i.ed mv $i.ed $i fi done
Очищаем все файлы в каталоге и подкаталогах:
#!/bin/bash path='/var/garbage' for i in `ls $path`;do if [ ! -d $path$i ] ;then echo '' > $path$i; fi if [ -d $path$i ];then for s in `ls $path$i`;do echo '' > $path$i'/'$s; done fi done
Посчитать количество файлов в каталогах из $PATH и вывести на экран, отсортировав по количеству файлов:
#!/bin/bash LANG=C for i in `echo $PATH | sed -n s/\:/\ /gp`; do echo -ne "$i:\t"; ls -1R $i/ 2>/dev/null | grep -vE 'total|^$|\:$' | wc -l; done | sort -k 2nr
Скрипт для подбора кодировки текстового файла:
#!/bin/sh ENC=KOI8-R # в какую кодировку переводить FILE=/tmp/file.txt # файл for i in `iconv -l | sed -e 1,5d -e 's/\/\///g'`; do echo -e "\n\n-----\n$i\n-----\n"; iconv -c -f $i -t $ENC $FILE read; done
Показать 5 ip-адресов, с которых установлено больше всего коннектов на 25-й порт на сервер.
Вместо 1.2.3.4 подставьте ваш ip-адрес. Полезно для вылавливания спамеров.
netstat -antp|grep "1.2.3.4:25" |awk '{a=$5;split (a,b,":");g[b[1]]++}END{for (h in g) print g[h]" "h}'|sort -n|tail -5
Скрипт для очистки очереди Qmail от спама.
Путь /var/qmail/ при необходимости заменяем на свой путь к qmail-у.
Длинную строчку find … при необходимости модифицируем, с учётом специфики спама на вашем сервере
#!/bin/bash TS=`date +%d.%m.%Y.%s` find /var/qmail/queue/mess/ -type f -exec grep -lEi 'failure notice|ssbhomes.com|Unknown Recipient|WATCHDOG|nlarge your|Returned mail|The Best For Your Health|Hot Se with Viagra|Pharmacy for Everyone|Delivery Status Notification|failure notice|Mailer-daemon@|herbal|agra|ialis|vitra|porn|xgenconsulting.com|postmaster@|penis|Home Depot gift card|Your Loan Pre-Approval|Your Mortgage Pre-Approval|Happy NW|Time to make it bigger!|Do away with everything you are indebted for without paying an other cent|Size, Does It Really Matter!?!|Make it larger!|Hey MAN!|Ink & Toner - 2007 Bonanza Super Sale|Time to make it larger NOW!' {} \; >> /tmp/76K_q.${TS} /var/qmail/bin/qmail-qstat /etc/init.d/qmail stop sleep 5 /etc/init.d/qmail stop sleep 5 cat /tmp/76K_q.${TS} | while read fn do rm -f -- ${fn} echo ${fn} | sed "s/mess/local/g" | xargs rm -f -- echo ${fn} | sed "s/mess/remote/g" | xargs rm -f -- echo ${fn} | sed "s/mess/info/g" | xargs rm -f -- echo ${fn} | sed "s/mess/todo/g" | xargs rm -f -- short_fn=`echo ${fn} | sed 's#^.*/##'` rm -f -- /var/qmail/queue/bounce/${short_fn} /var/qmail/queue/intd/${short_fn} /var/qmail/queue/todo/${short_fn} echo ${fn} done /etc/init.d/qmail start /var/qmail/bin/qmail-qstat
Простой и короткий, но полезный скрипт, меняющий в директории и всех поддиректориях права доступа к файлам в зависимости от их расширения.
В данном примере файлы с расширением php и tcl получат права доступа 755, а все остальные — 655.
#!/bin/bash find . -name \*.* -exec chmod 655 {} \; find . -name \*.php -exec chmod 755 {} \; find . -name \*.tcl -exec chmod 755 {} \;
Создание backup’ов
#!/bin/sh # Описываем базовые директории BACKUP="/srv/backup/" TEMP="/srv/backup/temp" #Папка удаляется после выполнения скрипта ! PREFIX=`hostname -s`_`date +%d.%m.%y-%H:%M` # Описываем папки backupов # Файлы системы ETC="$TEMP/etc/" # Файлы сервера WWW="$TEMP/www/" VMAIL="$TEMP/vmail/" MYSQL="$TEMP/mysql/" # Создаем необходимые папки mkdir $TEMP #mkdir $ETC mkdir $WWW mkdir $VMAIL mkdir $MYSQL # Копируем файлы в созданые папки #cp -r /etc/ $ETC #cp -r /srv/www/www.YourDomain.ru/ $WWW #cp -r /srv/www/mail.YourDomain.ru/ $WWW #cp -r /srv/www/workflow.YourDomain.ru/ $WWW #cp -r /srv/vmail/* $VMAIL # Бэкапим mysql базы mysqldump --user=backup --host=localhost --password=YourPassword mail > $MYSQL/mail.sql mysqldump --user=backup --host=localhost --password=YourPassword webmail > $MYSQL/webmail.sql # Переходим в каталог с копиями cd $TEMP # Создаем архив tar -czvf /srv/backup/data/$PREFIX.tar.gz * # Очищаем папку temp rm -rf $TEMP
Еще один вариант:
#!/bin/sh PROJNAME="mail" DBNAME="mail" #Имя базы данных для резервного копирования DBFILENAME="mail" #Имя дампа базы данных ARFILENAME="mail" #Имя архива с файлами HOST="localhost" #Хост MySQL USER="mail" #Имя пользователя базы данных PASSWD="123" #Пароль от базы данных DATADIR="/home/mail/back/" #Путь к каталогу где будут храниться резервные копии SRCFILES="/home/mail/file/" #Путь к каталогу файлов для архивирования PREFIX= `date +%F` #Префикс по дате для структурирования резервных копий #start backup echo "[--------------------------------[`date +%F--%H-%M`]--------------------------------]" echo "[----------][`date +%F--%H-%M`] Run the backup script..." mkdir $DATADIR/$PREFIX 2> /dev/null echo "[++--------][`date +%F--%H-%M`] Generate a database backup..." #MySQL dump mysqldump --user=$USER --host=$HOST --password=$PASSWD $DBNAME > $DATADIR/$PREFIX/$DBFILENAME-`date +%F--%H-%M`.sql if [[ $? -gt 0 ]];then echo "[++--------][`date +%F--%H-%M`] Aborted. Generate database backup failed." exit 1 fi echo "[++++------][`date +%F--%H-%M`] Backup database [$DBNAME] - successfull." echo "[++++++----][`date +%F--%H-%M`] Copy the source code project [$PROJNAME]..." #Src dump tar -czpf $DATADIR/$PREFIX/$ARFILENAME-`date +%F--%H-%M`.tar.gz $SRCFILES 2> /dev/null if [[ $? -gt 0 ]];then echo "[++++++----][`date +%F--%H-%M`] Aborted. Copying the source code failed." exit 1 fi echo "[++++++++--][`date +%F--%H-%M`] Copy the source code project [$PROJNAME] successfull." echo "[+++++++++-][`date +%F--%H-%M`] Stat datadir space (USED): `du -h $DATADIR | tail -n1`" echo "[+++++++++-][`date +%F--%H-%M`] Free HDD space: `df -h /home|tail -n1|awk '{print $4}'`" echo "[++++++++++][`date +%F--%H-%M`] All operations completed successfully!" exit 0
Скрипт, меняющий кодировку с файле.
#!/bin/sh # Получаем имя исходного файла SRCFILENAME=`zenity --title="Выберите исходный файл" --file-selection` # Если имя файла не пустое идём дальше if (test ${SRCFILENAME}1 != "1") then # Получаем имя конечного файла DSTFILENAME=`zenity --title="Выберите конечный файл" --file-selection --save` # Если имя файла не пустое идём дальше if (test ${DSTFILENAME}1 != "1") then # Если конечный и начальный файл один и тот же - # Завершаем скрипт с сообщением об ошибке if (test ${SRCFILENAME} = ${DSTFILENAME}) then zenity --error --text="Нельзя перекодировать файл сам в себя!" --title="Ошибка" exit 1 fi # Получаем список доступных кодировок ENCODINGLIST=`iconv -l | sed 's/\/\///'| awk '{ print $1 " " $1}'|sort` # Запрашиваем кодировку исходного файла ENCODING=`zenity --list --text="Выберите кодировку:" --column="Кодировка" ${ENCODINGLIST}` # Если кодировка выбрана - перекодируем файл и сообщаем об # успешном завершении скрипта if (test ${ENCODING}1 != "1") then iconv -f ${ENCODING} -t utf-8 ${SRCFILENAME} > ${DSTFILENAME} zenity --info --text="Перекодирование выполнено!" fi fi fi
Переименование русских имен файлов в транслит:
#!/bin/sh # this script has been written by Eddy # # rename_translit --- переводит русские имена файлов в транслит # # Создан 22-го Май 2006 года в 9:24 # for Name in `ls -1` do Newname=`echo "$Name"|sed -e \ "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\ -e "s/ц/tz/g" \ -e "s/ш/sh/g" \ -e "s/щ/sch/g" \ -e "s/ж/zh/g" \ -e "s/ч/ch/g" \ -e "s/ю/yu/g" \ -e "s/я/ya/g" \ -e "s/Ц/TZ/g" \ -e "s/Ш/SH/g" \ -e "s/Щ/SCH/g" \ -e "s/Ж/ZH/g" \ -e "s/Ч/CH/g" \ -e "s/Ю/YU/g" \ -e "s/Я/YA/g"` if [ "$Name" != "$Newname" ]; then mv "$Name" "$Newname" echo -e "$Name -> $Newname\r\c" fi if [ -d "$Newname" ]; then cd "$Newname" echo -e "\n\nDiving into $Newname" rename_translit cd ../ fi done
Раскраска bash консоли
if [ -n "${SSH_TTY}"] then export PS1='\[\033[01;32m\][\u@\h]\[\033[01;34m\]\w\$>\[\033[00m\]' elif [ ${EUID} == 0 ]; then export PS1='\[\033[01;31m\][\u@\h]\[\033[01;34m\]\w\$>\[\033[00m\]' else export PS1='\[\033[01;35m\][\u@\h]\[\033[01;34m\]\w\$>\[\033[00m\]' fi
Bash — проверки
Проверка UID
UID_ROOT=0 if [ "$UID" -ne "$UID_ROOT" ] then echo "Для работы требуются права root" exit 1 fi
Проверка входящих параметров
Проверка на существование
if [ -z "$1" ] then echo "Значение не задано" exit 1 fi
Обязательно присутствие двух параметров
if [[ -z "$1" || -z "$2" ]] then echo "Значение не задано" exit 1 fi
Проверки файлов и каталогов
Проверка на существование директории
if [ ! -d "$DIR" ]; then echo "Директория не верна" exit 1 fi
Проверка на существование файла
if [ ! -e "$FILE" ]; then echo "Файл не найден" exit 1 fi
Директория существует и доступна для записи
if ! [[ -d "$FTPDIR" && -w "$FTPDIR" ]]; then echo "Директория не верна или отсутствуют права для записи" exit 1 fi
Прочее
Проверка существования файла, а также есть есть права на чтение и выполнение.
Если условия не выполняются, то выполнится exit
test -x /usr/sbin/ || exit 1
Проверка существования пользователя
grep "^$username:" /etc/passwd >/dev/null if [ $? -ne 0 ]; then echo "Пользователь не найден" exit 1 fi
Bash-комманды
cat << EOF > $filename line1 line2 line3 EOF
Find
find . -type f ! -perm -444 # Найти файлы с правами 0444 find . -type d ! -perm -111 # Найти директории с правами 0111 find /home/user/ -cmin 10 -print # Файлы созданные или модифицированные за последние 10 минут. find . -name '*.[ch]' | xargs grep -E 'expr' # Найти 'expr' в текущей директории. find / -name "*.core" | xargs rm # Найти и удалить аварийные дампы(так-же можно искать core.*). find / -name "*.core" -print -exec rm {} \; # Другой сиснтаксис # Найти все графические файлы и создать архив, iname -регистронезависимо. -r -добавить find . \( -iname "*.png" -o -iname "*.jpg" \) -print -exec tar -rf images.tar {} \; find . -type f -name "*.txt" ! -name README.txt -print # Исключая файлы README.txt find /var/ -size +10M -exec ls -lh {} \; # Найти файлы больше 10 MB find /var/ -size +10M -ls # То-же, что и выше find . -size +10M -size -50M -print find /usr/ports/ -name work -type d -print -exec rm -rf {} \; # Очистить порты # Найти файлы, принадлежащие определенному пользователю и с определенными правами find / -type f -user root -perm -4000 -exec ls -l {} \;
Разное
which command # Показывает полный путь к файлу команды time command # Показывает время выполнения команды time cat # Использовать команду time как секундомер. Ctrl-c для остановки set | grep $USER # Просмотр текущего окружения cal # Показать календарь на текущий месяц date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] date 10022155 # Установить дату и время whatis grep # Показать короткую справку по команде whereis java # Найти путь и стандартную директорию для "слова" setenv varname value # Установить переменную окружения varname в значение value (csh/tcsh) export varname="value" # Установить переменную окружения varname в значение value (sh/ksh/bash) pwd # Печать текущей директории mkdir -p /path/to/dir # Создать директорию, включая родительскую, не выдавать ошибку если такая существует. mkdir -p project/{bin,src,obj,doc/{html,man,pdf},debug/some/more/dirs} rmdir /path/to/dir # Удалить директорию. rm -rf /path/to/dir # Удалить директорию с содержимым (принудительно). cp -la /dir1 /dir2 # Вместо копирования отобразить одну директорию в другую с помощью жесткой ссылки cp -lpR /dir1 /dir2 # То-же во FreeBSD cp unixtoolbox.xhtml{,.bak} # Быстрый вариант скопировать файл с новым расширением mv /dir1 /dir2 # Переименовать директорию ls -1 # Листинг файлов, по одному в строке history | tail -50 # Показать последние 50 использовавшихся команд
Работа с IPtables.
Поднимаем NAT
iptables -t nat -A POSTROUTING -o [WAN IF] -j SNAT –to-source [WAN IP]
- WAN IF — внешний интерфейс
- WAN IP — внешний IP адрес
Пример:
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 10.0.0.238
Проброс порта
iptables -t nat -A PREROUTING -p tcp -d [WAN IP] –dport [PUBLIC PORT] -j DNAT –to-destination [PRIVATE IP]:[PRIVATE PORT]
- WAN IP — внешний IP адрес
- PUBLIC PORT — публичный порт
- PRIVATE IP — IP адрес машины на которую надо пробросить порт
- PRIVATE PORT — собственно сам порт на локальной машине
Пример:
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.238 --dport 25 -j DNAT --to-destination 192.168.237.100:25
Открытие порта
iptables -A INPUT -p [PROTOCOL] –dport [PUBLIC PORT] -j ACCEPT
- PROTOCOL — сетевой протокол (tcp, udp, gre и т.д.)
- PUBLIC PORT — порт который необходимо открыть
Пример:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Запретить доступ к сайту
iptables -A FORWARD -p tcp -s odnoklassniki.ru -j DROP
Редирект всего трафика на определенный порт:
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT
“заворачиваем” все запросы на 80 порт из локалки на порт прокси в данном случае 3128:
iptables -t nat -A PREROUTING -i eth2 -d ! 172.16.0.0/24 -p tcp -m multiport --dport 80 -j DNAT --to 172.16.0.1:3128