Linux bash: estrarre tutti i link da un sito web

link Esistono molti tool sulla rete per estrarre i link da una pagina web, ma non ne ho trovati altrettanti in grado di scansionare ricorsivamente tutte le pagine di un sito web e fornire in output una lista senza duplicati dei links presenti.

Questo script bash si  può rivelare particolarmente utile quando sia necessario compilare una serie di redirect, per non perdere le indicizzazioni sui motori di ricerca di un sito che sia stato rinnovato. Un altro esempio di utilizzo è per controllare eventuali links interrotti, a questo scopo si può intergrare con il programma PHP che ho pubblicato qui: PHP cURL: una classe per controllare link interrotti, status code e nxdomain in parallelo

Leggi tutto

Linux bash: uno script per monitorare le modifiche ai file di una directory

rodentia-icons_utilities-terminalQuesto piccolo script bash serve a monitorare le modifiche fatte ai file in una certa directory, confrontandoli con una directory di controllo che contenga i file originali.

Ammettiamo di voler avere una notifica dei cambiamenti che vengono effettuati da terzi in una serie di file residenti in una particolare cartella del FS. Per prima cosa creiamo una nuova cartella in qualche parte del filesystem che contenga i file originali per confrontarli con quelli della directory di lavoro.

Qundi prepariamo questo script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
PATH_OK="/path/directory/controllo"
PATH_TO_CHECK="/path/directory/lavoro"
CHANGES=0
for entry in "$PATH_OK"/*
do
	toCheck=$(echo "$entry" | rev | cut -d"/" -f1 | rev)
	echo "Processing $toCheck"
	MD5_1=_$(md5sum $entry | cut -d ' ' -f 1)
	MD5_2=_$(md5sum $PATH_TO_CHECK/$toCheck | cut -d ' ' -f 1)
	if [[ "$MD5_1" != "$MD5_2" ]]
	then
		echo "FILE $toCheck has been modified!"
		CHANGES=$((CHANGES+1))
		diffText=$(diff $entry $PATH_TO_CHECK/$toCheck)
		mail -s "FILE $toCheck has been modified!" webmaster@domain.com <<< "Changes in $toCheck: $diffText"
		#Se vogliamo possiamo ripristinare il file modificato con il controllo
                #/bin/cp -f "$entry" "$PATH_TO_CHECK/$toCheck"
	fi
done
echo "CHANGES= $CHANGES"
#		if [ "$CHANGES" -gt 0 ]
#		then
# Qui possiamo inserire un comando da lanciare nel caso ci siano stati cambiamenti a uno o più files
#			echo "CHANGES greater then 0!"
#		fi

In pratica lo script scorre tutti i files nella directory di controllo, fa l’MD5 sia del file di controllo che di quello di lavoro, li confronta e se ci sono state modifiche invia una mail a: webmaster@domain.com (da modificare secondo le proprie esigenze…) riportando anche il dettaglio delle modifiche fatte utilizzando il comando diff. E’ anche possibile, nel caso lo si desideri, ripristinare il file modificato con quello di controllo decommentando la riga: /bin/cp -f "$entry" "$PATH_TO_CHECK/$toCheck"
Vengono anche conteggiati i file modificati in modo che si possa decidere di lanciare un comando particolare nel caso uno o più files siano stati modificati.
Lo script può essere utile per monitorare cambiamenti indesiderati in file di configurazione di servizi.
Ovviamente lo script andrà inserito sotto cron per essere eseguito periodicamente. In questo articolo (in inglese) è spiegato chiaramente come inserire un “job” in cron.

PHP: come separare file di immagini jpg ordinandoli per orizzontali e verticali

V-HQuesto script PHP che deve essere utilizzato da linea di comando, permette di analizzare una directory per riconoscere e “marcare” le immagini con orientamento verticale da quelle con orientamento orizzontale. In questo modo è possibile separare i due blocchi di file, per esempio per comporre una galleria fotografica omogenea nel layout.

Lo script utilizza la funzione PHP getimagesize() per calcolare il rapporto fra altezza e larghezza di una immagine jpg. Se il rapporto è maggiore o uguale a 1 è verticale, altrimenti è orizzontale. (N.B.: le immagini quadrate risulteranno verticali…).

I parametri in ingresso sono 2. Il primo definisce il percorso della directory che contiene le immagini e il secondo indica se si vogliono rinominare i file o copiarli. Al nome dei file viene aggiunta una stringa “_H_” per indicare che l’immagine è orizzontale e “_V_” per le immagini ad orientamento verticale. Queste stringhe possono essere cambiate modificando i valori delle due costanti “PRE_H” e “PRE_V” alle righe 26 e 27 dello script.

Se lo script viene lanciato senza nessun parametro vengono analizzati i file della directory corrente e viene prodotto l’output dell’orientamento per ogni file e di come verrebero modificati i nomi dei file, senza però effettuare alcuna modifica.

Questo è il codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/php
<?php
/*
 * sortimages.php
 * 
 * Copyright 2015 mario spada <spadamar@spadamar.com>
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 * 
 * 
 */
 
define("PRE_H","_H_");
define("PRE_V","_V_");
 
function getImgMode($filename) {
	$size = getimagesize($filename); 
	$width = $size[0]; 
	$height = $size[1]; 
	$aspect = $height / $width; 
	if ($aspect >= 1) $mode = "vertical"; 
	else $mode = "horizontal";
return $mode;
}  
 
$directory = empty($argv[1]) ? "./" : rtrim($argv[1], '/') . '/';
if (!file_exists($directory))
	die($directory." directory does not exist!");
 
$renameFls = empty($argv[2]) ? 0 : $argv[2];
 
if (!empty($renameFls)){
	if($renameFls == 'rename') {
		$renameFls = 1;
	} elseif($renameFls == 'copy') {
		$renameFls = 2;
	} else {
		$renameFls = 0;
	}
}
 
$images = glob($directory."*.{jpg,JPG,jpeg}", GLOB_BRACE);
 
foreach($images as $image) {
	$path_parts = pathinfo($image);
	$newFln = "";
	$action = " It will change in: ";
	$imgLayout = getImgMode($image);
	if($imgLayout=='horizontal') {
	  $newFln = $directory.PRE_H.$path_parts['filename'].".".$path_parts['extension'];
	} else {
	  $newFln = $directory.PRE_V.$path_parts['filename'].".".$path_parts['extension'];
	}
	if ( $renameFls == 1 ) {
		$res = @rename ( $image , $newFln );
		$action = !$res ? " Error while renaming with: " : " Renamed with: ";
	}
	if ( $renameFls == 2 ) {
		$res = @copy ( $image , $newFln );
		$action = !$res ? " Error while copying in: " : " Copied in: ";
	} 
	echo "File: ".$image." is ".$imgLayout.". ".$action.$newFln."\n";
}
 
?>

Un esempio di utilizzo in ambiente Linux rinominando i file jpg della directory “tmp” nella propria home (dove ho messo 10 file verticali e 10 orizzontali di prova):

~$ ./sortimages.php ~/tmp rename

e questo è l’output:


File: /home/mario/tmp/IMG_5546.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5546.JPG
File: /home/mario/tmp/IMG_5547.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5547.JPG
File: /home/mario/tmp/IMG_5549.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5549.JPG
File: /home/mario/tmp/IMG_5551.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5551.JPG
File: /home/mario/tmp/IMG_5552.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5552.JPG
File: /home/mario/tmp/IMG_5553.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5553.JPG
File: /home/mario/tmp/IMG_5554.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5554.JPG
File: /home/mario/tmp/IMG_5556.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5556.JPG
File: /home/mario/tmp/IMG_5558.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5558.JPG
File: /home/mario/tmp/IMG_5559.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5559.JPG
File: /home/mario/tmp/IMG_5560.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5560.JPG
File: /home/mario/tmp/IMG_5561.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5561.JPG
File: /home/mario/tmp/IMG_5562.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5562.JPG
File: /home/mario/tmp/IMG_5563.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5563.JPG
File: /home/mario/tmp/IMG_5564.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5564.JPG
File: /home/mario/tmp/IMG_5565.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5565.JPG
File: /home/mario/tmp/IMG_5566.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5566.JPG
File: /home/mario/tmp/IMG_5571.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5571.JPG
File: /home/mario/tmp/IMG_5575.JPG is vertical. Renamed with: /home/mario/tmp/_V_IMG_5575.JPG
File: /home/mario/tmp/IMG_5576.JPG is horizontal. Renamed with: /home/mario/tmp/_H_IMG_5576.JPG

Potete scaricare il file in formato compresso .zip qui

Linux: script bash per conoscere e controllare l’hardware del proprio PC

Devil Tux
Devil Tux

La conoscenza dei dati hardware del proprio computer è spesso vaga, invece alcuni di questi sono davvero importanti per diversi aspetti. La conoscenza per esempio del tipo di processore, della dimensione della memoria RAM, della capacità dell’hard-disk sono utili per sapere se un certo software potrà essere installato sulla macchina, il numero seriale della motherboard, quello dell’hard-disk e gli indirizzi MAC delle schede di rete potranno essere utili in caso di furto per un’efficace ricerca ed identificazione. Conoscere infine i dati S.M.A.R.T. aiuta a non trovarsi da un momento all’altro con un hard-disk inservibile.

Questo sito You-hacker.com è dedicato proprio alle finalità sopra descritte. E’ infatti possibile scaricare un software per Windows che esegue una veloce scansione del PC ed invia i dati raccolti al sito che li memorizza e li ripropone all’utente in forma di tabella, mantenendone traccia attraverso l’utilizzo di cookies. E’ possibile anche registrarsi, per avere la sicurezza di essere identificati utilizzando browser differenti e poter stampare su PDF la tabella dei dati personalizzati.

Leggi tutto