Разное
Запуск скрипта каждые 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