21 Востаннє редагувалося drWoZD (18.04.2014 22:03:05)

Re: bash скрипти

Не знаю навіщо, але захотілось скинути це сюди :)

perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstab

P.S. Хто розгадає, подарую віртуальну шоколадку :D

22 Востаннє редагувалося Logans (22.07.2014 14:04:14)

Re: bash скрипти

drWoZD написав:

Не знаю навіщо, але захотілось скинути це сюди :)

perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstab

P.S. Хто розгадає, подарую віртуальну шоколадку :D

Колись бачив щось подібне, тому недумаючи запитаю: "rm -rf"?

23

Re: bash скрипти

Logans написав:
drWoZD написав:

Не знаю навіщо, але захотілось скинути це сюди :)

perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstab

P.S. Хто розгадає, подарую віртуальну шоколадку :D

Колись бачив щось подібне, тому недумаючи запитаю: "rm -rf"?

Та де, я таким не страдаю. Цей скрипт змінює мітки дисків відповідно до їх точок монтування.

24

Re: bash скрипти

Ну шо, викладу і я свої твори, хоча вони трошки застаріли, але комусь можуть знадобитись як основа для свого інструменту.
https://github.com/StreamThreader/litkk-lvmtools
https://github.com/StreamThreader/litkk-nagiosplugins

25

Re: bash скрипти

Hanter написав:

Почав згадувти bash і для розминки накидав міні скрипт, який тиряє усі шаблони і скріншоти до них з сайту all-free-download.com
Ніби все працює.

Прихований текст

sed: неможливо прочитати links.txt: Немає такого файла або каталогу те ж саме і з журналом хакер

26

Re: bash скрипти

StreamThreader написав:

Ну шо, викладу і я свої твори, хоча вони трошки застаріли, але комусь можуть знадобитись як основа для свого інструменту.
https://github.com/StreamThreader/litkk-lvmtools
https://github.com/StreamThreader/litkk-nagiosplugins

Дякую :)

27 Востаннє редагувалося HetmanNet (01.03.2021 11:52:49)

Re: bash скрипти

Кожного разу коли мені стає нудно від того що треба сидіти з півгодини повторювати одні і ті самі операції,  *TIRED*  я пишу якийсь кривуватий скрипт  :[ , що зробить це за мене.  8) Так як ці скрипти використовуються від сили пару разів, то про їх якість краще не говорити..  :[  можна сказати її там немає. Тому буду ділитися цими творіннями  *HI* , все одно я їх видаляю з часом  *SORRY* , а так вони хоч десь збережуться і може когось надихнуть написати щось краще. Цього разу знайшов скрипт що автоматизував виконання серії команд nmap.  *DONT_KNOW* Зазвичай нормальні адміни просто пишуть таке методом "copy-paste"  *SCRATCH* , ну а  мене нормальним назвати важко  *CRAZY* , тому пишу таке.   :[

#!/bin/bash
# Сканування мережі

declare -a arr_1
arr_1=(`nmap -PR 192.168.1.1/24 | grep -E -o "(..:..:..:..:..:..)|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"`)
declare -a arr_2 #IP
declare -a arr_3 #MAC
index_1=1
index_2=1
index_3=1
for e in "${arr_1[@]}"
do
    bit_1=`expr $index_1 % 2`
    if [ $bit_1 == 1 ]
    then
        arr_2[$index_2]=$e
        index_2=`expr $index_2 + 1`
    else
        arr_3[$index_3]=$e
        index_3=`expr $index_3 + 1`
    fi
    index_1=`expr $index_1 + 1`
done
declare -a arr_4 #OS
index_4=1
while [ $index_2 -gt $index_4 ]
do
    arr_4[$index_4]=`nmap -O ${arr_2[$index_4]} | grep -E "OS details:.*" | sed "s/OS details:[[:space:]]//"`
    index_4=`expr $index_4 + 1`
done
index_5=1
string_1=""
while [ $index_2 -gt $index_5 ]
do
    if [ "${arr_4[$index_5]}" == "" ]
    then
        string_1="Невідома"
    else
        string_1=${arr_4[$index_5]}
    fi
    echo -e "${index_5} \\t MAC:${arr_3[$index_5]} \\t IP:${arr_2[$index_5]} \\t OS:$string_1"
    index_5=`expr $index_5 + 1`
done

P.S. Чи варто їх викладати?

Подякували: 0xDADA11C7, Blast, ostap34PHP3

28

Re: bash скрипти

Вважаю, що варто, тільки вказуйте платформу, для якої воно писане.

29

Re: bash скрипти

0xDADA11C7 написав:

Вважаю, що варто, тільки вказуйте платформу, для якої воно писане.

Я вставив його таким, яким знайшов. Шапку з коментарів не видаляв, точніше забув. Всі скрипти протестовані на Fedora. :) Зазвичай в шапці зазначено для якого дистрибутива написані, але у "одноразових" часто це просто забуваю написати.

30

Re: bash скрипти

знайшов старий скриптик.
Не bash, але все ж)

#!/usr/bin/perl

$_=`synclient -l | grep TouchpadOff`;
s; *= *;=;;y;01;10;;
system("synclient $_");

колись набридало, що тачпад під час друку збивав курсор і друк починався не там де треба  :)
Ну от на емоціях написав таке.

31

Re: bash скрипти

Помітив, що давно нічого не додавали до даної теми, тож вирішив написати хоч щось що прийде у голову за п'ять хвилин. Може комусь буде треба.

Функція просто малює суцільну лінію на всю ширину консолі з символів "=".

function line {
    symbol_line="="
    startc=0
    endc=$(tput cols)
    echo -n -e "\n"
    for ((poz=$startc; poz<$endc; poz++)); 
    do
        echo -n -e "$symbol_line"
    done
    echo -n -e "\n"
    exit 0
}

Функція робить заголовок на всю ширину консолі у форматі "====== [ name ] ======". Як перший аргумент передається name.

function head {
    symbol_line="="
    br_left=" [ "
    br_right=" ] "
    name=$1
    columns=$(tput cols)
    len_name=${#name}
    if [ "$columns" -gt "$len_name" ]
    then
        let "len_line = $columns - $len_name - 6"
        if [ "$len_line" -gt 2 ]
        then
            let "len_part_line = $len_line / 2"
            echo -n -e "\n"
            startc=0
            let "endc = $startc + $len_part_line"
            for ((poz=$startc; poz<$endc; poz++));
            do
                echo -n -e "$symbol_line"
            done
            echo -n -e "$br_left$name$br_right"
            let "startc = $len_part_line + ${#br_left} + $len_name + ${#br_right}"
            endc=$columns
            for ((poz=$startc; poz<$endc; poz++));
            do
                echo -n -e "$symbol_line"
            done
            echo -n -e "\n"
        else
            exit 2
        fi
    else
        exit 1    
    fi
    exit 0
}

32 Востаннє редагувалося Blast (23.08.2015 09:23:07)

Re: bash скрипти

Поділюсь і я своїм, хоч елементарним , але часу в сумі економить багацько.
Запуск дев сервера в віртуальному середовищі.
п.с 0.0.0.0:8000 для отримання доступу до сайту через вайфай роутер щоб дебажити функціонал та вигляд для мобільних пристроїв.

#!/bin/bash
echo "Run local server"
cd virtualenvname
source bin/activate
cd projectname
python manage.py runserver 0.0.0.0:8000

33

Re: bash скрипти

Не зовсім bash і дещо корявий  :), створює клітки під FreeBSD

#! /bin/sh

# Creates jails on FreeBSD

echo "Name of new jail:"
read name
echo "IP adress:"
read jailip
echo "network Interface:"
read jailiface
echo "Path to new jail: "
while  test -e $jailpath 
do
    read jailpath
    echo "This path already exist. Enter other path:"
done

# Create directory and build jail
mkdir -p $jailpath
echo "If you have already rebuilt your userland using make world or make buildworld, you can skip this step. y/n?:"
until [ "$answer" == "y" ] || [ "$answer" == "n" ]
do
    read answer
    if [ "$answer" == "n" ]; then
        make -C /usr/src buildworld
        break
    elif [ "$answer" == "y" ]; then
        break
    else
        echo "Type \"y\" or \"n\" :"
    fi
done
make -C /usr/src installworld DESTDIR=$jailpath
make -C /usr/src distribution DESTDIR=$jailpath
mount -t devfs devfs $jailpath/dev

# Create record in /etc/jail.conf
printf "$name {
    path = \"$jailpath\";
    mount.devfs;
    host.hostname = \"$name\";
    ip4.addr = $jailip;
    interface = \"$jailiface\";
    exec.start = \"/bin/sh /etc/rc\";
    exec.stop = \"/bin/sh /etc/rc.shutdown\";
    exec.clean;
     }\n" >> /etc/jail.conf

# Add records to rc.conf
sed -i  -e "s/jail_list\=\"/&$name /" /etc/rc.conf
grep "jail_enable=\"YES\"" /etc/rc.conf || echo "jail_enable=\"YES\"" >> /etc/rc.conf
grep 'jail_list=".*"' /etc/rc.conf || echo "jail_list=\"$name\"" >> /etc/rc.conf

34

Re: bash скрипти

Даний скрипт фільтрує rejectlog поштового серверу exim4 (вилучає записи з "junkemailfilter") і надсилає його на вказану електронну скриньку

if [ -f "/tmp/rejectlog_filtered.txt" ]; then rm /tmp/rejectlog_filtered.txt; fi

less /var/log/exim4/rejectlog | grep -v "junkemailfilter" > /tmp/rejectlog_filtered.txt

if test -s /tmp/rejectlog_filtered.txt; then mpack -s "rejectlog_filtered" /tmp/rejectlog_filtered.txt user@example.com; fi
Подякували: 0xDADA11C71

35

Re: bash скрипти

Функція на bash для ведення логів. Функція визначає як запущено скрипт, якщо в терміналі користувача то дублює повідомлення в стандартний вивід, якщо ні то лише в логи бо інакше вивід на стандартний вивід може потрапляти в логи також і т.д..

function msg {

        # за умовчання
        local facility="user"
        local level
        local mesg="empty"
        local name="libstdbash"
        local pid_in_systemd
        local prev_mesg

        # приймаємо вхідну строку
        mesg="'$*'"

        # визначаємо тип повідомлення
        local type="`echo $mesg | cut -f 1 -d " "`"
        case ${type:1} in
                ERROR|ERR )
                        level="error"
                        prev_mesg="\e[1;41m::  ERROR  ::\e[0m \t\e[0;31m"
                        ;;
                WARNING|WARN )
                        level="warn"
                        prev_mesg="\e[1;31m:: WARNING ::\e[0m"
                        ;;
                INFO )
                        level="notice"
                        prev_mesg="\e[1;93m:: NOTICE  ::\e[0m"
                        ;;
                DEBUG )
                        level="debug"
                        prev_mesg="\e[1;107m::  DEBUG  ::\e[0m"
                        ;;
                * )
                        level="info"
                        prev_mesg="\e[1;97m::  INFO   ::\e[0m"
                        ;;
        esac
        if [ "$level" != "info" ]
        then
                mesg=${mesg#$type}
                mesg=${mesg::-1}
        fi

        # перевіряємо чи запущено через systemd
        name="`basename "$0"`"
        name=${name%.sh}
        pid_in_systemd="`systemctl -p \"MainPID\" show "$name".service 2>/dev/null`"
        if [ $? -eq 0 ]
        then
                if [ ${pid_in_systemd:8} -eq $$ ]
                then
                        facility="deamon"
                        systemctl is-active $name.timer
                        if [ $? -eq 0 ]
                        then
                                facility="cron"
                        fi
                fi
        fi

        # визначаємо чи працюємо в терміналі користувача
        tty -s
        if [ $? -eq 0 ]
        then
                echo -e "$prev_mesg $mesg \e[0m"
        fi

        # вивід до логу
        prev_mesg="`echo $prev_mesg | cut -f 2 -d " "`"
        logger --id -t "`basename "$0"`" -p $facility.$level [$prev_mesg] "$mesg"
}

Використання просте: вставляємо на початку bash скрипта (саму функцію чи через source яке підтягне її з іншого файлу) і використовуємо так коли треба:

msg ERROR Not permissiom!

де ERROR це тип повідомлення, він може мати значення ERROR, WARNING, INFO, DEBUG.
де "Not permissiom!" саме повідомлення.

36

Re: bash скрипти

Запис кронтаб для отримання пошти через pop3/imap:

1 9,19,23 * * * bash -c "sleep 10; if pgrep fetchmail; then exit; else fetchmail --nosyslog --nodetach -vvv; fi" > /dev/null

37

Re: bash скрипти

Скрипт нижче - моя невеличка детективна історія з пошуку причин падіння mysql. Отже, цей скрипт в кронтабі налаштований щогодини перевіряти, чи працює mysql. Якщо ж не працює, тоді на вказану поштову скриньку відправляються деталі для подальшого з'ясування.

if pgrep mysql; then exit 0; fi

if [ -f "/tmp/mysql_logs_systemctl.txt" ]; then rm /tmp/mysql_logs_systemctl.txt; fi
if [ -f "/tmp/mysql_logs_journalctl.txt" ]; then rm /tmp/mysql_logs_journalctl.txt; fi

systemctl status mysql.service > /tmp/mysql_logs_systemctl.txt
journalctl -xe > /tmp/mysql_logs_journalctl.txt

if test -s /tmp/mysql_logs_systemctl.txt; then mpack -s "m3a mysql_logs_systemctl.txt" /tmp/mysql_logs_systemctl.txt user1@example.com; fi
if test -s /tmp/mysql_logs_journalctl.txt; then mpack -s "m3a mysql_logs_journalctl.txt" /tmp/mysql_logs_journalctl.txt user1@example.com; fi
if test -s /var/log/mysql/error.log; then mpack -s "m3a mysql_error_log" /var/log/mysql/error.log user1@example.com; fi

А ось і записи кронтаб:

1 * * * * bash -c "sleep 10; if pgrep mysql; then exit; else /etc/init.d/mysql start; fi" > /dev/null
3 * * * * /home/user1/mysql_logs.sh > /dev/null
5 * * * * bash -c "sleep 10; if pgrep mysql; then exit; else /etc/init.d/mysql start; fi" > /dev/null
7 * * * * bash -c "sleep 10; if pgrep mysql; then exit; else /sbin/reboot; fi" > /dev/null

(перевіряю чи працює, якщо ні - пробую запустити декілька разів; надсилаю собі логи; врешті ребутаю машину, бо ребут щоразу допомагав)
P.S.: як з'ясувалося, причиною була помилка out of memory - в якості рішення додав swap, поки що більше не падає.

38

Re: bash скрипти

Скрипт нижче робить запит до бд, зберігає результат в csv, викладає csv в веб-директорію, також робить zip-архів з усіх csv (їх в реалі багато)

#!/bin/bash
sleep 5

echo "ZipcodeLookup.csv ..."

PGPASSWORD=[removed db password] /usr/bin/psql --username=user1 --host host1 --port 5432 --dbname db1 -c "\copy ( select t.*, Now() as \"DateTimeFetched\" from dbo.\"ZipcodeLookupReport\" t ) To '/var/www/html/site1/reports/ZipcodeLookup.csv' With CSV header"

echo "removing previous tmp_csv.zip if exists ..."

if [ -f /var/www/html/site1/reports/tmp_csv.zip ]; then
        echo "file /var/www/html/site1/reports/tmp_csv.zip exists, deleting..."
        rm /var/www/html/site1/reports/tmp_csv.zip
        echo ""
else
        echo "file /var/www/html/site1/reports/tmp_csv.zip does not exist"
        echo ""
fi

echo "adding .csv files into tmp_csv.zip ..."

zip -j /var/www/html/site1/reports/tmp_csv.zip /var/www/html/site1/reports/*.csv

echo "reports_csv.zip ..."

cp /var/www/html/site1/reports/tmp_csv.zip /var/www/html/site1/reports/reports_csv.zip

echo "starting data validation..."

sleep 5

/usr/bin/psql -c 'delete from public."ZipcodeLookup"'

/usr/bin/psql -c "COPY public.\"ZipcodeLookup\" (\"Id\",\"IPAddress\",\"Zipcode\",\"SourceCodeId\",\"CreatedDate\",\"UpdatedDate\",\"CreatedBy\",\"UpdatedBy\",\"DateTimeFetched\") FROM '/var/www/html/site1/reports/ZipcodeLookup.csv' DELIMITER ',' CSV HEADER;"

і валідація (там ще деяка логіка в в'юшці, однак в цій темі ми говоримо про bash скрипт, а не про sql), якщо валідація не проходить, то відсилаємо alert на email:

#!/bin/bash
sleep 239

varZipcodeLookup=(`/usr/bin/psql --username=postgres --dbname postgres -c 'select alert1 from public."vZipcodeLookup"'`)

if [ ${varZipcodeLookup[2]} -gt 0 ]
then
    /usr/sbin/sendmail -vt < /var/lib/pgsql92/ZipcodeLookupAlert.txt
fi

39

Re: bash скрипти

Спостереження за логами поштовика exim4 в режимі реального часу

$ sudo tail -f /var/log/exim4/mainlog

40

Re: bash скрипти

Власне цей bash скрипт - обгортка для іншого скрипта, що написаний на перлі.
Код скрипта що на перлі тут не фігурує, та в двох словах - він завантажує вміст файлу .csv в бд через api.
А мій скрипт-обгортка на баші перевіряє папку sftp на наявний .csv файл (чи файди) і якщо такий є, то запускає перл-скрипт з цим .csv (всі решта дії мого скрипта - це валідація директорій і розширень файлу .csv - решта розширень іґноруються)

#!/bin/bash

echo date

DIR="/var/run/vsftpd/perl/dir2"

if [ -d "${DIR}/processed" ]; then
    echo "Directory ${DIR}/processed exists"
    echo ""
  else 
    echo "Directory ${DIR}/processed does not exist, creating..."
    mkdir "${DIR}/processed"
    echo ""
fi

if [ -d "$DIR" ]; then
  ### Take action if $DIR exists ###
  echo "directory ${DIR} exists, checking if it is empty..."
        if [ -z "$(ls -A "$DIR")" ]; then
           echo "Empty"
        else
           echo "Not empty, listing filename(s)..."
           echo ""
                for filename in $(ls "$DIR")
                do
                        if [ -f "${DIR}/${filename}" ]; then
                                echo "processing file - ${DIR}/${filename}"
                                echo ""
                                if [ "${filename: -4}" == ".csv" ]; then
                                        echo "file extension is csv (proper) - ${DIR}/${filename}"
                                        echo "checking if /var/run/vsftpd/perl/ftp.csv exists..."
                                        if [ -f /var/run/vsftpd/perl/ftp.csv ]; then
                                                echo "file /var/run/vsftpd/perl/ftp.csv exists, deleting..."
                                                rm /var/run/vsftpd/perl/ftp.csv
                                                cp ${DIR}/${filename} /var/run/vsftpd/perl/ftp.csv
                                                echo "copied ${DIR}/${filename} into /var/run/vsftpd/perl/ftp.csv"
                                                echo ""
                                        else
                                                echo "file /var/run/vsftpd/perl/ftp.csv does not exist"
                                                echo "copied ${DIR}/${filename} into /var/run/vsftpd/perl/ftp.csv"
                                                echo ""
                                        fi
                                        echo "running perl script to upload csv file via API..."
                                        perl /var/run/vsftpd/perl/perl_import_script_ftp.pl > /var/run/vsftpd/perl/ftp.log
                                        echo "copying processed csv file into processed directory"
                                        cp /var/run/vsftpd/perl/ftp.csv ${DIR}/processed/$(date "+%Y.%m.%d-%H.%M.%S")_${filename}
                                        echo "copying log of processed csv file into processed directory"
                                        cp /var/run/vsftpd/perl/ftp.log ${DIR}/processed/$(date "+%Y.%m.%d-%H.%M.%S")_ftp.log
                                        rm /var/run/vsftpd/perl/ftp.csv
                                        rm /var/run/vsftpd/perl/ftp.log
                                        echo ""
                                else
                                        echo "file extension is not csv (not proper) - skip ${DIR}/${filename}"
                                        echo ""
                                fi
                        else
                                echo "not a file - skip ${DIR}/${filename}"
                                echo ""
                        fi
                done;
        fi
else
  ###  Control will jump here if $DIR does NOT exists ###
  echo "Error: ${DIR} not found. Can not continue."
  echo ""
  exit 1
fi