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. Хто розгадає, подарую віртуальну шоколадку
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, 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/fstab
P.S. Хто розгадає, подарую віртуальну шоколадку
Не знаю навіщо, але захотілось скинути це сюди
perl -ne 'if (/^UUID=(.+) \/([^ ]*) /){ $a = `blkid -U $1`; chomp($a);$b=$2?"\U$2":"ROOT";system("e2label $a $b\n")}' /etc/fstab
P.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/fstab
P.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. Зазвичай нормальні адміни просто пишуть таке методом "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`
done
P.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
#! /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