Pagina 1 di 2
script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 9:32
da tigerwalk
Salve a tutti,
mi sono fatto un piccolo (ed elementarissimo) script per fare un backup di alcuni file e directory su una directory di un disco usb. Vorrei che alcune directory (/pacchetti; /slackbuild; /Sorgenti), venissero copiate solo quando allo script viene passata una particolare opzione. Ovviamente non so come fare e chiedo un aiuto. Si accettano anche suggerimenti e correzioni per renderlo più funzionale, leggibile ed esteticamente più gradevole. Sarebbe oltremodo gradito un commento per le eventuali correzioni (in modo da capirne il significato).
Grazie a chiunque mi dedicherà un pochino del suo tempo!
Codice: Seleziona tutto
##script fileback.sh (Backup personale)
#!/bin/bash
#
#dichiarazione variabili
DOCUM=/home/tigerwalk
BACK=/media/DATISLACK/home/slackware_current
BACK1=/media/DATISLACK/home/slackware_current/"$(uname -r)"
CONF=/usr/src/linux/.config
DATE=`date +%d/%m/%Y-%H:%M`
#
set -e
if [ -e $BACK ]; then
echo "comincia la copia dei file"
else
echo "devi montare directory"
fi
#$(su -)
#$(cd /boot/)
#$(cp /boot/insideslack_lilo.bmp $BACK)
#$(cp /boot/initrd.gz $BACK)
$(cp /etc/fstab $BACK)
$(cp /etc/profile $BACK)
$(cp /etc/profile.d/lang.sh $BACK)
$(cp /etc/profile.d/lang.csh $BACK)
$(cp /etc/inittab $BACK)
$(cp /etc/sudoers $BACK)
$(grep -vE '(^[[:space:]]*($|(#|!|;|//)))' /etc/lilo.conf > $BACK/lilo.conf)
if [ -e /tmp/initrd/ ]; then
$(find /tmp/initrd/ | cpio -o -H newc | gzip -9 -n > $BACK/initrd.gz)
fi
$(cp /etc/rc.d/rc.local $BACK)
$(cp /etc/rc.d/rc.M* $BACK)
if [ -e /etc/rc.d/c.xconf ]; then
$(cp /etc/rc.d/rc.xconf $BACK)
fi
if [ -e /etc/rc.d/rc.autoX ]; then
$(cp /etc/rc.d/rc.autoX $BACK)
fi
$(cp /etc/rc.d/rc.governor $BACK)
$(cp /etc/modprobe.d/blacklist $BACK)
if [ -e /etc/X11/gui.conf ]; then
$(cp /etc/X11/gui.conf $BACK)
fi
$(cp /etc/X11/xorg.conf* $BACK)
$(cp /etc/slackyd/slackyd.conf $BACK)
if [ -e /usr/bin/fileswapon.sh ]; then
$(cp /usr/bin/fileswapon.sh $BACK)
fi
if [ -e $DOCUM/.conkyrc ]; then
$(cp $DOCUM/.conkyrc $BACK/conkyrc)
fi
#$(cp -R $DOCUM/pacchetti/ $BACK)
#$(cp -R $DOCUM/SlackBuild/ $BACK)
#$(cp -R $DOCUM/Sorgenti/ $BACK)
$(cp -R $DOCUM/file_utili/ $BACK)
if [ -e $DOCUM/bin/ ]; then
$(cp -R $DOCUM/bin/ $BACK)
fi
if [ -e $DOCUM/.bashrc ]; then
$(cp $DOCUM/.bashrc $BACK/bashrc)
fi
$(cp $DOCUM/.bash_profile $BACK/bash_profile)
$(cp $DOCUM/comandi_utili $BACK)
$(cp $DOCUM/bookmarks.html $BACK)
if [ -e /etc/cpufreqd.conf ]; then
$(cp /etc/cpufreqd.conf $BACK)
fi
$(grep -vE '(^[[:space:]]*($|(#|!|;|//)))' /etc/X11/xorg.conf > $BACK/xorg.txt)
#
$(cd $BACK)
if [ $BACK1 ]; then
rm -fr $BACK1 && mkdir $BACK1
fi
$(zcat /proc/config.gz > $BACK1/config)
#crea i file date.txt
$(cd $BACK1 && touch date.txt)
echo $DATE > $BACK1/date.txt
$(cd $BACK && touch date.txt)
echo $DATE > $BACK/date.txt
#
echo "copia finita"
exit
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 11:32
da targzeta
Stavo cercando una discussione che ho fatto tempo fa, ma non la trovo

. Comunque anche io ho uno script di backup che accetta delle opzioni, ti lo posto (è molto lungo):
Codice: Seleziona tutto
#!/bin/bash
#
# Ultimo aggiornamento: 31 Luglio 2007
# by Spina <spina80@freemail.it>
# Crea archivi contenenti file di backup.
# -h per l'help
# Nome dello script
SCRIPT_NAME=backup.sh
# Stampa l'argomento $1 seguito dalle informazioni per eseguire l'help.
# Poi ritorna uno stato di uscita pari a $2
function _exit
{
echo -e "${1}\n\n${SCRIPT_NAME} -h per maggiori informazioni.\n";
exit $2;
}
# Stampa l'help dello script
function _help
{
echo -en "Uso: ${SCRIPT_NAME} [ opzioni ] nome-speciale...\n"\
"\nCrea archivi compressi .tgz (tar e gzip), contenenti file di backup.\n"\
"\nnome-speciale può assumere i valori:"\
"\n Script\tCrea un archivio della directory \$HOME/Script,"\
"\n\t\te se esiste, anche uno per la directory \$HOME/Script_\$HOSTNAME"\
"\n bin\t\tCrea un archivio della directory \$HOME/bin"\
"\n c\t\tCrea un archivio della directory \$HOME/Programmi/c"\
"\n clasess\tCrea un archivio della directory \$HOME/Programmi/classes"\
"\n cpp\t\tCrea un archivio della directory \$HOME/Programmi/cpp"\
"\n php\t\tCrea un archivio della directory \$HOME/Programmi/php"\
"\n src\t\tCrea un archivio della directory \$HOME/Programmi/src"\
"\n Symbolik\tCrea un archivio contenente tutti i link simbolici presenti"\
"\n \t\tnella home directory"\
"\n Config\tCrea un archivio dei file di configurazione utente host INDIPENDENT,"\
"\n \t\te uno per i file di configurazione utente host DIPENDENT"\
"\n System\tCrea un archivio dei file di configurazione di sistema"\
"\n \t\t( viene richiesta la password di root )\n"\
"\nopzioni può assumere i valori:"\
"\n -a\t\tFa il backup di tutti i nomi speciali"\
"\n -u\t\tFa il backup dei nomi speciali: Script, bin, Config e Symbolik"\
"\n -p\t\tFa il backup dei nomi speciali: c, classes, cpp, php, src"\
"\n -s\t\tFa il backup del nome speciale System"\
"\n -h\t\tMostra questo aiuto ed esce\n\n"\
"\nIl nome dell'archivio ha la forma generale di:"\
"\n\t\$USER_nome-speciale_\$HOSTNAME_giorno_mese_anno.tgz\n"\
"\n\$USER (valore della relativa variabile d'ambiente), viene aggiunta nel caso dei nomi speciali"\
"\nche fanno parte dell'opzione -u."\
"\n\$HOSTNAME (valore della relativa variabile d'ambiente), viene aggiunta nel caso di archivi host"\
"\ndependent.\n"\
"\nby Spina <spina80@freemail.it>\n"
}
# Controlla l'esistenza di tutti i programmi dati i loro nomi come argomento.
# Se un programma non viene trovato, allora, stampa il nome del o dei programmi mancanti ed esce.
# Si usa il programma which per controllare che esistono i programmi passati. Si assume che
# which sia in /bin/.
function _check_extern_program
{
local error=0;
local string_error;
if [ ! -x /bin/which ]; then
error=1;
string_error="which : programma mancante.\n";
else
for progr in $@; do
if [[ $(which $progr 2>/dev/null) == "" ]];
then
let ++error;
string_error=${string_error}"${progr} : programma mancante.\n";
fi
done
fi
if (( $error )); then
if (( $error == 1 )); then
string_error=${string_error}"\nIl programma mancante è necessario ";
else
string_error=${string_error}"\nI programmi mancanti sono necessari ";
fi
string_error=${string_error}"per la corretta esecuzione dello script.";
_exit "$string_error" 1;
fi
}
# Controllo degli argomenti dello script in cerca di opzioni
enable getopts echo exit;
# Impostazione del separatore di campi al valore di default
IFS=$(echo -e " \n\t");
# Controllo dell'esistenza di tutti i programmi esterni ( quindi non comandi interni alla bash) usati
_check_extern_program tar basename dirname gzip;
while getopts :aupsh opzione; do
case $opzione in
a) ${SCRIPT_NAME} c classes cpp php src bin Config Script System symbolik;;
u) ${SCRIPT_NAME} bin Script Config symbolik;;
p) ${SCRIPT_NAME} c classes cpp php src;;
s) ${SCRIPT_NAME} System;;
h) _help; exit;;
?) _exit "-${OPTARG} : Argomento non valido." 1;
esac
done
# Shift degli argomenti in modo da avere $1 che punta al primo argomento che non è una opzione
while (( $OPTIND != 1 )); do
shift;
let --OPTIND;
done
function tarra
{
local nome="$1";
shift;
# Mantengo l'iniziale / se si tratta di un backup di sistema
[[ $nome == system* ]] && local _OPT=P;
# Devo eseguire una bash o altrimenti non si ha l'espansione delle parentesi graffe
bash -c "\tar -${_OPT}zcf '${apath}'/'${nome}'_`date +'%d_%m_%y'`.tgz $* 2>/dev/null";
}
# Qui vengono elencati i file di configurazione UTENTE INDIPENDENTI dall'host:
function user_Config_host_independent
{
echo ".aliases .bash_profile .bashrc .emacs .filezilla/sitemanager.xml "\
".gqview/gqviewrc .inputrc .netrc .purple/{accounts.xml,blist.xml,prefs.xml,status.xm}"\
".sitecopyrc .ssh/{a,i}* .toprc .xinitrc .xlockrc .xsession";
}
# Qui vengono elencati i file di configurazione UTENTE DIPENDENTI dall'host:
function user_Config_host_dependent
{
echo ".Xdefaults .aliases_${HOSTNAME} .conkyrc .icewm .mplayer .rhosts "\
".ssh/known_hosts .xinitrc_${HOSTNAME}";
}
# Qui vengono elencati i file di configurazione del SISTEMA INDIPENDENTI dall'host
function system_Config_host_independent
{
echo "/etc/hosts.* /etc/inetd.conf /etc/inittab /etc/login.defs /etc/ntp.conf /etc/profile "\
"/etc/profile.d/*.sh /etc/securetty";
}
# Qui vengono elencati i file di configurazione del SISTEMA DIPENDENTI dall'host
function system_Config_host_dependent
{
echo "/etc/acpi/ /etc/aumixrc /etc/exports /etc/fstab /etc/hosts /etc/httpd/httpd.conf /etc/httpd/php.ini "\
"/etc/HOSTNAME /etc/lilo.conf /etc/resolv.conf /etc/rsyncd.conf /etc/rc.d/rc.* "\
"/etc/udev/rules.d/*${HOSTNAME}.rules /etc/X11/xorg.conf /etc/modprobe.d/ /etc/sudoers";
}
function symbolik_List
{
for file in ${HOME}/*;
do
[ -L "$file" ] && \tar -rf "${apath}"/"${1}"_`date +"%d_%m_%y"` "${file#$HOME/}";
done
gzip -S ".tgz" "${apath}"/"${1}"_`date +"%d_%m_%y"`
}
apath="${PWD}";
for nome_speciale; do
cd ${HOME};
case $nome_speciale in
cpp | classes | php | src | c | C)
tarra "${nome_speciale}" "Programmi/${nome_speciale}"/
;;
bin)
tarra "${USER}_bin" "${nome_speciale}"/
;;
Script | script)
tarra "${USER}_Script" "${nome_speciale}"/;
[ -d "Script_${HOSTNAME}" ] &&\
tarra "${USER}_Script_${HOSTNAME}" "${nome_speciale}_${HOSTNAME}"/;
;;
Config | config)
tarra "${USER}_Config" `user_Config_host_independent`;
tarra "${USER}_Config_${HOSTNAME}" `user_Config_host_dependent`;
;;
System | system)
if (( $(id -u) != 0 )); then
su -c "$0 system";
else
tarra "system" `system_Config_host_independent`;
tarra "system_${HOSTNAME}" `system_Config_host_dependent`;
fi
;;
Symbolik | symbolik)
symbolik_List "${USER}_Symbolik"
;;
*)
echo "ATTENZIONE: non posso fare il backup di ${nome_speciale}/"
;;
esac
cd "$apath";
done
te l'ho anche allegato perchè il tag
Codice: Seleziona tutto
non mantiene bene la formattazione. Ci ho dovuto mettere l'estensione '.txt' perchè se no non me lo faceva allegare. Prova a salvarti l'allegato poi eseguilo con '--help'.
Per qualsiasi chiarimento, chiedi pure,
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 13:21
da tigerwalk
Grazie spina, studierò il tuo script e cercherò di applicare l'uso delle opzioni al mio. Se non ci riuscirò, romperò di nuovo le scatole...!
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 14:20
da Mario Vanoni
Domanda a spina ed a tigerwalk:
come mantenete i programmi _a_ _lunga_ _scadenza_?
Con files/directories hard-coded, aggiungere/togliere una voce?
Uso ASCII flat files diversi, aggiornamenti facilissimi.
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 14:28
da targzeta
Mario Vanoni ha scritto:Domanda a spina ed a tigerwalk:
come mantenete i programmi _a_ _lunga_ _scadenza_?
Con files/directories hard-coded, aggiungere/togliere una voce?
Uso ASCII flat files diversi, aggiornamenti facilissimi.

non ho capito la domanda.
In che senso mantanere programmi a lunga scadenza?
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 15:00
da Mario Vanoni
spina ha scritto:Mario Vanoni ha scritto:Domanda a spina ed a tigerwalk:
come mantenete i programmi _a_ _lunga_ _scadenza_?
Con files/directories hard-coded, aggiungere/togliere una voce?
Uso ASCII flat files diversi, aggiornamenti facilissimi.

non ho capito la domanda.
In che senso mantanere programmi a lunga scadenza?
Spina
Subentra un file/dir non prevedibile/previsto,
un altro file/dir diventa inutile/nocivo,
aggiorni per questo il programma?
Se hai piu` programmi di backup,
ne ho 3 attivi con 3 files che aggiorno ...
macchina 1 -> macchina 2 (file 1)
macchina 1 -> macchina 3 (file 2)
macchina 1 -> USB stick suo (file 3)
macchina 2 -> USB stick suo (file 3)
macchina 3 -> USB stick suo (file 3)
ovviamente sincronizzati con crontab
1 -> USB
1 -> 2
2 -> USB
1 -> 3
3 -> USB
il programma [123] -> USB e` uno solo,
il file 3 e` per tutte le macchine identico, rescue!
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 15:08
da targzeta
Mario Vanoni ha scritto:...
Subentra un file/dir non prevedibile/previsto,
un altro file/dir diventa inutile/nocivo,
aggiorni per questo il programma?
...
Bhé, se devo aggiungere un nuovo file, da qualche parte lo devo pur dire, potrei utilizzare file esterni, ma io utilizzo 4 funzioni diverse per identificare cosa va salvato. Per me vanno salvati:
- file di configurazione utente, indipendenti dall'host
- file di configurazione utente, dipendenti dall'host
- file di configurazione di sistema, indipendenti dall'host
- file di configurazione di sistema, dipendenti dall'host
lo script contiene 4 funzioni ognuna delle quali ritorna l'elenco dei file da salvare.
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 15:25
da Mario Vanoni
spina ha scritto:Mario Vanoni ha scritto:...
Subentra un file/dir non prevedibile/previsto,
un altro file/dir diventa inutile/nocivo,
aggiorni per questo il programma?
...
Bhé, se devo aggiungere un nuovo file, da qualche parte lo devo pur dire, potrei utilizzare file esterni, ma io utilizzo 4 funzioni diverse per identificare cosa va salvato. Per me vanno salvati:
- file di configurazione utente, indipendenti dall'host
- file di configurazione utente, dipendenti dall'host
- file di configurazione di sistema, indipendenti dall'host
- file di configurazione di sistema, dipendenti dall'host
lo script contiene 4 funzioni ognuna delle quali ritorna l'elenco dei file da salvare.
Spina
Si`, ma difficile da mantenere senza errori,
oltre ai listings delle funzioni, quelli di _help,
ci sono altre ridondanze, p. e. getopts.
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 15:30
da targzeta
Mario Vanoni ha scritto:...
Si`, ma difficile da mantenere senza errori,
oltre ai listings delle funzioni, quelli di _help,
ci sono altre ridondanze, p. e. getopts.
In che senso ridondanze con getopts? Scusami ma non ti sto seguendo.
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 15:55
da Mario Vanoni
spina ha scritto:Mario Vanoni ha scritto:...
Si`, ma difficile da mantenere senza errori,
oltre ai listings delle funzioni, quelli di _help,
ci sono altre ridondanze, p. e. getopts.
In che senso ridondanze con getopts? Scusami ma non ti sto seguendo.
Spina
a) ${SCRIPT_NAME} c classes cpp php src bin Config Script System symbolik;;
u) ${SCRIPT_NAME} bin Script Config symbolik;;
p) ${SCRIPT_NAME} c classes cpp php src;;
s) ${SCRIPT_NAME} System;;
Correggi symbolik in symbolic, altre due voci.
grep -i symbolik backup.txt | wc -l
7
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 16:29
da targzeta
Mario Vanoni ha scritto:...
a) ${SCRIPT_NAME} c classes cpp php src bin Config Script System symbolik;;
u) ${SCRIPT_NAME} bin Script Config symbolik;;
p) ${SCRIPT_NAME} c classes cpp php src;;
s) ${SCRIPT_NAME} System;;
Correggi symbolik in symbolic, altre due voci.
grep -i symbolik backup.txt | wc -l
7
il codice che hai postato serve allo script per reinvocarsi sostituendo ad esempio il '-a' con le directory da salvare. Non so se ti è chiaro lo script, le opzioni servono ad identificare una categoria di cose da salvare.
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 17:27
da Mario Vanoni
spina ha scritto:Mario Vanoni ha scritto:...
a) ${SCRIPT_NAME} c classes cpp php src bin Config Script System symbolik;;
u) ${SCRIPT_NAME} bin Script Config symbolik;;
p) ${SCRIPT_NAME} c classes cpp php src;;
s) ${SCRIPT_NAME} System;;
Correggi symbolik in symbolic, altre due voci.
grep -i symbolik backup.txt | wc -l
7
il codice che hai postato serve allo script per reinvocarsi sostituendo ad esempio il '-a' con le directory da salvare. Non so se ti è chiaro lo script, le opzioni servono ad identificare una categoria di cose da salvare.
Spina
OK, ma non e` facile da mantenere se cambi il nome di una opzione.
Come pure "to hard code" /etc/hosts ecc.,
salvare in piu` p. e. /etc/group o /etc/shadow tra 2 anni,
ti sara` ben chiaro subito dove e come aggiungere la voce?
Vecchia regola UNIX "Divide and Conquer".
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 17:43
da targzeta
Mario Vanoni ha scritto:.....
Come pure "to hard code" /etc/hosts ecc.,
salvare in piu` p. e. /etc/group o /etc/shadow tra 2 anni,
ti sara` ben chiaro subito dove e come aggiungere la voce?
Vecchia regola UNIX "Divide and Conquer".
Cerco di applicarla sempre

, per questo è fatto le 4 funzioni. Quei file potrebbero essere elencati nella funzione per i file di sistema dipendenti/indipendenti dall'host (lo script è pesantemente commentato apposta).
Dalla data capirai che sono quasi due anni che lo uso, e mi serve anche per sincronizzare il PC fisso con il portatile quando torno a casa mia a Lecce. Generalmente a Pisa installo vari programmi e quindi per avere le stesse configurazioni sul pc di Lecce uso questo script, nonché per mantenere i file di configurazione aggiornati.
Se ci sono file specifici per la macchina uso un estenzione tipo _hostname, ad esempio ho:
il primo va nella funzione dei file di configurazione utente indipendenti dalla macchina, il secondo nella funzione dei file di configurazione utenti dipendenti dalla macchina.
A Pasqua ho eliminato la Slamd64 per reinstallare tutto (una cosa che non andrebbe fatta), con questo script, e con un altro che mi generava la lista dei pacchetti da installare:
- ho fatto l'avvio dal DVD
- ho lanciato installpkg per ogni pacchetto da installare
- poi ho sovrascritto alcuni file di sistema con quelli che stavano nelle funzioni dei file di sistema
- ho riavviato
ed ecco la mia Slamd64 com'era mezz'ora prima senza usare nessun frontend grafico (non chiedermi perchè l'ho formattata

).
Spina
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 23:37
da zoros
Oh, ragazzi (vale anche per Mario ... con simpatia, tra "ragazzi" appunto) ...
tigerwalk aveva chiesto:
... Si accettano anche suggerimenti e correzioni per renderlo più funzionale, leggibile ed esteticamente più gradevole. Sarebbe oltremodo gradito un commento per le eventuali correzioni (in modo da capirne il significato).
Grazie a chiunque mi dedicherà un pochino del suo tempo!
... però nessuno ha risposto veramente
1)
##script fileback.sh (Backup personale)
#!/bin/bash
di solito l'interprete dei comandi è citato nella prima riga ... cioè "#!/bin/bash" all'inizio-inizio dello script ... poi è bene mettere un paio di commenti con il n. di revisone, la data, un nome o una sigla ad individuare l'autore
2) visto che i comandi sono richiamati su un percorso relativo (cp e non /bin/cp) è bene definire (o esportare) la variabile PATH ...
3) a volte i comandi sono dentro $(comando) altre volte sono senza il $ ... perché (cioè sfugge anche a me la differenza) ?
Codice: Seleziona tutto
#crea i file date.txt
$(cd $BACK1 && touch date.txt)
echo $DATE > $BACK1/date.txt
4) un errore di sintassi:
Codice: Seleziona tutto
if [ -e /etc/rc.d/c.xconf ]; then
$(cp /etc/rc.d/rc.xconf $BACK)
fi
e adesso: in slacky.eu ci sono tanti esperti in linguaggi di scripting, perché nessuno ha replicato in modo diretto alla semplice richiesta fatta ?
Re: script backup personale(suggerimenti)
Inviato: sab 25 apr 2009, 23:58
da targzeta
zoros ha scritto:...
tigerwalk aveva chiesto:
... Si accettano anche suggerimenti e correzioni per renderlo più funzionale, leggibile ed esteticamente più gradevole. Sarebbe oltremodo gradito un commento per le eventuali correzioni (in modo da capirne il significato).
Grazie a chiunque mi dedicherà un pochino del suo tempo!
... però nessuno ha risposto veramente
Ma veramente io avevo capito che aveva un problema anche con le opzioni, ecco perchè gli ho postato lo script che uso, perchè, oltre a fargli vedere un modo diverso per fare il backup (non mi piace vedere tutti quei cp), quello script usa le opzioni. Di estetica ne capisco poco
Spina