Il seguente batch permette di effettuare il backup di tutti i database presenti in un’installazione MySQL/MariaDB, comprimerli e salvare il file compresso in una cartella a piacere con un solo comando.
Ovviamente lo script può essere migliorato, ma questa è una buona base.
REM Trova la data
set currentdate=%DATE:~-2%%DATE:~3,2%%DATE:~0,2%_%TIME:~0,2%%TIME:~3,2%
REM Imposta cartella bin di MySQL
set mysqldir=C:\xampp\mysql\bin\
REM Imposta la cartella di backup temporanea - meglio se vuota
set mysqlbkpdir=C:\xampp\mysql\bin\backup\
REM Utente MySQL e relativa pass
set mysqluser=root
set mysqlpass=password
REM Percorso dell'applicazione di compressione - se non si utilizza RAR verificare la sintassi corretta per l'applicazione
set zipexe=C:\Program Files (x86)\WinRAR\Rar.exe
REM Percorso del file di output compresso
set rardestfolder=C:\Users\foo\Dropbox\
REM Estrae la lista dei database (escludendo quelli di sistema) ed esegue il dump
%mysqldir%mysql.exe -u %mysqluser% -p%mysqlpass% -s -N -e "SHOW DATABASES" | for /F "usebackq" %%D in (`findstr /V "information_schema performance_schema"`) do %mysqldir%mysqldump -u %mysqluser% -p%mysqlpass% %%D > %mysqlbkpdir%%%D.sql
REM Comprime i file SQL estratti in un unico file RAR
"%zipexe%" a -r %rardestfolder%DBBackup%currentdate%.rar %mysqlbkpdir%*.sql
REM Cancella i file sql temporanei
del %mysqlbkpdir%*.sql |
REM Trova la data
set currentdate=%DATE:~-2%%DATE:~3,2%%DATE:~0,2%_%TIME:~0,2%%TIME:~3,2%
REM Imposta cartella bin di MySQL
set mysqldir=C:\xampp\mysql\bin\
REM Imposta la cartella di backup temporanea - meglio se vuota
set mysqlbkpdir=C:\xampp\mysql\bin\backup\
REM Utente MySQL e relativa pass
set mysqluser=root
set mysqlpass=password
REM Percorso dell'applicazione di compressione - se non si utilizza RAR verificare la sintassi corretta per l'applicazione
set zipexe=C:\Program Files (x86)\WinRAR\Rar.exe
REM Percorso del file di output compresso
set rardestfolder=C:\Users\foo\Dropbox\
REM Estrae la lista dei database (escludendo quelli di sistema) ed esegue il dump
%mysqldir%mysql.exe -u %mysqluser% -p%mysqlpass% -s -N -e "SHOW DATABASES" | for /F "usebackq" %%D in (`findstr /V "information_schema performance_schema"`) do %mysqldir%mysqldump -u %mysqluser% -p%mysqlpass% %%D > %mysqlbkpdir%%%D.sql
REM Comprime i file SQL estratti in un unico file RAR
"%zipexe%" a -r %rardestfolder%DBBackup%currentdate%.rar %mysqlbkpdir%*.sql
REM Cancella i file sql temporanei
del %mysqlbkpdir%*.sql
E’ possibile accendere, spegnere, resettare le macchine virtuali di Hyper-V senza utilizzare PowerShell.
BackupChain.com (che produce anche un software di backup) rende disponibili due strumenti eseguiili da command line per gestire le macchine virtuali.
La sintassi è molto semplice
#Per avviare una VM:
HyperVUtils.exe "vmName" start
#Per spegnare una VM immediatamente (turn off brutale):
HyperVUtils.exe "vmName" poweroff
#Per riavviare una VM:
HyperVUtils.exe "vmName" reboot
#Per resettare una VM:
HyperVUtils.exe "vmName" reset
#Per forzare uno spegnimento della VM e aspettare fino a 5 minuti per il completamento:
HyperVUtils.exe "vmName" forceshutdown
#Per effettuare uno spegnimento normale del guest OS e aspettare fino a 5 minuti per il completamento:
HyperVUtils.exe "vmName" shutdown
#Esempio con un'attesa di 10 minuti:
HyperVUtils.exe "vmName" shutdown 600 |
#Per avviare una VM:
HyperVUtils.exe "vmName" start
#Per spegnare una VM immediatamente (turn off brutale):
HyperVUtils.exe "vmName" poweroff
#Per riavviare una VM:
HyperVUtils.exe "vmName" reboot
#Per resettare una VM:
HyperVUtils.exe "vmName" reset
#Per forzare uno spegnimento della VM e aspettare fino a 5 minuti per il completamento:
HyperVUtils.exe "vmName" forceshutdown
#Per effettuare uno spegnimento normale del guest OS e aspettare fino a 5 minuti per il completamento:
HyperVUtils.exe "vmName" shutdown
#Esempio con un'attesa di 10 minuti:
HyperVUtils.exe "vmName" shutdown 600
Trovate i due eseguibili qui: http://backupchain.com/hyper-v-backup/Hyper-V-Command-Line-Tools.html.
I file possono essere utilizzati liberamente ma non rivenduti senza il consenso degli autori.
Variabili di variabili
In PHP è possibile utilizzare il valore contenuto in una variabile come nome di un’altra variabile:
<?php
$Vietnam = "!";
$Morning = "Vietnam";
$Good = "Morning";
$a = "Good";
echo $a; // Mostra Good
echo $$a; // Mostra Morning
echo $$$a; // Mostra Vietnam
echo $$$$a; // Mostra !
// Quindi...
echo $a . " " . $$a . " " . $$$a . " " . $$$$a; // Mostra Good Morning Vietnam!
?> |
<?php
$Vietnam = "!";
$Morning = "Vietnam";
$Good = "Morning";
$a = "Good";
echo $a; // Mostra Good
echo $$a; // Mostra Morning
echo $$$a; // Mostra Vietnam
echo $$$$a; // Mostra !
// Quindi...
echo $a . " " . $$a . " " . $$$a . " " . $$$$a; // Mostra Good Morning Vietnam!
?>
Nome dinamico delle variabili
Se avete bisogno di comporre il nome di una variabile utilizzando altri nomi di variabili potete usare questo metodo:
<?php
$a = 'Power';
${$a.'Ranger'} = 'Alpha';
$b = 'Chord';
${$a.$b} = 'E5';
echo $PowerRanger; // Mostra Alpha
echo $PowerChord; // Mostra E5
?> |
<?php
$a = 'Power';
${$a.'Ranger'} = 'Alpha';
$b = 'Chord';
${$a.$b} = 'E5';
echo $PowerRanger; // Mostra Alpha
echo $PowerChord; // Mostra E5
?>
Ho appena finito di scrivere questo script in Perl che permette di scaricare in locale un dump in formato SQL di un server MySQL remoto tramite PHPMyAdmin (d’ora in poi PMA).
In questo caso il server MySQL è quello di Aruba e PMA è in italiano.
Lo script simula una navigazione nel sito quindi è possibile che non funzioni con tutte le versioni di PMA.
Lo script è chiaramente migliorabile. La prossima versione permetterà l’esecuzione da terminale passando gli argomenti necessari e sarà in formato EXE.
#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
my $login = "XXXXXXX";
my $password = "Password!";
my $url = "http://mysql.aruba.it/login/index.php?lang=it-iso-8859-1";
my $url2 = "http://mysql.aruba.it/phpMyAdmin-5/server_export.php";
my $url3 = "http://mysql.aruba.it/phpMyAdmin-5/navigation.php";
my $dumpfile = 'c:\Percorso\del_file\di_output\DBdump.sql';
my $mech = WWW::Mechanize->new();
print "1 - Connessione\n";
$mech->get($url) or die "ERRORE: Impossibile raggiungere il sito web\n" ;
print "2 - Autenticazione\n";
$mech->form_with_fields(("utente","password","controllo")) or die "ERRORE: Impossibile trovare un form con i campi\n" ;
$mech->field("utente",$login);
$mech->field("password",$password);
$mech->submit_form();
print "3 - Download del backup\n";
$mech->get($url2);
$mech->form_name("dump");
$mech->submit_form() or die "ERRORE: Impossibile raggiungere la pagina esporta\n";
$mech->save_content ( $dumpfile ) or die "ERRORE: Impossibile salvare il file\n";
print "4 - Disconnessione\n";
$mech->get($url3);
$mech->follow_link( tag => 'a', n => 3 ) or die "ERRORE: Impossibile disconnettersi\n" ; |
#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
my $login = "XXXXXXX";
my $password = "Password!";
my $url = "http://mysql.aruba.it/login/index.php?lang=it-iso-8859-1";
my $url2 = "http://mysql.aruba.it/phpMyAdmin-5/server_export.php";
my $url3 = "http://mysql.aruba.it/phpMyAdmin-5/navigation.php";
my $dumpfile = 'c:\Percorso\del_file\di_output\DBdump.sql';
my $mech = WWW::Mechanize->new();
print "1 - Connessione\n";
$mech->get($url) or die "ERRORE: Impossibile raggiungere il sito web\n" ;
print "2 - Autenticazione\n";
$mech->form_with_fields(("utente","password","controllo")) or die "ERRORE: Impossibile trovare un form con i campi\n" ;
$mech->field("utente",$login);
$mech->field("password",$password);
$mech->submit_form();
print "3 - Download del backup\n";
$mech->get($url2);
$mech->form_name("dump");
$mech->submit_form() or die "ERRORE: Impossibile raggiungere la pagina esporta\n";
$mech->save_content ( $dumpfile ) or die "ERRORE: Impossibile salvare il file\n";
print "4 - Disconnessione\n";
$mech->get($url3);
$mech->follow_link( tag => 'a', n => 3 ) or die "ERRORE: Impossibile disconnettersi\n" ;
Questo script Perl prende IP internet e hostname della macchina su cui viene eseguito e li manda ad un form presente in internet.
Il completamento del form è possibile grazie al modulo WWW::Mechanize;
#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::Simple;
use Sys::Hostname;
use WWW::Mechanize;
# Estraggo l'indirizzo IP connettendomi ad un sito
my $ip = get('https://www.net-addiction.net/ip/ip.php');
$ip = 'Non ho trovato un indirizzo IP!' if !$ip;
# Estraggo l'hostname
my $host = hostname;
# Imposto i campi da compilare con i relativi valori (il nome del campo dev'essere uguale all'attributo name del tag input
my $mech = WWW::Mechanize->new();
my $url = "https://www.net-addiction.net/ip/form.php"; # Definizione dell'URL contenente il form
$mech->get($url);
my $result = $mech->submit_form(
form_number => 1, # L'identificativo del form (nel caso in cui nella pagina ce ne fosse piu' di uno
fields =>
{
Code => 'RLRRLRLL', # Codice di controllo - è la variabile che distingue le richieste autorizzate
IP => $ip, # L'indirizzo IP estratto
Hostname => $host, # L'hostname estratto
}
, button => 'Invia' # Questo deve corrispondere all'attributo name del tag input type="submit"
);
print $result->content(); # Esegue il completamento
system("cls"); # Svuota la finestra del prompt
print "Il tuo indirizzo IP e\' ".$ip."\nIl tuo hostname e\' " . $host ."\n"; # Scrive a video IP e Hostname |
#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::Simple;
use Sys::Hostname;
use WWW::Mechanize;
# Estraggo l'indirizzo IP connettendomi ad un sito
my $ip = get('https://www.net-addiction.net/ip/ip.php');
$ip = 'Non ho trovato un indirizzo IP!' if !$ip;
# Estraggo l'hostname
my $host = hostname;
# Imposto i campi da compilare con i relativi valori (il nome del campo dev'essere uguale all'attributo name del tag input
my $mech = WWW::Mechanize->new();
my $url = "https://www.net-addiction.net/ip/form.php"; # Definizione dell'URL contenente il form
$mech->get($url);
my $result = $mech->submit_form(
form_number => 1, # L'identificativo del form (nel caso in cui nella pagina ce ne fosse piu' di uno
fields =>
{
Code => 'RLRRLRLL', # Codice di controllo - è la variabile che distingue le richieste autorizzate
IP => $ip, # L'indirizzo IP estratto
Hostname => $host, # L'hostname estratto
}
, button => 'Invia' # Questo deve corrispondere all'attributo name del tag input type="submit"
);
print $result->content(); # Esegue il completamento
system("cls"); # Svuota la finestra del prompt
print "Il tuo indirizzo IP e\' ".$ip."\nIl tuo hostname e\' " . $host ."\n"; # Scrive a video IP e Hostname
Dall’altra parte (seguendo l’esempio sopra in https://www.net-addiction.net/ip/form.php) ci deve essere un form tipo:
<html>
<head><title>Pagina per ricezione dati</title></head>
<body>
<?php
if ($_POST['Code'] == 'RLRRLRLL') { // Se il codice corrisponde
$ip = $_POST['IP']; // assegno le variabili
$hostname = $_POST['Hostname'];
$myfile = fopen("dati.txt", "a") or die("Impossibile aprire il file!"); // Tento di aprire il file in append
$txt = $ip . " - " . $hostname . "\n"; // Creo la stringa da scrivere su file
fwrite($myfile, $txt); // Scrivo su file
fclose($myfile); // chiudo il file
echo "<h1>dati inviati</h1>"; // Confermo che i dati sono stati inviati
}
?>
<form id="1" action="form.php" method="POST">
<input type="text" id="Code" name="Code" />
<input type="text" id="IP" name="IP" />
<input type="text" id="Hostname" name="Hostname" />
<input type="submit" id="Invia" name="Invia" value="Invia" />
</form>
</body>
</html> |
<html>
<head><title>Pagina per ricezione dati</title></head>
<body>
<?php
if ($_POST['Code'] == 'RLRRLRLL') { // Se il codice corrisponde
$ip = $_POST['IP']; // assegno le variabili
$hostname = $_POST['Hostname'];
$myfile = fopen("dati.txt", "a") or die("Impossibile aprire il file!"); // Tento di aprire il file in append
$txt = $ip . " - " . $hostname . "\n"; // Creo la stringa da scrivere su file
fwrite($myfile, $txt); // Scrivo su file
fclose($myfile); // chiudo il file
echo "<h1>dati inviati</h1>"; // Confermo che i dati sono stati inviati
}
?>
<form id="1" action="form.php" method="POST">
<input type="text" id="Code" name="Code" />
<input type="text" id="IP" name="IP" />
<input type="text" id="Hostname" name="Hostname" />
<input type="submit" id="Invia" name="Invia" value="Invia" />
</form>
</body>
</html>
Lo so, l’ho fatto in PHP per comodità. Quando imparerò un minimo di programmazione web di Perl integrerò.
Questo è frutto di una mia curiosità. Ho utilizzato Strawberry Perl su Windows.
Il codice è tutto commentato.
#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::Simple;
use Time::localtime;
use Sys::Hostname;
# Percorso del file di output
my $output = 'output.txt';
# Estraggo l'indirizzo IP connettendomi ad un sito
my $ip = get('https://www.net-addiction.net/ip/ip.php');
$ip = 'Non ho trovato un indirizzo IP!' if !$ip;
# Estraggo la data per il timestamp
my $mese = localtime->mon + 1;
my $giorno = localtime->mday;
my $anno = localtime->year + 1900;
my $ora = localtime->hour;
my $minuti = localtime->min;
my $timestamp = $anno.$mese.$giorno." @ ".$ora.":".$minuti;
# Estraggo l'hostname
my $host = hostname;
# Crea il file definito in precedenza se non esiste e scrive IP e timestamp (in append - senza sovrascrivere il file)
unless (-e $output) { open(FILE, '>', $output); close FILE; }
open(FILE, '>>', $output) || die("Impossibile creare il file!");
print FILE $ip . ' - ' . $timestamp . "\n";
close FILE;
# Scrive a video IP e Hostname
system("cls");
print "Il tuo indirizzo IP e\' ".$ip."\nIl tuo hostname e\' " . $host ."\n";
#Evito che la finestra si chiuda ma non mostro l'output di pause
system ("pause>nul"); |
#!/usr/bin/perl -w
use strict;
use warnings;
use LWP::Simple;
use Time::localtime;
use Sys::Hostname;
# Percorso del file di output
my $output = 'output.txt';
# Estraggo l'indirizzo IP connettendomi ad un sito
my $ip = get('https://www.net-addiction.net/ip/ip.php');
$ip = 'Non ho trovato un indirizzo IP!' if !$ip;
# Estraggo la data per il timestamp
my $mese = localtime->mon + 1;
my $giorno = localtime->mday;
my $anno = localtime->year + 1900;
my $ora = localtime->hour;
my $minuti = localtime->min;
my $timestamp = $anno.$mese.$giorno." @ ".$ora.":".$minuti;
# Estraggo l'hostname
my $host = hostname;
# Crea il file definito in precedenza se non esiste e scrive IP e timestamp (in append - senza sovrascrivere il file)
unless (-e $output) { open(FILE, '>', $output); close FILE; }
open(FILE, '>>', $output) || die("Impossibile creare il file!");
print FILE $ip . ' - ' . $timestamp . "\n";
close FILE;
# Scrive a video IP e Hostname
system("cls");
print "Il tuo indirizzo IP e\' ".$ip."\nIl tuo hostname e\' " . $host ."\n";
#Evito che la finestra si chiuda ma non mostro l'output di pause
system ("pause>nul");
l’output a video è:
Il tuo indirizzo IP e' 166.95.244.117
Il tuo hostname e' Hostname-PC |
Il tuo indirizzo IP e' 166.95.244.117
Il tuo hostname e' Hostname-PC
Mentre il file output.txt contiene:
166.95.244.117 - 20141010 @ 1:26
166.95.244.117 - 20141010 @ 1:26
166.95.244.117 - 20141010 @ 1:27
166.95.244.117 - 20141010 @ 1:27 |
166.95.244.117 - 20141010 @ 1:26
166.95.244.117 - 20141010 @ 1:26
166.95.244.117 - 20141010 @ 1:27
166.95.244.117 - 20141010 @ 1:27
Prossimamente cercherò un modo per inviare questi dati ad un sito web che controlli l’idoneità della richiesta e salvi solo i dati dei computer abilitati.