Полезные скрипты на Shell во FreeBSD


Здесь представлены различные полезные скрипты, которые облегчают решение различных проблем, часто возникающих перед администраторами и пользователями FreeBSD.


Информация о размере файлов для закачки
#!/bin/sh
# getsize.sh - скрипт для получения информации о размере файлов для закачки
#
# Запуск: ./getsize.sh [sum] [файл со ссылками|URL]
#
# Запуск с параметром "sum" выдает также общий объем файлов.
# Файл со ссылками может содержать быть как прямые ссылки на файлы,
# так и маски вида ftp://ftp.freebsd.org/pub/FreeBSD/tools/*
# (размер файлов в подкаталогах не учитывается)
# Для корректной работы скрипта требуется wget.
#
# Примеры:
# ./getsize.sh sum http://some.com/some.file.tgz http://some2.com/file.xxx
# ./getsize.sh links.txt
#
if [ -z "$1" ]; then
exit
fi
SUM=0
TMPFILE=`mktemp -q /tmp/getsize.XXXXXX`
TMPFILE1=`mktemp -q /tmp/getsize.XXXXXX`
# проверяем входные параметры
IN=$1
if [ "${IN}" = "sum" ]; then
IN=$2
fi
if [ `echo ${IN} | grep "://"` ]; then
IN="${TMPFILE}"
printf "$*" | sed "s/sum //g" > ${IN}
fi
for i in `cat ${IN}`
do
if [ `echo "${i}" | grep "*"` ]; then
# найдена маска, скачиваем содержимое каталога
wget -nr -R "*" ${i} > /dev/null 2>&1
cat ./.listing | grep -v "^d" | grep "-"
| awk '{print $9, $5}' | sed "s/ /-----/g" > ${TMPFILE1}
for j in `cat ${TMPFILE1}`
do
name=`echo ${j} | awk -F"-----" '{print $1}'`
size=`echo ${j} | awk -F"-----" '{print $2}'`
X=`echo ${i} | sed "s/*//g"`
echo "${X}${name} ${size}"
SUM=`expr ${SUM} + ${size}`
done
rm ./.listing
rm ${TMPFILE1}
else
# обычная ссылка
s=`fetch -s ${i}`
echo "${i} ${s}"
SUM=`expr ${SUM} + ${s}`
fi
done
if [ "$1" = "sum" ]; then
echo "Total ${SUM}"
fi
# удаляем временный файл
rm ${TMPFILE} > /dev/null 2>&1
exit
Завершение SSH-сессий
#!/bin/sh
# logoff.sh - скрипт для завершения ssh-сессий
# Запуск: ./logoff.sh username
kill -9 `ps -a -U $1 | grep sshd | grep -v grep | awk '{print $1}'`
Создание конфигурационных файлов для VPN-сервера mpd
#!/bin/sh
NODES="50" # количество интерфейсов
DNS_SERVER="10.0.0.1" # DNS-сервер
VPN_RANGE="10.10.0.1/32 10.10.255.254/16" # IP-адрес VPN-шлюза и подсеть, из
# которой выдаются адреса клиентам
# ====================
NODENAME="x"
FILE="mpd.conf"
# mpd.conf
printf "startup:
set global enable tcp-wrapper

" > ${FILE}

printf "default: " >> ${FILE}
node="0"
while [ ${node} -lt ${NODES} ]; do
printf " load ${NODENAME}${node} " >> ${FILE}
node=`expr ${node} + 1`
done
node="0"
printf " " >> ${FILE}
while [ ${node} -lt ${NODES} ]; do

printf "${NODENAME}${node}:
new -i ng${node} ${NODENAME}${node} ${NODENAME}${node}
set ipcp range ${VPN_RANGE}
load pptp_standard
" >> ${FILE}
node=`expr ${node} + 1`
done
printf "
pptp_standard:
set iface disable on-demand
set iface enable tcpmssfix
set bundle disable multilink
set link mtu 1500
set link yes acfcomp protocomp
set link no pap chap
set link accept chap
set link keep-alive 60 180
set ipcp yes vjcomp
set ipcp dns ${DNS_SERVER}
set iface enable proxy-arp
set pptp self 0.0.0.0
set pptp enable incoming
set pptp disable originate
set iface up-script /usr/local/scripts/link-up
set iface down-script /usr/local/scripts/link-down

" >> ${FILE}

# =====================================
FILE="mpd.links"
node="0"
echo > ${FILE}
while [ ${node} -lt ${NODES} ]; do
printf "${NODENAME}${node}: set link type pptp " >> ${FILE}
node=`expr ${node} + 1`
done
Просмотр всех возможных опций сборки порта
#!/bin/sh
# portopts - скрипт просмотра опций сборки порта
# Скопируйте скрипт в /usr/local/bin, сделайте его исполняемым
# (chmod a+x portopts), затем перейдите в
# каталог порта и выполните команду "portopts"
#
# Порт можно указать и в командной строке: portopts www/apache13
#
if [ -z "$1" ]; then
P="."
else
P="/usr/ports/$1"
fi
cat ${P}/Makefile* | grep "defined(" | sed "s/(!//g" |
awk -F"(" '{print $2}' | awk -F")" '{print $1}' |
sort | uniq
Скрипт для автоматизации создания всех пакетов в ОС FreeBSD
#!/bin/sh
#
# pkg_create_all
# Create all packages with sym-links for FreeBSD 5.x+
#
# Version: 1.2.2
# Copyright (c) 2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
#

# All error in /var/log/<script_name>.err
#

# Path to packages directory
packagespath="/usr/ports/packages"

# Command for get package's version
pkgvercmd="/usr/sbin/pkg_version -v"
#pkgvercmd="/usr/local/sbin/portversion -v" # more faster than pkg_version

#-------------------------------------------------------------------------------

err="33[0;40;31mError33[0m"
ok="33[1;40;33mOk33[0m"


checkPackagesPath ()
{
[ -d $packagespath ] || { /usr/bin/printf " *** $err: $packagespath doesn't exist. ";
/bin/echo " *** Error: $packagespath doesn't exist." > /var/log/`basename $0`.log;
exit 1; }
[ -d $packagespath/All ] || { /bin/mkdir $packagespath/All || exit 1; }
[ -d $packagespath/Latest ] || { /bin/mkdir $packagespath/Latest || exit 1; }
return 0
}

checkPkgAll ()
{
[ -f $packagespath/All/$fullname.tbz ] && return 0
return 1
}

checkPkgLatest ()
{
[ -L $packagespath/Latest/$shortname.tbz ] && [ -r $packagespath/Latest/$shortname.tbz ] && return 0
return 1
}

checkPkgCat ()
{
[ -L $packagespath/$subdir/$fullname.tbz ] && [ -r $packagespath/$subdir/$fullname.tbz ] && return 0
return 1
}

createPkgAll ()
{
/usr/sbin/pkg_create -jb $fullname $packagespath/All/$fullname.tbz && return 0
return 1
}

createPkgLatest ()
{
/bin/rm -f $packagespath/Latest/$shortname.tbz
cd $packagespath/Latest && /bin/ln -s ../All/$fullname.tbz $shortname.tbz && return 0
return 1
}

createPkgCat ()
{
if [ -d $packagespath/$subdir ]; then
/bin/rm -f $packagespath/$subdir/$fullname.tbz
else
/bin/mkdir -p $packagespath/$subdir
fi

cd $packagespath/$subdir && /bin/ln -s ../All/$fullname.tbz $fullname.tbz && return 0
return 1
}

getPkgFullVersion ()
{
echo -n "Geting full version package list..."
pkglist=`$pkgvercmd | /usr/bin/awk '{print $1}'`
/usr/bin/printf "$ok "
}

work ()
{
for fullname in $pkglist; do
/bin/echo "Check $fullname"

shortname=`/bin/echo $fullname | /usr/bin/sed 's/-[^-]*$//'`
subdir=`/usr/sbin/pkg_info -o $fullname | /usr/bin/sed -e '1,3d' -e '$d' | /usr/bin/awk -F/ '{print $1}'`

if ! checkPkgAll; then
/bin/echo -n " ==> Create package..."
if createPkgAll; then /usr/bin/printf "$ok "
else /usr/bin/printf "$err "
fi

/bin/echo -n " ==> Create Latest sym-link..."
if createPkgLatest; then /usr/bin/printf "$ok "
else /usr/bin/printf "$err "
fi

/bin/echo -n " ==> Create Category sym-link..."
if createPkgCat; then /usr/bin/printf "$ok "
else /usr/bin/printf "$err "
fi

continue
fi

if ! checkPkgLatest; then
/bin/echo -n " ==> Create Latest sym-link..."
if createPkgLatest; then /usr/bin/printf "$ok "
else /usr/bin/printf "$err "
fi
fi

if ! checkPkgCat; then
/bin/echo -n " ==> Create Category sym-link..."
if createPkgCat; then /usr/bin/printf "$ok "
else /usr/bin/printf "$err "
fi
fi
done
}

main ()
{
exec 2>/var/log/`basename $0`.log

checkPackagesPath
getPkgFullVersion
work

exec 2>&-
}

main

exit 0
Скрипт для создания всех пакетов, требуемых по зависимостям, для порта в ОС FreeBSD

По сути, выполняет действия, аналогичные pkg_create с ключём -R, который появился только в FreeBSD 6.x. Однако данный скрипт позволяет указывать короткое имя порта и каталог, в котором создавать пакеты. А главное, он работает и на тех системах, где pkg_create не поддерживает ключ -R.
#!/bin/sh
#
# pkg_depend
# Create all packages (with dependence) needed by some port for FreeBSD 5.x+
#
# Version: 1.4
# Copyright (c) 2005,2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
#

# Path to packages directory
pkgpath="/usr/ports/packages/All"

# Command for get package's version
pkgvercmd="pkg_version -v"
#pkgvercmd="portversion -v" # more faster than pkg_version

getdepend()
{
[ ! -d $2 ] && echo -n "Creating directory ($2)..." && mkdir -p $2 && echo "Done."

cd ${pkgpath}
if [ ! -f ${pkgpath}/$1.tbz ]; then
echo -n "Creating package ($1)..."
pkg_create -yb $1
echo "Done."
fi

echo -n "Copying package ($1)..."
cp -f ${pkgpath}/$1.tbz $2
echo "Done."

for LINE in `pkg_info -r $1 | grep Dependency: | awk '{print $2}'`
do
if [ ! -f ${pkgpath}/${LINE}.tbz ]; then
echo -n "Creating package (${LINE})..."
pkg_create -yb ${LINE}
echo "Done."
fi
echo -n "Copying package (${LINE})..."
cp -f ${pkgpath}/${LINE}.tbz $2
echo "Done."
done
}

gethelp()
{
echo ""
echo "Usage: `basename $0` <Full/Short pkg_name> <Directory>"
echo ""
echo "If specify short package name script will get first find entry"
echo ""
echo "Example: `basename $0` dia-gnome-0.94_4,1 /tmp/pkg/"
echo " `basename $0` dia-gnome /tmp/pkg/"
echo ""
exit 1
}

main()
{
if [ "$2" = "" ]; then gethelp
else
echo -n "Checking package name ($1)..."
if [ "`echo $1 | grep '-[0-9]'`" = "" ]; then
pkgname=`${pkgvercmd} | grep -E '^'$1'-[0-9].*' | awk '{print $1}' | head -1`
else
pkgname=`${pkgvercmd} | grep $1 | awk '{print $1}' | head -1`
fi
echo "Done."

if [ "${pkgname}" = "" ]; then
echo "Package '$1' not found! Exit."
exit 2
else
getdepend ${pkgname} $2
fi
fi
}

main $1 $2

exit 0
Автоматизация послеустановочной настройки MySQL
#!/bin/sh
#
# mysql-after-setup
# Copyright (c) 2006 Alexey Tsvetnov, vorakl@fbsd.kiev.ua
# Version: 1.4
#
# Run script after install MySQL to do:
# 1. Drop database 'test'
# 2. Set MySQL root password
# 3. Delete all users and access except root@localhost
#

# tty echo off
stty -echo

# enter correct password
while true
do
echo -n "Enter password: " && read pass1 && echo
echo -n "Re-enter password: " && read pass2 && echo
[ "${pass1}" = "${pass2}" ] && break
echo " *** Error!"
done

# tty echo on
stty echo

echo "drop database test; delete from db where db like '%test%';
update user set password=PASSWORD('$pass1') where user='root' and host='localhost';
delete from user where password='';
flush privileges;" | mysql -h 127.0.0.1 -u root mysql && echo "Done successfuly."

exit 0

http://wiki.bsdportal.ru/doc:sh_scripts

Обновлено: 12.03.2015