Re: bash скрипти
Не знаю навіщо, але захотілось скинути це сюди  
 
perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstabP.S. Хто розгадає, подарую віртуальну шоколадку 
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → *nix → bash скрипти
Сторінки Попередня 1 2 3 4 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Не знаю навіщо, але захотілось скинути це сюди  
 
perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstabP.S. Хто розгадає, подарую віртуальну шоколадку 
Не знаю навіщо, але захотілось скинути це сюди

perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstabP.S. Хто розгадає, подарую віртуальну шоколадку
Колись бачив щось подібне, тому недумаючи запитаю: "rm -rf"?
drWoZD написав:Не знаю навіщо, але захотілось скинути це сюди

perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstabP.S. Хто розгадає, подарую віртуальну шоколадку
Колись бачив щось подібне, тому недумаючи запитаю: "rm -rf"?
Та де, я таким не страдаю. Цей скрипт змінює мітки дисків відповідно до їх точок монтування.
Ну шо, викладу і я свої твори, хоча вони трошки застаріли, але комусь можуть знадобитись як основа для свого інструменту.
https://github.com/StreamThreader/litkk-lvmtools
https://github.com/StreamThreader/litkk-nagiosplugins
Почав згадувти bash і для розминки накидав міні скрипт, який тиряє усі шаблони і скріншоти до них з сайту all-free-download.com
Ніби все працює.
Ну шо, викладу і я свої твори, хоча вони трошки застаріли, але комусь можуть знадобитись як основа для свого інструменту.
https://github.com/StreamThreader/litkk-lvmtools
https://github.com/StreamThreader/litkk-nagiosplugins
Дякую 
Кожного разу коли мені стає нудно від того що треба сидіти з півгодини повторювати одні і ті самі операції,   я пишу якийсь кривуватий скрипт
  я пишу якийсь кривуватий скрипт   , що зробить це за мене.
 , що зробить це за мене.   Так як ці скрипти використовуються від сили пару разів, то про їх якість краще не говорити..
 Так як ці скрипти використовуються від сили пару разів, то про їх якість краще не говорити..   можна сказати її там немає. Тому буду ділитися цими творіннями
  можна сказати її там немає. Тому буду ділитися цими творіннями   , все одно я їх видаляю з часом
 , все одно я їх видаляю з часом   , а так вони хоч десь збережуться і може когось надихнуть написати щось краще. Цього разу знайшов скрипт що автоматизував виконання серії команд nmap.
 , а так вони хоч десь збережуться і може когось надихнуть написати щось краще. Цього разу знайшов скрипт що автоматизував виконання серії команд nmap.   Зазвичай нормальні адміни просто пишуть таке методом "copy-paste"
 Зазвичай нормальні адміни просто пишуть таке методом "copy-paste"   , ну а  мене нормальним назвати важко
 , ну а  мене нормальним назвати важко   , тому пишу таке.
 , тому пишу таке.    
 
#!/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`
doneP.S. Чи варто їх викладати?
Вважаю, що варто, тільки вказуйте платформу, для якої воно писане.
Вважаю, що варто, тільки вказуйте платформу, для якої воно писане.
Я вставив його таким, яким знайшов. Шапку з коментарів не видаляв, точніше забув. Всі скрипти протестовані на Fedora.  Зазвичай в шапці зазначено для якого дистрибутива написані, але у "одноразових" часто це просто забуваю написати.
 Зазвичай в шапці зазначено для якого дистрибутива написані, але у "одноразових" часто це просто забуваю написати.
знайшов старий скриптик.
Не bash, але все ж)
#!/usr/bin/perl
$_=`synclient -l | grep TouchpadOff`;
s; *= *;=;;y;01;10;;
system("synclient $_");колись набридало, що тачпад під час друку збивав курсор і друк починався не там де треба   
 
Ну от на емоціях написав таке.
Помітив, що давно нічого не додавали до даної теми, тож вирішив написати хоч щось що прийде у голову за п'ять хвилин. Може комусь буде треба.
Функція просто малює суцільну лінію на всю ширину консолі з символів "=". 
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
}Поділюсь і я своїм, хоч елементарним , але часу в сумі економить багацько.
Запуск дев сервера в віртуальному середовищі.
п.с 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Не зовсім bash і дещо корявий   , створює клітки під FreeBSD
, створює клітки під 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Даний скрипт фільтрує 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Функція на 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!" саме повідомлення.
Запис кронтаб для отримання пошти через pop3/imap: 
1 9,19,23 * * * bash -c "sleep 10; if pgrep fetchmail; then exit; else fetchmail --nosyslog --nodetach -vvv; fi" > /dev/nullСкрипт нижче - моя невеличка детективна історія з пошуку причин падіння 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, поки що більше не падає.
Скрипт нижче робить запит до бд, зберігає результат в 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Спостереження за логами поштовика exim4 в режимі реального часу
$ sudo tail -f /var/log/exim4/mainlogВласне цей 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