Материал из Wiki.X-news.org
Перейти к: навигация, поиск

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

Здесь представлены различные полезные скрипты, которые облегчают решение различных проблем, часто возникающих перед администраторами и пользователями 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:\n" >> ${FILE} 
node="0"
while [ ${node} -lt ${NODES} ]; do
printf "\tload ${NODENAME}${node}\n" >> ${FILE}
node=`expr ${node} + 1`
done
node="0"
printf "\n\n" >> ${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
   	    \n" >> ${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}:\n\tset link type pptp\n\n" >> ${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="\033[0;40;31mError\033[0m"
   									  ok="\033[1;40;33mOk\033[0m"
   									   
   									 
   									 checkPackagesPath ()
   									 {
   									     [ -d $packagespath ] || { /usr/bin/printf " *** $err: $packagespath doesn't exist.\n"; 
   									  	   /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\n"
   									  	 	  		      }
   									  	 	  		       
   									  	 	  		       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\n"
   									  	 	  		    	      else /usr/bin/printf "$err\n"
   									  	 	  		    	 fi
   									  	 	  		    	  
   									  	 	  		    	  /bin/echo -n " ==> Create Latest sym-link..."
   									  	 	  		    	 	if createPkgLatest; then /usr/bin/printf "$ok\n"
   									  	 	  		    	 	      else /usr/bin/printf "$err\n"
   									  	 	  		    	 	 fi
   									  	 	  		    	 	  
   									  	 	  		    	 	  /bin/echo -n " ==> Create Category sym-link..."
   									  	 	  		    	 	 	if createPkgCat; then /usr/bin/printf "$ok\n"
   									  	 	  		    	 	 	      else /usr/bin/printf "$err\n"
   									  	 	  		    	 	 	 fi
   									  	 	  		    	 	 	  
   									  	 	  		    	 	 	  continue
   									  	 	  		    	 	 	 fi
   									  	 	  		    	 	 	  
   									  	 	  		    	 	 	 if ! checkPkgLatest; then  
   									  	 	  		    	 	 	    /bin/echo -n " ==> Create Latest sym-link..."
   									  	 	  		    	 	 	     	if createPkgLatest; then /usr/bin/printf "$ok\n"
   									  	 	  		    	 	 	     	      else /usr/bin/printf "$err\n"
   									  	 	  		    	 	 	     	 fi
   									  	 	  		    	 	 	     	  fi
   									  	 	  		    	 	 	     	   
   									  	 	  		    	 	 	     	  if ! checkPkgCat; then  
   									  	 	  		    	 	 	     	     /bin/echo -n " ==> Create Category sym-link..."
   									  	 	  		    	 	 	     	 	if createPkgCat; then /usr/bin/printf "$ok\n"
   									  	 	  		    	 	 	     	 	      else /usr/bin/printf "$err\n"
   									  	 	  		    	 	 	     	 	 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