Рубрики
OS

Linux команды и скрипты

Разное

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