Debianizzati.Org | Forum | Blog | Guide | IRC
 
 
Forum Italiano Debian - Debianizzati.Org
Dicembre 05, 2008, 05:53:31 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Aiuto Ricerca Agenda Accedi Registrati  
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [risolto] script backup rsync - bash  (Letto 513 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Nokao
Full Member
***

Karma: +0/-0
Scollegato Scollegato

Messaggi: 165

nokao@hotmail.it
Mostra profilo WWW E-mail
« inserita:: Febbraio 05, 2007, 05:06:13 pm »

Ciao... ho letto migliaia di guide bash e sono riuscito a risolvere tutti i miei problemi, tranne uno.

Devo leggere un file di configurazione esterno per prendere dei dati, in ARRAY.

Lo script fa backup di alcuni host, il file di configurazione mi piacerebbe così:

Codice:

host1=(
 nomehost
 iphost
 path1 path2 path3 path4
)

host2=(
 nomehost
 iphost
 path5 path6
)


Il mio problema principale è che attualmente riesco a prendere nome host e iphost senza problemi da array statici, ma non so come trattare gli array...

Cioè nel bash un \"a capo\" e uno spazio sono la stessa cosa, quindi i path assumono per me lo stesso significato dei nomehost e iphost... per capirci.

Per i cicli sto usando:
Codice:
for miodato in ${host1[@]:0}
do
echo $miodato
done


Il mio problema è appunto rendere lo script intelligente, dargli un array di host e fargli estrarre da solo i dati di cui ha bisogno...

Un secondo problema è che, a lavoro finito, lo script dovrebbe capire quanti host ci sono nel file di configurazione e farsi un array MULTIPLO (array di array) per usarli tutti uno dopo l\'altro in un ciclo for...

Metto qui di seguito lo script completo qualora qualcuno mi voglia aiutare:
Codice:
(vecchio, guardare alla fine)


ARRIP, ARRHOST, e ARRPATH non dovrebbero esistere a fine lavoro, vorrei tutto su un file di configurazione con una sintassi simile all\'esempio che ho fatto sopra... ovviamente se ci sono soluzioni più facili mi va bene qualsiasi cosa.

Post modificato da: Nokao, alle: 2007/02/05 10:12

Post modificato da: Nokao, alle: 2007/02/06 13:37

Post modificato da: Nokao, alle: 2007/02/06 13:37
Registrato
Nokao
Full Member
***

Karma: +0/-0
Scollegato Scollegato

Messaggi: 165

nokao@hotmail.it
Mostra profilo WWW E-mail
« Risposta #1 inserita:: Febbraio 06, 2007, 12:30:25 am »

Mi sono spiegato male? Sad
Registrato
tindal
Administrator
Hero Member
*****

Karma: +67/-1
Scollegato Scollegato

Messaggi: 2631


Mostra profilo E-mail
« Risposta #2 inserita:: Febbraio 06, 2007, 05:12:08 am »

bash non supporta gli array multidimensionali, ma conoscendo la dimensione dei sottoarray puoi creare un array monodimensionale che si comporta in modo simile ad uno miltidimensionale: http://www.pluto.it/files/ildp/guide/abs/arrays.html

per l\'altro problema mi sa che la soluzione più agile è quella di usare awk: anche se probabilmente non sei molto contento di imparare un altro linguaggio, awk è estremamente potente in queste applicazioni, molto più di bash
http://www.dc.turkuamk.fi/docs/gnu/awk/gawk_toc.html

altrimenti, se le prestazioni non sono un problema, ti puoi arrangiare con grep e sed per leggere i dati una riga alla volta: ti basta usare sed per sostituire gli spazi di una riga con un carattere jolly (per es %) e poi risostituire quando è il momento, ma guarda che è un po\' macchinoso

ciao
tindal
Registrato

Se ci sono molti modi diversi per fare una certa cosa, ed uno di questi ha conseguenze disastrose, di sicuro qualcuno la farà in quel modo.
Nokao
Full Member
***

Karma: +0/-0
Scollegato Scollegato

Messaggi: 165

nokao@hotmail.it
Mostra profilo WWW E-mail
« Risposta #3 inserita:: Febbraio 06, 2007, 05:10:48 pm »

Ti ringrazio per la risposta, come avrai capito non sono un esperto di bash e come avrai visto il problema non è di semplice realizzazione.

Le guide che mi hai indicato le ho già lette, ho anche visto gli esempi, ma non so bene da dove iniziare per modificarli...

Potresti darmi delle \"linee guida\" per risolvere il mio problema in modo più o meno fattibile?

Infondo a me basta risolverlo in qualsiasi modo, non ho bisogno di farlo per forza in un certo modo...

Se volessi inserire un numero N di server con tutti i loro dati (nomehost ip sono sempre i primi due, e non so invece quanti path sono) come potrei fare?
Registrato
Nokao
Full Member
***

Karma: +0/-0
Scollegato Scollegato

Messaggi: 165

nokao@hotmail.it
Mostra profilo WWW E-mail
« Risposta #4 inserita:: Febbraio 06, 2007, 05:41:23 pm »

Una soluzione che mi è venuta in mente sarebbe questa:
Codice:
HOSTS=(ciao miao)
ciao=(host66 66 path66)
miao=(host65 65 path65)

for host in ${HOSTS[@]:0}
 do
  echo \'----------------------------------\'
  echo host: $host
#  echo nome: ${`echo $host`[@]:0:1}
  echo ip: ${ciao[@]:1:1}
  echo path: ${ciao[@]:2:1}
  echo \'----------------------------------\'
done


Purtroppo la riga commentata NON funziona, mi da \"bad substitution\".

Però... se riuscissi a farlo funzionare potrei referenziare un array monodimensionale mentre scorro un altro array, il che con un po\' di abilita\' e pazienza mi farebbe risolvere il problema.

E\' possibile una cosa del genere?
Registrato
Nokao
Full Member
***

Karma: +0/-0
Scollegato Scollegato

Messaggi: 165

nokao@hotmail.it
Mostra profilo WWW E-mail
« Risposta #5 inserita:: Febbraio 06, 2007, 08:04:35 pm »

Ho trovato una soluzione e per il piacere di tutti la posto qui di seguito:

Codice:
#!/bin/bash
# script.sh
# ----------------------------------------------------------------------
# -------------------------- BACKUP SCRIPT  ----------------------------
# ----------------------------------------------------------------------
# ----------------------------------------------------------------------
# ------------- PER CONFIGURARE LO SCRIPT MODIFICARE QUI ---------------
# ----------------------------------------------------------------------
# Attenzione: gli host devono essere associati ad un IP in /etc/hosts
ARRHOST=(
host1
host2
host3
host4
)
# Attenzione: ad ogni riga deve corrispondere l\'host inserito
# precedentemente ovviamente nello stesso ordine. Separatore: \':\'
ARRFILES=(
/usr/www:/var/lib/mysql:/usr/mysql_backup
/var/lib/mysql:/home/pippo:/var/office
/var/www:/var/lib/mysql
/usr/www:/var/lib/mysql:/db2home/db2inst1/
)
# ----------------------------------------------------------------------
# -------------- DA QUI IN POI NON MODIFICARE PIU NIENTE ---------------
# ----------------------------------------------------------------------

LANG=it_IT
SLASH=\'/\'
IND=0
OGGI=`date +%A`

function ControllaPath {
  if [ ! -e /backup/ ]
    then
      mkdir /usr/backup
      ln -s /usr/backup /backup
  fi
  ARRGIORNI=( CURRENT lunedì martedì mercoledì giovedì venerdì sabato domenica )
  for giorno in ${ARRGIORNI[@]:0}
  do
    if [ ! -e /backup/$giorno/ ]
      then
        mkdir /backup/$giorno
    fi
  done
}

ControllaPath
echo \' Controllo ed eventuale creazione delle cartelle finito. (/backup/*)\'
echo \'\\ Inizio dello script... oggi è \'$OGGI
echo \'=\\ Inizio degli Host\'
for BKHOST in ${ARRHOST[@]:0}
do
  echo == Backup di $BKHOST
  if [ ! -e /backup/CURRENT/$BKHOST/ ]
    then
       echo =! Creazione directory /backup/CURRENT/$BKHOST
       mkdir /backup/CURRENT/$BKHOST
  fi
  TMP=${ARRFILES[$IND]}
  QUANTI=`echo $TMP | grep -o \":\" | wc -l | sed s/\\ //g`
  i=0
  while [ \"$i\" -le $QUANTI ]
  do
      RES[$i]=${TMP%%:*}
      TMP=${TMP#*:}
      let \"i+=1\"
  done
  echo \'==\\ Inizio dei path\'
  for BKPATH in ${RES[@]:0}
  do
    percorso=${BKPATH//$SLASH/_}
    echo \'===\\ Backup di \'$BKHOST/$percorso/
    if [ ! -e /backup/CURRENT/$BKHOST/$percorso/ ]
      then
       echo ====! Creazione directory /backup/CURRENT/$BKHOST/$percorso
       mkdir /backup/CURRENT/$BKHOST/$percorso
    fi
    echo ====O Download dei file in corso... da: ${ARRHOST[$IND]}
    sudo -u tweety rsync -azS -e \"ssh -i /home/tweety/cron/thishost-rsync-key\" --backup --progress --quiet tweety@$BKHOST:$BKPATH /backup/CURRENT/$BKHOST/$percorso/ &> /var/log/rsync/`date +%Y-%m-%d`\'_\'$BKHOST\'\'$percorso\'.log\'
    if [ ! -e /backup/$OGGI/$BKHOST/ ]
      then
         echo ====! Creazione directory /backup/$OGGI/$BKHOST/
         mkdir /backup/$OGGI/$BKHOST
    fi
    echo \'====O Archiviazione con tar in corso...\'
    tar -czf /backup/$OGGI/$BKHOST/$percorso.tgz /backup/CURRENT/$BKHOST/$percorso/ >> /var/log/rsync/`date +%Y-%m-%d`\'_tar.log\' 2>&1
    echo \'===/ \'$BKHOST/$percorso/ Scaricato ed archiviato.
  done
  echo \'==/ Path finiti...\'
  let IND+=1
  unset RES
done
echo =/ Host finiti...
echo / Fine dello script...

LANG=en_EN


Con questo script e questa guida: http://troy.jdmz.net/rsync/index.html

E\' possibile fare backup notturni con rsync di qualsiasi host e qualsiasi cartella di quell\'host.

I file dei server verranno scaricati e mantenuti in una cartella CURRENT in modo da non dover ogni volta riscaricare tutto.
Successivamente verranno creati dei .tgz di ogni cartella salvati in cartelle col nome progressivo in base al giorno della settimana.

E\' un po\' poco per farne una guida, ma usatelo come volete Cheesy

p.s. la soluzione è stata prenderei i dati multipli come dato singolo e usare un grep per dividerli grazie al separatore \":\" che si deve precedentemente inserire.

Post modificato da: Nokao, alle: 2007/02/06 13:36
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Altri Topic Correlati
Oggetto Aperta da Risposte Visite Ultimo messaggio
[BASH] Script per gli accessi locali e remoti Scripting balubeto 2 607 Ultimo messaggio Maggio 25, 2008, 11:34:58 am
da balubeto
RSYNC SCRIPT SHELL: inserire la password Generale Nokao 3 496 Ultimo messaggio Settembre 29, 2006, 07:04:08 pm
da Nokao
bash script e rar, problemi con crond. problema risolto ma non capisco perche'! Scripting luca71 2 546 Ultimo messaggio Maggio 16, 2007, 07:35:50 pm
da luca71
[Script Bash] per runnare file C Scripting cs_cruzeiro 4 607 Ultimo messaggio Ottobre 02, 2007, 01:25:16 am
da cs_cruzeiro
[risolto]: Script Bash per aggiornare il Sistema con un click Scripting njkjta 6 703 Ultimo messaggio Settembre 23, 2008, 11:33:08 pm
da njkjta
Powered by MySQL Powered by PHP Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 valido! CSS valido!
Pagina creata in 0.088 secondi con 20 interrogazioni al database.