1 Востаннє редагувалося Voron (07.08.2012 10:07:15)

Тема: bash скрипти

Пропоную викладати в цій темі цікаві/корисні скрипти.

Ось скрипт який слідкує за вказаним файлом, у випадку його зміни - відображає змінений вміст файла:

#!/bin/bash
inotifywait -m -e close_write /opt/alarm/1.txt | while read file; do `zenity --text-info --title="Повідомлення" --filename="/opt/alarm/1.txt"`;done

для роботи скрипта потрібні утили:
inotifywait - утила яка відслідковує зміни у файловій системі http://www.delayer.org/2009/09/inotifywait-incron.html
zenity - утила яка дозволяє дуже просто створювати вікна http://habrahabr.ru/post/50461/

Подякували: Replace1

Re: bash скрипти

Так, зараз пошукаю в себе щось корисне.

3 Востаннє редагувалося Адріян Ігорович (07.08.2012 13:09:04)

Re: bash скрипти

Ось і знайшов. Суть скрипта у тому, що він завантажує усі шрифти з сайту ukrfonts.com.

     page_number=0
    save="/home/Hanter/Шрифти/"
    while [ $page_number -lt 6000 ]
    do
        page_number=`expr $page_number + 1`
        wget --content-disposition --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0" --post-data="v=19&idn=$page_number" www.ukrfonts.com/info/download.php -P $save
    done
    cd $save
    rm *.html
    rm *.html.?
Подякували: Replace, Voron, Djalin3

Re: bash скрипти

Сьогодні переглядаючи флешку, знайшов ще один скрипт.
Він просто завантажує усі журнали "Хакер".
Для роботи потрібна утиліта wget.

number=1
links="000"
if [ -f number.txt ]
then
read number < number.txt
fi

if [ -d Журнал\ хакер ]
then
echo "Продовження завантаження | $(date)" >> log.txt
else
mkdir Журнал\ хакер
echo "Папка для журналів створена | $(date)" > log.txt
fi

while [ $number -lt 152 ]
do
if [ $number -gt 9 ]
then
if [ $number -gt 99 ] 
then
links="$number"
else
links="0$number"
fi
else
links="00$number"
fi
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0" http://www.xakep.ru/magazine/xa/$links/xa_$links.pdf -P /home/$LOGNAME/Журнал\ хакер
#echo "http://www.xakep.ru/magazine/xa/$links/xa_$links.pdf"
echo $number > number.txt
number=$(( $number + 1 ))
done
Подякували: Replace1

Re: bash скрипти

Вирішив ще поділитися корисними сніпетами на shell.
Строка, як масив символів:

string="hello"
char=${string:0:1}

В даному випадку $char буде мати значення h.

Зчитати файл у масив:

file="/path/to/file/list.txt"

index=0
while read line ; do
    array[$index]="$line"
    index=$(($index+1))
done < $file

echo "${array[*]}"


Взято з уже відкритої теми: http://replace.org.ua/topic/108/

Визначити кількість елементів у масиві:

array[0]="0"
array[1]="1"
array_elements=${#array[@]}

Змінній array_elements буде присвоєно 2

p.s: це не всі, оскільки пишу з ноута який стоїть під управлінням win 7.
Коли буду за стаціонаром, допишу решту.

Подякували: Replace, Logans2

Re: bash скрипти

Моя лінь довела до того, що мені навіть вручну не хочеться додавати віртуальні хости, тому накидав невеликий скрипт:

#Перевіряємо, чи користувч авторизувався як root
if [ $UID -ne 0 ]
then
echo "Спочатку авторизуйтеся як root!"
exit 1
fi
#Зчитуємо останню цифру ip
if [ -f .virtual_ip.txt ]
then
read ip < .virtual_ip.txt
else
echo 2 > .virtual_ip.txt
fi
#Зчитуємо дані про віртуальний хост
echo "Введіть назву віртуального хоста"
read host_name
#Створюємо папку для сайту
mkdir "/var/www/$host_name"
#Створюємо файли логів
echo "" > /etc/httpd/logs/$host_name-error_log.txt
echo "" > /etc/httpd/logs/$host_name-access_log common.txt
#Додаємо запис у файл httpd.conf
echo "
<VirtualHost 127.0.0.$ip:80>
    ServerAdmin hanter.name@gmail.com
    DocumentRoot '/var/www/$host_name'
    ServerName $host_name
    ErrorLog logs/$host_name-error_log.txt
    CustomLog logs/$host_name-access_log common.txt
</VirtualHost>" >> /etc/httpd/conf/httpd.conf
#Додаємо запис у файл hosts
echo "127.0.0.$ip $host_name" >> /etc/hosts
echo `expr $ip + 1` > .virtual_ip.txt
Подякували: Replace1

Re: bash скрипти

"Нашрайбав" я сьогодні маленький скрипт, для накрутки рейтингів, які стоять на рушію Aardvark Top Site
Власне проблема заключається тільки у списку робочих проксі і все.
Сам скрипт:

user_agent=""
ie()
{
#Версія сумісності з Netscape
ie_moz_ver[0]="1.22"
ie_moz_ver[1]="2.0"
ie_moz_ver[2]="3.0"
ie_moz_ver[3]="4.0"

#Версія Internet Explorer
ie_version[0]="1.0"
ie_version[1]="2.0"
ie_version[2]="3.0"
ie_version[3]="4.0"
ie_version[4]="5.0"
ie_version[5]="5.5"
ie_version[6]="6.0"
ie_version[7]="7.0"
ie_version[8]="8.0"
ie_version[9]="9.0"
ie_version[10]="10.0"

#Операційні системи
ie_os[0]="Windows 95"
ie_os[1]="Windows 98"
ie_os[2]="Windows NT 4.0"
ie_os[3]="Windows NT 5.0"
ie_os[4]="Windows 2000"
ie_os[5]="Windows NT 5.01"
ie_os[6]="Windows NT 5.1"
ie_os[7]="Windows NT 5.2"
ie_os[8]="Windows NT 6.0"
ie_os[9]="Windows NT 6.1"
ie_os[10]="Windows CE"

MozVer=`expr $RANDOM % 4`
IEVer=`expr $RANDOM % 11`
Platform=`expr $RANDOM % 11`
user_agent="Mozilla/${ie_moz_ver[$MozVer]} (compatible; MSIE ${ie_version[$IEVer]}; Platform ${ie_os[$Platform]})"
}

mozilla()
{
#Операційні системи
mozilla_os[0]="Windows 95"
mozilla_os[1]="Windows 98"
mozilla_os[2]="Windows NT 4.0"
mozilla_os[3]="Windows NT 5.0"
mozilla_os[4]="Windows 2000"
mozilla_os[5]="Windows NT 5.01"
mozilla_os[6]="Windows NT 5.1"
mozilla_os[7]="Windows NT 5.2"
mozilla_os[8]="Windows NT 6.0"
mozilla_os[9]="Windows NT 6.1"
mozilla_os[10]="Windows CE"

#Revision
mozilla_revision[0]="m18"
mozilla_revision[1]="1.0rc3"
mozilla_revision[2]="1.7.8"
mozilla_revision[3]="1.8a2"

Platform=`expr $RANDOM % 11`
Revision=`expr $RANDOM % 4`
user_agent="Mozilla/5.0 (${mozilla_os[$Platform]}; N; rv:${mozilla_revision[$Revision]}) Gecko/20100101 Firefox/14.0.1"
}

opera()
{
#Версії
opera_version[0]="9.80"
opera_version[1]="10.0"
opera_version[2]="10.61"
opera_version[5]="11.0"
opera_version[4]="12.0"

#Операційні системи
opera_os[0]="Windows 95"
opera_os[1]="Windows 98"
opera_os[2]="Windows NT 4.0"
opera_os[3]="Windows NT 5.0"
opera_os[4]="Windows 2000"
opera_os[5]="Windows NT 5.01"
opera_os[6]="Windows NT 5.1"
opera_os[7]="Windows NT 5.2"
opera_os[8]="Windows NT 6.0"
opera_os[9]="Windows NT 6.1"
opera_os[10]="Windows CE"

#Presto
opera_presto[0]="2.6.30"
opera_presto[1]="2.7.62"
opera_presto[2]="2.10.229"

#Мови
opera_lang[0]="EN"
opera_lang[1]="RU"

Platform=`expr $RANDOM % 11`
Lang=`expr $RANDOM % 2`
Presto=`expr $RANDOM % 3`
Version=`expr $RANDOM % 5`

user_agent="Opera/9.80 (${opera_os[$Platform]}; N; ${opera_lang[$Lang]}) Presto/${opera_presto[$Presto]} Version/${opera_version[$Version]}"
}

file="proxy.txt"
index=0
while read line 
do
    proxy[$index]="$line"
    index=$(($index+1))
done < $file
num_proxy=${#proxy[@]}
while [ $num_proxy -gt 0 ]
do
browser=`expr $RANDOM % 3`
case $browser in
0) ie ;;
1) mozilla ;;
2) opera ;;
esac
curl -s --proxy ${proxy[$num_proxy]} --user-agent $user_agent http://top.ridna.com/button.php?u=Hanter21
num_proxy=$(( $num_proxy - 1 ))
done

8

Re: bash скрипти

Мені на роботі сказали до нового року вивчити bash.) Тепер навіть не знаю з чого почати, може щось підкажете)

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

9

Re: bash скрипти

А що його вчити, треба ставити практичні задачі і шукати методи їх вирішення.

Подякували: Voron, Patron, doh3

10

Re: bash скрипти

А що його вчити, треба ставити практичні задачі і шукати методи їх вирішення.

Для мене це також один з найкращих способів. Це як ТДД Перше кодиш поітм коли читаєш літературу уже знаєш що можна було б краще покодити і уже є хоч поняття. А то перечитати гору літератури нічого не дасть.
Почніть з простих команд і записуйте все собі. Наприклад як скачати всі сторінки з сайту через wget =) Архівацій і розархівація і т д;)

11

Re: bash скрипти

Я притримуюсь такої ж думки, але зазначу, що приклади наведених завдань аніскілечки не допоможуть в вивченні командної оболонки, бо виконуватимуть ці дії лише  сторонні програми. Треба замість того приділити увагу внутрішнім можливостям самого башу як мови програмування.

Світ врятують краса та масові розстріли
Лепей жывы сабака, чымся здохлы леў
Хто до нас із томагавком прийде, той од томагавка і томагавкнеться

12

Re: bash скрипти

funivan написав:

Почніть з простих команд і записуйте все собі. Наприклад як скачати всі сторінки з сайту через wget  Архівацій і розархівація і т д;)

Я так і роблю. Почав з тих команд які потрібні при роботі веб-програміста. На даний момент я вже сміло використовую такі команди та оператори:
cd - зміна папки
ls - вміст папки
cp - копіювання
cat - лістинг, конкатенація файлів
tar - архіватор,
gunzip - толком не поняв що таке але знаю що може розпакувати архів ***.tar.gz
mysqldump - бекап бази даних
find - пошукова тузла,
chmod - зміна прав,
man - мануал по команді
| - обєднання команд в ланцюжок
> або < - перенаправлення виводу або вводу команд

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

13

Re: bash скрипти

Ось мій скрипт синхронізації даних
Синхронізує за допомогою rsync по ssh
Для прикладу у мене є дома 1 компютер і 1 нетбук
Запускаю скрипт на ноубуці і вказую які папки синхронізувати. Скрипт знає куди їх відправити так як я вказав список ір компютерів на які потрібно розсилати інформацію.
Приклади запуску скрипта

./sync.sh -rd vendors test # синхронізує папку vendors і test

Опція r - означає run. Якщо не вказана тоді покажеться тільки інформаційний вившд. Тобто які зміни могли б відбутись.
опція d - означає --delete Видалення. Тобто якщо я на нетбуці видалю якийсь файл і синхронізую папку тоді на інших компютерах цей файл пропаде також)
Якщо щось питайте.

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

#!/bin/bash


run=no
delete=no

 # default array of sync ips
  REMOTE=(
   '192.168.1.10'  # local home PC
   '192.168.1.11'   # netbook
  )


  while getopts "rd" optname
    do
      case "$optname" in
        "r")
          run=yes
        ;;
        "d")
          delete=yes 
        ;;
        ;;
        "?")
          echo "Unknown option $OPTARG"
          ;;
        ":")
          echo "No argument value for option $OPTARG"
          ;;
        *)
        # Should not occur
          echo "Unknown error while processing options"
          ;;
      esac
    done


  DIRS="${@:$OPTIND}";
  if [ "$DIRS" = "" ] 
  then
    echo "please set dirs";
    exit
  fi
  
    
  additiona_options=()

  # check if test only
  if [ $run == 'no' ]; then
    additiona_options[1]="--dry-run "
  fi
  
  # check if delete
  if [ $delete == 'yes' ]; then
    additiona_options[2]="--delete "
  fi
  


  # get ip of current computer
  IP=`ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'`;
  echo "Current ip is: $IP"
    
  
  # delete current ip from REMOTE hosts
  SyncTo=${REMOTE[@]#$IP}
  

 
  # sync with computers
  for ip in ${SyncTo[*]}
  do
    echo "";
    echo "Start sync with $ip"
    for dir in $DIRS
    do
      
      SOURCE="../www/$dir/"
      DESTINATION="work/www/$dir"
      
      echo $SOURCE
      echo $DESTINATION
      
      
      rsync -CELgthapvzi -e ssh $SOURCE ivan@$ip:$DESTINATION --progress --itemize-changes ${additiona_options[@]}
    done
  done

14

Re: bash скрипти

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

#!/bin/bash
SAVE='/home/hanti/Templates/FreeTemplate'
page=1 #сторінка з шаблонами
pageUrl='http://all-free-download.com/free-website-templates/page/' 
templateName="$SAVE/temp/Template.txt"
Temp='' 
index=0 
line=''

 if [ ! -d $SAVE/temp ]
  then
   mkdir $SAVE/temp
 fi 

 for page in $( seq 1 163 ) 
   do
   Temp=$(curl -A "Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0" "$pageUrl$page" )
   echo $htmlPage > $SAVE/temp/html.txt
   grep -o "<div><a href=\"http://all-free-download.com/free-website-templates/[^\"]*\" title=\"[^\"]*\" >[^\"]*</a></div>" $SAVE/temp/html.txt | grep -o "http://all-free-download.com/free-website-templates/[^\"]*" > $SAVE/temp/html.txt
    Temp=$(sed "s/http:\/\/all-free-download.com\/free-website-templates\///g" links.txt | sed "s/.html//g")
    echo "$Temp" >> $templateName 
  done 

  
    while read line 
     do
    mkdir $SAVE/$line
     wget --user-agent="Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0" http://images.all-free-download.com/images/templates_large/$line.jpg -P $SAVE/$line
     wget --user-agent="Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20100101 Firefox/17.0" http://files.all-free-download.com/downloadfiles/templates/$line.zip -P $SAVE/$line
    index=$(($index+1))
    done < $file
 
 echo 'Завантаження завершене'

15 Востаннє редагувалося Адріян Ігорович (29.01.2013 18:52:32)

Re: bash скрипти

Функція для виводу кольорового тексту у консолі.
Функції передаються 3 параметри, 1 - повідомлення, 2 - колір тексту, 3 - колір фону

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

#!/bin/bash
 print ()
 {
    color=$2
    background=$3
    text=$1
    
    echo -e '\E['${color}';'${background}'m'"\033[1m"${text}"\033[0m"
 }

Коди кольорів:
http://hanter.name/files/replace/%D0%B7%D0%BD%D1%96%D0%BC%D0%BE%D0%BA12.png

Подякували: Bartash1

16 Востаннє редагувалося Адріян Ігорович (16.02.2013 12:07:52)

Re: bash скрипти

Повідомлення видалено.

17 Востаннє редагувалося ADR (02.02.2013 19:54:16)

Re: bash скрипти

<видалено ;)>

Видаліть, будь ласка, це повідомлення, бо схоже що у мене немає таких прав)

18

Re: bash скрипти

ПС в цій темі дозволяється задавати питання чи тільки готові рішення?

Тільки готові рішення.
Якщо у Вас є якісь запитання то створюйте краще нову тему.

19

Re: bash скрипти

Написав міні скрипт, а точніше аналог функції explode[php]

#/bin/bash 
 
 string=$1 #строка, яку треба розбити
 Separator=$2 #Символ через який розбивається строка
 positionSeparator=(0) #Позиції входження символа через який розбивається строка(s)
 explodeString=() #Сюди поміщається уже розділена строка(s)
 keyPositionSeparator=0 #Без цього не працює(s)
 string="$string$Separator" #А без цього, останнє входження не буде поміщено у масив(s)
 
  for i in $(seq 0 `expr ${#string} - 1`)
   do
    if [ "${string:$i:1}" = "$Separator" ]
     then
       if [ "$keyPositionSeparator" -ne 0 ]
        then
         tmp=`expr ${positionSeparator[$keyPositionSeparator]} + 1`
         explodeString[$keyPositionSeparator]=${string:$tmp:`expr $i - $tmp`}
         keyPositionSeparator=`expr $keyPositionSeparator + 1`
         positionSeparator[$keyPositionSeparator]="$i"
        else
         explodeString[$keyPositionSeparator]=${string:${positionSeparator[$keyPositionSeparator]}:`expr $i - ${positionSeparator[$keyPositionSeparator]}`}
         keyPositionSeparator=`expr $keyPositionSeparator + 1`
         positionSeparator[$keyPositionSeparator]="$i"
       fi 
    fi
   done

скрипту передаються 2 параметри.
1 – це строка, яку треба розділити.
2- це символ через який розділяти.
Приклад:
explode.sh this+is+string +

В результі масив explodeString буде мати 3 елементи.

${explodeString[0]} -> this
${explodeString[1]} -> is
${explodeString[2]} -> string

20 Востаннє редагувалося Адріян Ігорович (29.03.2013 15:28:55)

Re: bash скрипти

Скрипт: Restore permissions
Призначення: Відновлення прав доступу до файлів та директорій
Скажу декілька слів. Досить давно у мене виникали такі ситуації, коли
треба було вернути старі права доступу до файлів та тек, але оскільки я
не міг запам’ятати дефолтні права доступу, приходилося все на листку записувати.
Так і виникла ідея зробити таку міні утилітку, для відновлення прав доступу.
Скрипт вміє робити таблиці з правами доступу до кожного файлу/теки, ви просто вказуєте
теку, та бажану назву таблиці, а все решту скрипт робить сам.
Ось власне і сам скрипт:
P.S: впишіть свої шляхи у змінних WorkDir та PathSaveTable

#!/bin/bash    

# Restore permissions
# Відновлення прав доступу до файлів та директорій
# Hanter www.hanter.name

 WorkDir="/home/hanti/rp/" #Тека у якій знаходяться налаштування та тимчасові файли програми.
 PathSaveTable="/home/hanti/" #Тека у яку будуть зберігатися таблиці з списками файлів/тек з правами доступу
 
 Start()
 {
  if [ ! -d "$WorkDir" ]
   then
    mkdir "$WorkDir"
   fi
   
   clear
   
   select Action in "Переглянути існуючі таблиці" "Створити нову таблицю" "Відновити із таблиці" "Завершити роботу"
    do
     break
    done
    
    case "$Action" in
       "Переглянути існуючі таблиці")
        echo -e "Наявні таблиці: \n"
         
         if [ -z $(ListTable) ]
          then
           echo "На даний час таблиці відсутні."
           sleep 1 ; clear
           Start
          else
          ListTable
         fi  
           
       ;;
       "Створити нову таблицю") 
        echo -e "Створення нової таблиці... \n Введіть шлях до теки:"
         read PathTo
        echo "Введіть назву таблиці:"
         read TableName 
        GenerateTable "$PathTo" "$TableName"  
       ;;
       "Відновити із таблиці")
        echo -e "Відновлення із таблиці... \n Введіть назву таблиці, без розширення:"
         read TableName
        echo "Введіть шлях до теки у якій потрібно відновити права доступу:"
         read PathTo 
        Restore "$PathTo" "$TableName" 
       ;; 
       "Завершити роботу")
        echo "Виходимо..."
        sleep 1 ; clear 
        exit 0
       ;;
       *)
        echo "Невідома дія"
        sleep 1 ; clear
        Start
       esac   
      
 }
 
 ListTable()
 {
    cd "$PathSaveTable" 
    ls *.rcmt
 }
 
 ConvertPermissions()
 {
    Permissions=$1
    Number=0
    
    for i in `seq 0 2`
     do
     case ${Permissions:$i:1} in
      "r")
       Number=`expr $Number + 4`
        ;;
      "w")
       Number=`expr $Number + 2`
        ;;
      "x")
       Number=`expr $Number + 1`    
        ;;
      *) 
       Number=`expr $Number + 0` 
     esac
    done    
   echo -n "$Number" 
 }
 
 GenerateTable()
 {
  PathTo=$1
  TableName=$2
  
   if [ ! -d "$PathTo" ]
    then
     echo "Шлях який Ви ввели є недійсним..."
     sleep 1 ; clear
     Start
   fi 
  
  cd "$PathTo"
  du -a > $WorkDir"ListFileF.txt"
  cat /dev/null > $WorkDir"ListFileS.txt"
  
  index=0
     while read line
      do
      
       for i in `seq 0 ${#line}`
         do
          if [ "${line:$i:2}" = "./" ]
           then
            echo ${line:`expr $i + 2`:${#line}} >> $WorkDir"ListFileS.txt"
           fi 
         done
         
        index=`expr $index + 1`
     done < $WorkDir"ListFileF.txt"
     
     rm -f $WorkDir"ListFileF.txt"
    
     cat /dev/null > "$PathSaveTable""$TableName.rcmt"
     
     index=0
     while read line
      do
        StringDataFile=$(ls -ld "$line")
        StringDataFile=${StringDataFile:1:9}
        rwx=()
       
         for i in `seq 0 2`
          do
           tmp=${StringDataFile:`expr 3 \* $i`:3}
           rwx[$i]=$(ConvertPermissions "$tmp")
          done
   
            echo "${rwx[0]}${rwx[1]}${rwx[2]}$line" >> "$PathSaveTable""$TableName.rcmt"
        index=`expr $index + 1`
     done < $WorkDir"ListFileS.txt"
     
     rm -f $WorkDir"ListFileS.txt"
     
 }
 
 Restore()
 {
  PathTo=$1     
  TableName=$2
  
  cd "$PathTo"
  
   if [ ! -f "$PathSaveTable""$TableName.rcmt" ]    
    then
     echo "Неможливо завантажити таблицю з іменем $TableName ..."
     sleep 1 ; clear
     Start
   fi  
   
   while read line
     do
      strlen=${#line}
      echo -n "chmod ${line:0:3} "
      echo ${line:3:`expr $strlen - 3`}
      chmod ${line:0:3} "$PathTo${line:3:`expr $strlen - 3`}"
     index=`expr $index + 1`
    done < $PathSaveTable"$TableName.rcmt"
 }

Start

Вподальшому планую розшири функціонал, виправити старі баги та додати нові.