Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Общий по Linux (http://forum.oszone.net/forumdisplay.php?f=9)
-   -   Маленькие скрипты на каждый день (http://forum.oszone.net/showthread.php?t=77724)

[mzd] 17-01-2007 09:06 537191

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

Скрипт меняет кодировку всех файлов в текущей директории с 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

Способ использования: скопировать текст, создать новый текстовый файл в любом текстовом редакторе, вставить скопированный текст, сохранить под именем, например, script.sh, затем в консоли дать команду
Код:

chmod +rx script.sh
Запуск скрипта на исполнение выполняется из каталога со скриптом командой
Код:

./script.sh

_Flame_ 07-04-2007 15:05 571296

А как ети скрипты вообще применять? Можно по-подробнее только :)
(MaNDRIVa)

fossil 25-04-2007 15:05 579384

Очищаем все файлы в каталоге и подкаталогах.
Код:

#!/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


BuGfiX 02-05-2007 02:07 581953

Не буду говорить что я великий и могучий скриптописатель... Приятель попросил сделать задание на лабу - посчитать количество файлов в каталогах из $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


BuGfiX 22-05-2007 12:39 589626

Скрипт для подбора кодировки текстового файла:

Код:

#!/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


[mzd] 07-06-2007 10:19 596288

Простой скрипт для отслеживания сайтов (англ. яз.)
Сам скрипт:
Код:

#!/bin/sh
# webtrack.sh

RECIP=user@host      # where notifications get sent
DUMPCMD="w3m -dump"  # text browser invocation


for url in $(cat list.txt); do

    md5=$(echo "$url" | md5sum | cut -d\  -f 1)

    touch $md5.txt

    $DUMPCMD "$url" > tmp.txt

    if diff $md5.txt tmp.txt >/dev/null; then
        : #echo no changes
    else
        : #echo "changes: "
        diff -Napu $md5.txt tmp.txt > diff.txt
        mv tmp.txt $md5.txt
        mail -s "Changes in $url found." "$RECIP" <<eof
The diff has $(wc -l diff.txt | cut -d\  -f 1) lines.

Changes are below.

$(cat diff.txt)
eof

    fi

done

Вспомогательный скрипт:
Код:

#!/bin/sh
# ww-add.sh

# if the list is local
echo '$1' >> /path/to/list.txt

# if the list is remote
ssh user@host "echo '$1' >> /path/to/list.txt"


debug 01-08-2007 16:12 621371

Показать 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


alive_corpse 13-08-2007 22:43 627171

Простой и короткий, но полезный скрипт, меняющий в директории и всех поддиректориях права доступа к файлам в зависимости от их расширения. В данном примере файлы с расширением php и tcl получат права доступа 755, а все остальные - 655.
Код:

#!/bin/bash
find . -name \*.* -exec chmod 655 {} \;
find . -name \*.php -exec chmod 755 {} \;
find . -name \*.tcl -exec chmod 755 {} \;


voler 18-02-2008 21:16 743382

Скрипт для создания бэкапов.
Код:

#!/bin/bash

DATE=`date '+%F'`
BACKUP="/Backup/office_$DATE.sql"
mysqldump -uuser -hlocalhost office > $BACKUP

Бэкапы делаю, на отдельный жесткий диск.

voler 21-02-2008 14:35 745465

Вот еще полезный, скрипт на perl для отправки сообщения на вашу почту, возможности использования актуальны.
читать дальше »

Код:

#!/usr/bin/perl -w
use Net::SMTP; #модуль для отправки
$smtp = Net::SMTP->new('smtp.masterhost.ru'); # сервер отправки
$smtp->mail('от кого');
$smtp->to('кому');
$smtp->data();
$smtp->auth("имя","пароль");
$smtp->datasend("From: <имя\@домен>\n");
#$smtp->datasend("To: <имя\@домен>\n");
$smtp->datasend("Subject:Ваша тема\n");
$smtp->datasend("Content-Type: text/plain; charset=windows-1251\n");
$smtp->datasend("Content-Transfer-Encoding: 8bit\n");
$smtp->datasend("\n");
$smtp->datasend("ваш текст\n");
$smtp->dataend();
$smtp->quit;



Еще можно добавить возможность прикреплять файл. Но пока не нашел, не селен в perl.
Если есть гуру по правьте.

Arrest 25-02-2008 01:02 747703

Генерим несколько паролей(количество - как повезет, но не больше 10), альфанумеричных, длиной 8 символов:
Код:

cut -b 0-104857600 /dev/urandom | head -n 1000 | strings -n 8 | cut -b 0-8 | egrep "^[a-zA-Z0-9]*$"

[mzd] 28-02-2008 17:43 750017

Перевел с kdialog на zenity скрипт, меняющий кодировку с файле.
Код:

#!/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


voler 15-03-2008 11:03 760814

Скрипт делает бэкап нужных, нам конфигов.

Код:

#!/bin/bash
#Читаем содержимое файла, и копируем его файлы.
FILES=`cat /var/package.cfg`
#Добавим дату, к каталогу.
DATE=`date '+%F'`
#Создадим папку + Дата.
mkdir /backup/conf_$DATE
#Укажем куда копировать.
CR=/backup/conf_$DATE/
#Копируем файлы указанные в package.cfg
cp -f $FILES $CR
#создадим архив.
tar -cvzf /backup/conf_$DATE.gz $CR/*

#Удаляем файлы, после архивации.
rm -Rf /backup/conf_$DATE


must die 27-03-2008 15:05 768998

Цитата:

Цитата Arrest
Генерим несколько паролей(количество - как повезет, но не больше 10), альфанумеричных, длиной 8 символов: »

Может удобнее pwgen

NordWest 08-06-2008 13:30 821392

Был у меня когда-то скрипт, который меняет владельца для всех файлов и подддиректорий. Сосед-линуксойд написал. Очень полезно было... Не создадите тут?

must die 09-06-2008 14:37 822221

NordWest,

chown -R user:group /dir_name

Amin 15-06-2008 22:02 826795

Нет PGP Disk ? Не беда =)

#!/bin/bash

MNTPT=/home/Amin/dm_crypt_test/mount_point
CCNTR=/home/Amin/dm_crypt_test/container.dmc

start() {
echo " "
echo "----- Mount CryptoContainer ----------------------"
/sbin/losetup /dev/loop0 $CCNTR
/sbin/cryptsetup create u /dev/loop0
mount -t ext2 /dev/mapper/u $MNTPT
MLINE=`mount | grep $MNTPT`;
if [ -n "$MLINE" ]; then
echo "----- Mount CryptoContainer Complete ! ---------";
else echo '----- ERROR - Bad password -----------------';
stop ;
fi
echo " "
}

stop() {
echo " "
echo "----- Unmount CryptoContainer --------------------"
sync
umount $MNTPT
/sbin/cryptsetup remove u
/sbin/losetup -d /dev/loop0
echo "----- Unmount CryptoContainer Complete ! ---------"
echo " "
}

case "$1" in
start)
start ;;
stop)
stop ;;
*)
MLINE=`mount | grep $MNTPT`
if [ -n "$MLINE" ]; then
stop;
else
stop;
clear;
start;
fi
esac

exit 0;


К счастью, в Федоре все необходимое для шифрования файлов уже есть, поэтому ничего качать/ставить/пересобирать не пришлось.
Вот только одного не понимаю - криптография в ядре есть уже тыщу лет, а написать к этому простой интерфейс а-ля PGP Disk так никто вроде и не удосужился (хотел бы в этом ошибиться).

P.S. Отправной точкой взял вот эту статейку - http://www.xakep.ru/magazine/xa/090/104/1.asp (я юзал только секцию "Раздел в виде файла на диске", 5-я страница), только вместо reiser сделал ext2 . Для себя еще раз сделал вывод, что хоть "ксакеп" и пальцовый журнал, но найти там кое-что полезное все же можно. Впрочем, из любителей хихикать в сторону "ксакепа" практически никто не смог создать проект даже близкого уровня. Флуд ведь разводить гораздо легче, чем реально что-то полезное сделать.

===== Заметки для меня =====
touch cryptdisk.cds # создаем новый контейнер
shred -n1 -s50M cryptdisk.cds # затрем в контейнере 50 Мб /* размер */

# подготовим диск :
losetup /dev/loop0 ~/cryptdisk.cds # соединение с loop-устройством
cryptsetup -y create mydisk /dev/loop0 # создание в /dev/mapper своего диска
mkfs /dev/mapper/mydisk # форматирование раздела

HINT #1 : cryptsetup туп как пробка, и никаких паролей он не проверяет. То есть применяет алгоритм "в лоб". Поэтому даже если вы подсунете кривой (поврежденный) контейнер или неверный пароль, то cryptsetup все равно его подключит (ему похоже фиолетово, что там в loop-устройстве и какой там пароль), только в устройстве будет мусор. Проверка пароля делается mount'-ом =)

HINT #2 : если сделать только losetup + cryptsetup, но не выполнять mount, то в /dev/mapper/mydisk будет голое устройство, которое можно, например, проверить с помощью fsck после нештатной ситуации вроде сбоя питания.

[mzd] 07-10-2008 16:39 918011

Скрипт закачки обновлений к Kaspersky
Кумулятивные:
Код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Скрипт для загрузки обновлений к Kaspersky AntiVirus

import os
import datetime
import time
from ftplib import FTP

author="Александр Теленьга"

print "-----------------------------------------------------"
print "Скрипт для загрузки обновлений к Kaspersky AntiVirus"
print "Автор: "+author
print "-----------------------------------------------------"
print "Начинаем работу..."
print

flag=False

while not flag:
        try:
                ftph = FTP('ftp.downloads1.kaspersky-labs.com')
        except:
                print "Хост в ауте. Ждем..."
                time.sleep (10)
                exit
        else:
                print "Хост живой. Начинаем скачивать..."
                flag=True
                cumul_URL="ftp://ftp.downloads1.kaspersky-labs.com/zips/av-i386\&ids-cumul.zip"
                os.system('rm -Rf /media/LAN/install/Updates/Kaspersky\ Bases/cumul/*')
                save_path="/media/LAN/install/Updates/Kaspersky\ Bases/cumul/"
                os.system('wget -c -t 100 %s' %(cumul_URL))
                os.system('mv av-i386\&ids-cumul.zip %s' %(save_path))
                print "Работа скрипта завершена."

Ежедневные (с распаковкой кумулятивных и ежедневных в соответствующие папки):
Код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Скрипт для загрузки обновлений к Kaspersky AntiVirus

import os
import datetime
import time
from ftplib import FTP

author="Александр Теленьга"

print "-----------------------------------------------------"
print "Скрипт для загрузки обновлений к Kaspersky AntiVirus"
print "Автор: "+author
print "-----------------------------------------------------"
print "Начинаем работу..."
print

flag=False

while not flag:
        try:
                ftph = FTP('ftp.downloads1.kaspersky-labs.com')
        except:
                print "Хост в ауте. Ждем..."
                time.sleep (10)
                exit
        else:
                print "Хост живой. Начинаем скачивать..."
                flag=True
                daily_URL="ftp://ftp.downloads1.kaspersky-labs.com/zips/av-i386\&ids-daily.zip"
                os.system('rm -Rf /media/LAN/install/Updates/Kaspersky\ Bases/daily/*')
                save_path="/media/LAN/install/Updates/Kaspersky\ Bases/daily/"
                os.system('wget -c -t 100 %s' %(daily_URL))
                os.system('mv av-i386\&ids-daily.zip %s' %(save_path))
               
                print "Начинаем извлечение из архива..."
                current_path="/media/LAN/install/Updates/Kaspersky\ Bases/current/cumul"
                os.system('rm -Rf %s/*' %(current_path))
                os.system('unzip -o /media/LAN/install/Updates/Kaspersky\ Bases/cumul/av-i386\&ids-cumul -d %s' %(current_path))
                current_path="/media/LAN/install/Updates/Kaspersky\ Bases/current/daily"
                os.system('rm -Rf %s/*' %(current_path))
                os.system('unzip -o /media/LAN/install/Updates/Kaspersky\ Bases/daily/av-i386\&ids-daily -d %s' %(current_path))

                print "Работа скрипта завершена."


censored 10-12-2008 12:55 977265

Помогите со скриптом. Нужно чтобы файлы старше 7 дней удалялись автоматом.

BuGfiX 10-12-2008 13:36 977314

find /tmp -type f -mtime 7 -print0 | xargs -0 rm -f
добавьте это в крон

censored 10-12-2008 14:10 977373

Скажите пожалуйста, а папки он тоже будет удалять?

BuGfiX 10-12-2008 14:55 977417

Директории будут обрабатываться той-же командой, но с параметром -type d.

censored 10-12-2008 18:35 977690

А если фаил был скачан с интернета или переписан откуда-то? Ведь там дата его создания будет гараздо раньше чем 7 дней.. Как такое побороть ?

BuGfiX 10-12-2008 19:01 977711

censored, посмотрите man find на предмет atime,ctime и mtime.

censored 11-12-2008 10:29 978152

Спасибо за помощь, уже разобрался всё работает.

[mzd] 20-02-2009 13:24 1043942

Сбор информации о системе:
PHP код:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#A System Information Gathering Script
import subprocess

def uname_func
():
    
uname "uname"
    
uname_arg "-a"
    
print "Собираем системную информацию с помощью команды %s:\n" uname
    subprocess
.call([unameuname_arg])    
    print 
"\n"

def disk_func():
    
diskspace "df"
    
diskspace_arg "-h"
    
print "Собираем информацию о свободном месте на дисках с помощью команды %s:\n" diskspace
    subprocess
.call([diskspacediskspace_arg])
    print 
"\n"
    
def tmp_space():
    
tmp_usage "du"
    
tmp_arg "-h"
    
path "/tmp"
    
print "Свободное место в директории /tmp:\n"
    
subprocess.call([tmp_usagetmp_argpath])
    print 
"\n"

#Main function that call other functions
def main():
    
uname_func()
    
disk_func()
    
tmp_space()

if 
__name__ == "__main__":
    
main() 


serzhinio 09-03-2009 20:09 1059029

Просьба помочь с следующим скриптом, выполняющим следующую задачу:


В каталоге существует много архивных файлов (*.rar, *.zip, *.tgz) и из каждого нужно извлечь скажем файл picture.jpg (или png) и после извлечения переименовать в такое же название как и название архива. Если в архиве несколько picure.jpg - переименовать на "название-архива-1.jpg", "название-архива-2.jpg" и тд.
Есть ли возможность просканировать все архивы и главное вложеные архивы для получения списка таких файлов.

Поскольку в скриптах не особо силен, возможно подскажете способы реализации.

Спасибо


Время: 19:43.

Время: 19:43.
© OSzone.net 2001-