progress_bar.sh :: kamera.sh :: add_md5_to_pdf.sh :: arp_log.sh :: fs_backup.sh :: mysql_backup.sh :: ntpdate_cron.sh :: beos_mail2mbox.sh :: net_stat.sh :: install_dom0.sh :: smtp.sh :: send_sms.sh :: sshfs-via-tunel-mount.sh :: tunel_ssh_over_vlan.sh :: alarm.sh :: zegar.sh

Drobne skrypty shellowe

progress_bar.sh

#!/bin/bash

# skrypt jest prostym rozwiązaniem wypisującym kropki podczas działania innego procesu
# (informujące o jego działaniu)

# urucahmiamy (w tle) jakiś proces o działaniu którego chemy informować
sleep 30 > /dev/null &

PID=`jobs -p 1`
while [ -e /proc/$PID -a "$PID" != "" ]; do
  # w zasadzie wystarczyłoby pobieranie PIDu powyższą metodą w pętli
  # i sprawdzanie czy niepusty,
  # jednak metoda z sprawdzaniem /proc wydaje się bardziej ogólna
  echo -n '.'
  sleep 1
done
echo ""

XHTML generated by highlight (http://www.andre-simon.de/) from progress_bar.sh

kamera.sh

#!/bin/bash

# skrypt jest próbą zautomatyzowania wykonywania i pobierania zdjęcia z aparatu cyfrowego
# zabezpieczoną przed błędami transmisji (każde z poleceń wykonuje się do skutku)

if [ -f /tmp/kamera.sh_pracuje ]; then
  echo "Skrypt tworzacy fotki aktualnie dziala"
  exit
fi

:> /tmp/kamera.sh_pracuje

echo " Przygotowywuje katalog roboczy"
  katalog=/tmp/`date +%s`/
  mkdir $katalog
  cd $katalog

echo " Robie fotke"
  while ( ! gphoto2 --capture-image ) do
    sleep 2;
  done

echo " Pobieram fotki"
  while ( ! gphoto2 --get-all-files ) do
    sleep 2;
  done

echo " Kasuje fotki"
  while ( ! gphoto2 --delete-all-files ) do
    sleep 2;
  done

rm -f /tmp/kamera.sh_pracuje

XHTML generated by highlight (http://www.andre-simon.de/) from kamera.sh

add_md5_to_pdf.sh

#!/bin/bash

# script to add md5 sum and other info to pdf for printing

STAMPFILE=`mktemp`
UP=false

INPUT="$1"
[ "$2" = "up" ] && UP=true

MD5=`md5sum "${INPUT}" | cut -f1 -d' '`
INFO=`pdfinfo "${INPUT}" | grep '^Page size:'`
INFO_X=`echo $INFO | awk '{print $3 * 10}'`
INFO_Y=`echo $INFO | awk '{print $5 * 10}'`
OFFSET_X="32"
if $UP; then
  OFFSET_Y=$[ $INFO_Y/10 - 64 ]
else
  OFFSET_Y="32"
fi

gs -o ${STAMPFILE} -sDEVICE=pdfwrite -g${INFO_X}x${INFO_Y} \
  -c "/Helvetica-Bold findfont 8 scalefont setfont" \
  -c "0 .8 .8 0 setcmykcolor" -c "${OFFSET_X} ${OFFSET_Y} moveto" \
  -c "(MD5: ${MD5}  FILE: ${INPUT}) show" -c "showpage"

pdftk "${INPUT}" stamp ${STAMPFILE} output "${INPUT%.pdf}__MD5__.pdf"

\rm ${STAMPFILE}

XHTML generated by highlight (http://www.andre-simon.de/) from add_md5_to_pdf.sh

arp_log.sh

#!/bin/bash

while true; do
  date >> /var/log/arp.log
  cat /proc/net/arp >> /var/log/arp.log
  echo "" >> /var/log/arp.log
  sleep 150
done

XHTML generated by highlight (http://www.andre-simon.de/) from arp_log.sh

fs_backup.sh

#!/bin/bash

CO=/
GDZIE=/dev/sdb1
TMP=/mnt/backup/local/root

mount $GDZIE $TMP
rsync -avx --delete --exclude="/DYSK.txt" $CO $TMP
echo "$GDZIE ($CO fs backup)" > $TMP/DYSK.txt
umount $TMP

XHTML generated by highlight (http://www.andre-simon.de/) from fs_backup.sh

mysql_backup.sh

#!/bin/bash

savelog -m 640 -c 7 mysql.dump
mysqldump --defaults-extra-file="/etc/my.backu.acess.cfg" --all-databases > mysql.dump
# gdzie /root/.my.backu.acess.cfg:
#   [client]
#   host=localhost
#   user=backup
#   password=mysecret
#   #database=
# oczywiście plik ten powinien mieć odpowiednie prawa dostępu

XHTML generated by highlight (http://www.andre-simon.de/) from mysql_backup.sh

ntpdate_cron.sh

#!/bin/bash 

# zabezpieczenie przed zapetleniem spowodowanym zmiana czasu przez ntpdate
# i wywolywaniem skryptu w okreslonej godzinie przez cron'a
sleep 10

ntpdate-debian > /dev/null

XHTML generated by highlight (http://www.andre-simon.de/) from ntpdate_cron.sh

beos_mail2mbox.sh

#!/bin/bash

# skrypt konweruje skazany katalog z wiadomosciami w formacje skrzynki BeOS'owej
# na format standardowego mboxa (konwersja postaci linii From)
#
# katalog podawany jest jako pierwszy argument,
# listy zapisywane s do korespondencja_zbiorcza_nazwa_katalogu


if [ "$1" = "" ]; then
  echo "Musisz podać katalog"
  exit
fi


for f in ./$1/*; do
  #echo "$f"; formail -x "Date:" < "$f"
  formail -a "Date:" < "$f" >> korespondencja_zbiorcza_tmp_$1
  echo "" >> korespondencja_zbiorcza_tmp_$1
done;


# Konwersja linii From do postaci : From user@host.domena  Thu Aug 19 19:43:33 2004
awk '
  # przypadek gdy mamy dzien tygodnia
  $1 == "From"  &&  $3 ~ "[A-Z][a-z][a-z]," {
    printf("%s %s %s %s %02d %s %s\n", $1, $2, substr($3,1,3), $5, $4, $7, $6);
  }

  # przypadek gdy nie mamy dnia tygodnia
  $1 == "From"  &&  $3 !~ "[A-Z][a-z][a-z]," {
    printf("%s %s %s %s %02d %s %s\n", $1, $2, "Xxx", $4, $3, $6, $5);
  }

  #pozostałe linie
  $1 != "From" {
    printf("%s\n", $0);
  }
' < korespondencja_zbiorcza_tmp_$1 > korespondencja_zbiorcza_$1

XHTML generated by highlight (http://www.andre-simon.de/) from beos_mail2mbox.sh

net_stat.sh

#!/bin/bash

# konfiguracja
RX_ERR="3072"
TX_ERR="3072"
INTERFACE=${1-eth0}
WAIT_TIME=0.1
FILENAME="/tmp/spped_$WAIT_TIME_$INTERFACE"

zczytaj() {
  cat /proc/net/dev /proc/uptime | tr ':' ' ' | awk '
    $1=="'$INTERFACE'" {
      printf("NEW_rec=%s; NEW_tran=%s; ", $2, $10)
    }
    END {
      printf("NEW_time=%s;\n", $1)
    }'
}

# inicjalizacja i wypisanie nagłówka
zczytaj > ${FILENAME}_new.txt
date +"%s,  %Y-%m-%d %H:%M:%S %z (%Z),  %A" --utc
echo -e "   RX    \t   TX"
sleep $WAIT_TIME

while true; do
  # zapamietujemy poprzednie jako stare
  sed 's%NEW%OLD%g'< ${FILENAME}_new.txt > ${FILENAME}_old.txt
  
  # zczytujemy dane do pliku
  zczytaj > ${FILENAME}_new.txt

  # wczytujemy pliki
  . ${FILENAME}_new.txt
  . ${FILENAME}_old.txt

  # dokonujemy obliczeń
  TIME=`echo "scale=4; $NEW_time-$OLD_time" |bc`
  RX_SPEED=`echo "scale=4; (8/1024)*($NEW_rec-$OLD_rec)/($TIME)" |bc`
  TX_SPEED=`echo "scale=4; (8/1024)*($NEW_tran-$OLD_tran)/($TIME)" |bc`
  
  # formatujemy wynik
  RX_SPEED=`env LANG=C printf "%09.4f" $RX_SPEED`
  TX_SPEED=`env LANG=C printf "%09.4f" $TX_SPEED`
  
  # wypisujemy wynik
  if [ `echo $RX_SPEED| cut -f1 -d.` -gt $RX_ERR -o `echo $TX_SPEED| cut -f1 -d.` -gt $TX_ERR ]; then
      date +"%s,  %Y-%m-%d %H:%M:%S %z (%Z),  %A" --utc
      echo -en "$RX_SPEED\t$TX_SPEED\n"
  else
      echo -en "$RX_SPEED\t$TX_SPEED\r"
  fi

  sleep $WAIT_TIME
done;

XHTML generated by highlight (http://www.andre-simon.de/) from net_stat.sh

install_dom0.sh

#!/bin/bash

if [ $# -ne 2 ]; then
  echo "USAGE $0 system_device hostname-instalowanego-dom0"
  exit
fi

set -x
DEV=$1
MNT=/mnt/

parted $DEV "mklabel gpt"
parted $DEV "mkpart grub 0 1000kB";
parted $DEV "set 1 bios_grub on"
parted $DEV "mkpart raid 1MB 100%"; 

pvcreate ${DEV}2
vgcreate lvm0 ${DEV}2
lvcreate -L 12GB -n dom0 lvm0;
mkfs.xfs /dev/lvm0/dom0;

mount /dev/lvm0/dom0 $MNT

debootstrap stable $MNT ftp://ftp.icm.edu.pl/pub/Linux/debian/

echo "search vls.icm.edu.pl" > ${MNT}etc/resolv.conf;
echo "nameserver 2001:6a0:0:2000::18" >> ${MNT}etc/resolv.conf

echo "deb http://ftp.icm.edu.pl/pub/Linux/debian squeeze main non-free" > ${MNT}etc/apt/sources.list;
chroot $MNT aptitude update
chroot $MNT aptitude install firmware-bnx2 firmware-bnx2x;

echo "deb http://ftp.icm.edu.pl/pub/Linux/debian squeeze main" > ${MNT}etc/apt/sources.list;
chroot $MNT aptitude update
chroot $MNT aptitude install debian-archive-keyring puppet grub;

mount -t proc proc /mnt/proc
mount -t sysfs sysfs /mnt/sys
mount -o rbind /dev/ /mnt/dev
grub-install --root-directory=${MNT} --recheck $DEV
set +x

answer="x"
while [ "$answer" != "n" ]; do

  #echo "2001:6a0:0:21::d1:4 puppet.vls.icm.edu.pl" > ${MNT}etc/hosts
  chroot $MNT puppet agent --test --server puppet.vls.icm.edu.pl --fqdn $2.vls.icm.edu.pl

  answer="x"
  while [ "$answer" != "y" -a "$answer" != "n" ]; do
    echo "Ponowic pobieranie konfigu z puppet'a (y/n)?"
    read answer
  done
done
:> ${MNT}etc/udev/rules.d/70-persistent-net.rules

XHTML generated by highlight (http://www.andre-simon.de/) from install_dom0.sh

smtp.sh

#!/bin/bash

# wywołanie: while true; do netcat -l -p 25 -e smtp.sh; done

# wymagania: busybox z netcatem potrafiącym odpalić skrypt w -e
# na openwrt trzebabylo jako /bin/sh dać basha bo busybox chiał odpalać tylko komendy wbudowane

DOMAIN="opcode.eu.org"


IS_DATA=false; SENDER=""; RECEIVER="";
echo "220 $DOMAIN SMTP server by RRP `date -R`"

while read line; do
  echo "Q (data=$IS_DATA): Y $line" >> /tmp/smtp-log.txt
  
  if $IS_DATA; then
    if echo "$line" | tr -d '\r' | awk '$0=="." {exit 0;} {exit 1}'; then
      IS_DATA=false
      echo -en "250 OK\r\n"
      continue
    fi
    
    ##########################
    # WŁAŚCIWA TREŚĆ SKRYPTU #
    ##########################
    # jest to powtarzane dla każdej linii przesylanej jako tresc maial (lacznie z naglowkami)
    # możemy sprawdzać nadawcę kopertowego: "$SENDER"
    # możemy sprawdzać adresata kopertowego: "$RECEIVER"
    # możemy sprawdzać aktualną linię z maila: "$line" tak jak to pokazano poniżej:
    
    echo "$line" | tr -d '\r' | awk '
      $1=="call" {
        cmd=sprintf("make_call.sh %s %s", $2, $3);
      }
      $1=="stop" {
        cmd=sprintf("killall .... ");
      }
      END {
        system(cmd);
      }
    ' > /dev/null 2> /dev/null &
    # UWAGA: musi to być wyciszone i przechodzić w tło
    
  else
    echo "$line" | tr -d '\r' | awk -v DOMAIN="$DOMAIN" '
    BEGIN {
      IGNORECASE=1
      FS="[ :\t]+"
    }
    $1 ~ "^(HE)|(EH)LO$" {
      printf("250 %s Hello %s, pleased to meet you\r\n", DOMAIN, $2);
      system( sprintf("echo \"R: 250 %s Hello %s, pleased to meet you\" >> /tmp/smtp-log.txt", DOMAIN, $2) );
      exit 0;
    }
    $1 ~ "^MAIL$" && $2 ~ "^FROM$" && $3 != "" {
      printf("250 OK\r\n");
      system( sprintf("echo \"R: 250 OK\" >> /tmp/smtp-log.txt") );
      exit 1;
    }
    $1 ~ "^RCPT$" && $2 ~ "^TO$" && $3 != "" {
      printf("250 OK\r\n");
      system( sprintf("echo \"R: 250 OK\" >> /tmp/smtp-log.txt") );
      exit 2;
    }
    $1 ~ "^DATA$" {
      printf("354 Enter message, ending with \".\" on a line by itself\r\n");
      system( sprintf("echo \"R: 354 Enter message, ending with \".\" on a line by itself\" >> /tmp/smtp-log.txt") );
      exit 3;
    }
    $1 ~ "^QUIT$" {
      printf("221 %s closing connection\r\n", DOMAIN);
      system( sprintf("echo \"R: 221 %s closing connection\" >> /tmp/smtp-log.txt", DOMAIN) );
      exit 4;
    }
    {
      printf("500 unrecognized command\r\n");
      system( sprintf("echo \"R: 500 unrecognized command (%s)\" >> /tmp/smtp-log.txt", $1) );
      exit 0;
    }
    '
    case $? in
      1) SENDER=`echo $line | tr -d '\r' | awk 'BEGIN {FS="[ :\t<>]+"} {print $3}'` ;;
      2) RECEIVER=`echo $line | tr -d '\r' | awk 'BEGIN {FS="[ :\t<>]+"} {print $3}'` ;;
      3) IS_DATA=true ;;
      4) exit ;;
    esac
  fi
done;

XHTML generated by highlight (http://www.andre-simon.de/) from smtp.sh

send_sms.sh

#!/bin/bash

##
## CONFIG
##

MODEMHOST="ip.ip.ip.ip"
MODEMPORT="port"

PORT="/tmp/vmodem.$MODEMHOST.$MODEMPORT"
NUMER_CSCA="+48501200777"
PIN=0000

function init_port() {
  socat pty,link=$PORT,b9600,echo=0 tcp:$MODEMHOST:$MODEMPORT &
  sleep 0.5
  #stty -F $PORT 115200 -echo parodd
}

# ON SOCAT REMOTE SIDE:
# screen -S socat sh -c "while true; do socat tcp-l:$MODEMPORT,reuseaddr,fork,bind=$MODEMHOST file:/dev/ttyUSB0; sleep 1; done"

# IN PROCMAILRC:
#:0 hw
#subject=|formail -xSubject:
#:0 h : /tmp/procmail_sending_sms
#|/etc/mail/procmail_users_scripts/send_sms.sh +$PHONE_NUMBER "$subject" 50



##
## INIT SCRIPT
##

echo "  -> Sending SMS \"$2\" to $1" >&2

if [ $# -lt 2 ]; then
        echo "USAGE: $0 numer_telefonu wiadomosc [num]"
  echo "Optional \"num\" is uset to cut \"wiadomosc\" to max \"num\" characters"
        exit
fi

if [ $# -eq 3 ]; then
  msg=`echo $2 | cut -c 1-$3`
else
  msg=$2
fi

function recive_from_modem() {
  while read -t 1 l; do
    [ "$l" != "" ] && echo $l >&2
  done < $PORT
}

function send_to_modem() {
  [ -e $PORT ] || init_port
  echo -n -e "$1" > $PORT
  recive_from_modem
}



##
## SENDING MESSAGE
##

[ $PIN -ne 0 ] && send_to_modem "AT+CPIN=\"$PIN\"\015"
send_to_modem "ATV1Q0E1\015"
send_to_modem "AT+CSCA=\"$NUMER_CSCA\"\015"
send_to_modem "AT+CMGF=1\015"
send_to_modem "AT+CMGS=\"$1\"\015"
send_to_modem "$2\032"



##
## ENDING SCRIPT
##

sleep 10
recive_from_modem
echo "  -> SMS was send" >&2

XHTML generated by highlight (http://www.andre-simon.de/) from send_sms.sh

sshfs-via-tunel-mount.sh

#!/bin/bash

# skrypt wymaga dostepu ssh do lokalnego hosta w oparciu o nazwę hosta zwracana przez hostname
# oraz odpowiedniego skonfigurowania icm-ws_tunel w ~/.ssh/config (musi wskazywać na host który montujemy)

if netstat -a -n --ip --inet6 | grep '5555.*LISTEN' > /dev/null; then exit; fi

konsole=$(dcopstart konsole-script)

session=$(dcop $konsole konsole currentSession)
dcop $konsole $session renameSession 'tunel'
dcop $konsole $session sendSession 'HISTFILE=""; export HISTFILE;'
dcop $konsole $session sendSession 'echo LACZENIE SIE Z TUNELEM: ssh sshfs-tunel'
dcop $konsole $session sendSession "ssh -t icm 'ssh -t sshfs-tunel \"ssh -R 5555:localhost:22 `hostname`\"'"

session=$(dcop $konsole konsole newSession)
dcop $konsole $session renameSession 'sshfs'
dcop $konsole $session sendSession 'HISTFILE=""; export HISTFILE;'
dcop $konsole $session sendSession 'fusermount -u /home/rrp/SSHFS'
dcop $konsole $session sendSession 'sshfs -o nonempty -o workaround=rename sshfs-tunel:. /home/rrp/SSHFS'

XHTML generated by highlight (http://www.andre-simon.de/) from sshfs-via-tunel-mount.sh

tunel_ssh_over_vlan.sh

#!/bin/bash

# skrypt zestawia tunel ssh na połączeniu poprzest most WiFi
# most WiFi dostepny jest poprzez tagowane VLANy
# 172.16.16.0/28 - adresy w VLANie po naszej stronie
# 172.16.16.32/30 - adresy mostu WiFi
# 172.16.16.16/28 - adresy w VLANie po drugiej stronie

NUM=${1:-0}

# ID VLANu po naszej stronie
VLAN_ID=116
# nasze IP w VLANie (z maską w notacji CIDR)
VLAN_IP="10.10.1.9/28"
# IP Acess Pointa w naszym VLANie
VLAN_AP="10.10.1.1"

# IP sieci połączeniowej WiFi
WIFI_NET="10.10.1.32/30"

# IP sieci VLANu po drugiej stronie
REMOTE_NET="10.10.1.16/28"
# IP serwera tunelowego SSH
REMOTE_IP="10.10.1.30"
# dodatkowe opcje SSH
SSH_ARGS="-p4022"

# adresy tunelu SSH
TUN_LOCAL_IP="10.10.1.33"
TUN_REMOTE_IP="10.10.1.34"

# zestawienie VLANu do WIFI
modprobe 8021q
vconfig add eth0 $VLAN_ID
ifconfig eth0.$VLAN_ID   up  $VLAN_IP
ip route add $WIFI_NET   via $VLAN_AP
ip route add $REMOTE_NET via $VLAN_AP
ifconfig eth0.$VLAN_ID mtu 1492

# zestawienie Tunelu SSH
# wymagany wpis w sshd_config po stronie zdalnej (172.16.16.30):
#   PermitTunnel yes
screen ssh -w $NUM:$NUM root@$REMOTE_IP $SSH_ARGS -t \
  'ifconfig tun'"$NUM"' up '"$TUN_REMOTE_IP"' netmask 255.255.255.252; bash'
# jakby logowac po kluczach to mozna by dodac screenowi -d -m 
#    a tak to tgrzeba podac haslo i Ctrl+D ...
ifconfig tun$NUM up $TUN_LOCAL_IP netmask 255.255.255.252
ip route add 192.168.0.0/16 via $TUN_REMOTE_IP
ip route add default        via $TUN_REMOTE_IP
echo "nameserver 8.8.8.8" > /etc/resolv.conf

echo -e "NA SERWERZE SSH:\n\t"'echo "1" > /proc/sys/net/ipv4/conf/all/forwarding'
echo -e "NA ROUTERZE ZDALNEJ SIECI:\n\tip route add $TUN_LOCAL_IP/32 via LOCALNE.IP.SERWERA.SSH;
  iptables -A POSTROUTING -t nat -o eth1 -s $TUN_LOCAL_IP -d 0.0.0.0/0 -p ! esp  -j SNAT --to-source IP.ZEWN.SERWERA.NAT"

ntpdate-debian

XHTML generated by highlight (http://www.andre-simon.de/) from tunel_ssh_over_vlan.sh

alarm.sh

#!/bin/bash

SOUND="path/to/alarm/wav.file"

PATH="$PATH:/usr/bin"

aplay "$SOUND" 2> /dev/null

if [ `who | grep ${USER-""} | awk '$2 == ":0" {print "OK";}'` != "" ]; then
  export DISPLAY=:0.0
  ( kdialog --title "ALARM" --msgbox "INFO: $*" 2> /dev/null || echo "ALARM (kdialog error): $*" >&2 ) &
  sleep 5
  if [ `jobs -r | wc -l` -eq 1 ]; then
    aplay "$SOUND" 2> /dev/null
  fi
else
  echo "ALARM (no X session): $*" >&2
fi

XHTML generated by highlight (http://www.andre-simon.de/) from alarm.sh

zegar.sh

#!/bin/bash

function print_time() {
  echo -en "`date -d @$TIMESTAMP +"%A, %Y-%m-%d %H:%M:%S  %Z (%z)"`\r"
  echo -en "`date -d @$TIMESTAMP --utc +"%A, %Y-%m-%d %H:%M:%S  %Z (%z)"`\r"
  echo "UNIX time: $TIMESTAMP seconds since the epoch"
}

# wyrównanie wyświetlania
TIMESTAMP_tmp=`date +%s`
TIMESTAMP=$TIMESTAMP_tmp
while [ $TIMESTAMP_tmp -eq $TIMESTAMP ]; do
  TIMESTAMP_tmp=$TIMESTAMP
  TIMESTAMP=`date +%s`
done

for f in `seq 1 5`; do
  print_time | aosd_cat -l 3 -p 0 -x 20 -y 20 -B black -b 35 -n "courier bold 16" -d 3 -f 100  -u 800 -o 100
  TIMESTAMP=$(( $TIMESTAMP + 1 ))
done

XHTML generated by highlight (http://www.andre-simon.de/) from zegar.sh



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/bash/shell_script) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2015-09-19 10:24:07 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).