1 Востаннє редагувалося Voron (07.08.2012 09: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 Востаннє редагувалося Пам'ять не може бути READ (07.08.2012 12:09:04)

Re: bash скрипти

Ось і знайшов. Суть скрипта у тому, що він завантажує усі шрифти з сайту ukrfonts.com.
[code= lang="sh"]
     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.?
[/code]

Подякували: Replace, Voron, Djalin, ostap34PHP4

Re: bash скрипти

Сьогодні переглядаючи флешку, знайшов ще один скрипт.
Він просто завантажує усі журнали "Хакер".
Для роботи потрібна утиліта wget.
[code= lang="sh"]
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

[/code]

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

Re: bash скрипти

Вирішив ще поділитися корисними сніпетами на shell.
Строка, як масив символів:
[code= lang="sh"]
string="hello"
char=${string:0:1}
[/code]
В даному випадку $char буде мати значення h.

Зчитати файл у масив:
[code= lang="sh"]
file="/path/to/file/list.txt"

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

echo "${array[*]}"
[/code]
Взято з уже відкритої теми: http://replace.org.ua/topic/108/

Визначити кількість елементів у масиві:
[code= lang="sh"]
array[0]="0"
array[1]="1"
array_elements=${#array[@]}
[/code]
Змінній 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
Подякували: ostap34PHP1

8

Re: bash скрипти

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

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 - мануал по команді
| - обєднання команд в ланцюжок
> або < - перенаправлення виводу або вводу команд

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

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 'Завантаження завершене'
Подякували: ostap34PHP1

15 Востаннє редагувалося Пам'ять не може бути READ (29.01.2013 17: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

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

16 Востаннє редагувалося Пам'ять не може бути READ (16.02.2013 11:07:52)

Re: bash скрипти

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

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

Re: bash скрипти

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

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

Re: bash скрипти

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

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

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
Подякували: ostap34PHP1

20 Востаннє редагувалося Пам'ять не може бути READ (29.03.2013 14: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

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