Windows, visualizzare i log via SSH

PSWindowsUpdate
Windows, Gestione degli aggiornamenti via command line
14 marzo 2016
302-redirect
htaccess, pagina di manutenzione
19 marzo 2016
Mostra tutto

Windows, visualizzare i log via SSH

Win_Log_Viewer
Quando si gestiscono molto server, avere sempre sotto controllo lo stato del sistema ed eventuali errori è fondamentale.
Non sempre però si ha la possibilità di centralizzare tutto (es. SCOM/Rsyslog) e in questo caso, doversi collegare ad ogni macchina (es. VNC/RDP/ecc..) è una vera e propria scocciatura.
Se (lato client) si lavora su S.O Windows (e ci si lavora nella stessa rete) è facilmente risolvibile tramite PowerShell infatti, è sufficiente abilitare la gestione remota (Qui una quida dettagliata sul TechNet) e procedere in questo modo:
Clear-Host
$Machine = "NomePC-Remoto"
Get-Eventlog -List -ComputerName $Machine
Se (lato client) si lavora su una rete differente possiamo invece procedere in questo modo (il S.O lato client è indifferente!):
* Scaricare e installare (preferibilmente come servizio) PowerShell Server sul server.
* Opzionalmente è possibile impostare l'autenticazione tramite chiave pubblica, in questo modo non sarà necessario digitare la password ad ogni accesso.
* A questo punto il servizio SSH dovrebbe essere attivo sulla porta 22. ( testabile tramite: ssh [email protected]_Server )
* Se la connessione va a buon fine, e possibile utlizzare PowerShell per consultare i log in questo modo:
Clear-Host
Get-Eventlog -List
Un po' scomodo però qualora l'elenco delle macchine sia decisamente lungo, a tal proposito ho preparato un script per semplificare il tutto:
#!/bin/bash
# AUTHOR: Danfossi ([email protected])
# INFO: Show Windows server logs via ssh.
# VERSION: 3.0

C_BASENAME=/usr/bin/basename

function printUsage ()
{
		echo -e "\n"
        echo "Usage: `${C_BASENAME} $0` [ -a After (date) ] [ -b Before (date) ] [ -d InstanceId (int) ] [ -e EntryType ] [ -i ip ] [ -l LogName ] [ -n Newest (int) ] [ -m Message (string) ]"
		echo -e "\n"
        exit 1
}


function checkOptions ()
{
        while getopts "a:b:d:e:i:l:m:n:h" option
        do
                case "$option" in
						a) After="-After $OPTARG";;
						b) Before="-Before $OPTARG";;
						d) InstanceID="-InstanceId $OPTARG";;
						e) EntryType="-EntryType $OPTARG";; 
						i) IP="$OPTARG";; 
                        l) LogName="-LogName $OPTARG";; 
						n) Newest="-Newest $OPTARG";;
						m) Message="-Message $OPTARG";;
						h) printUsage;;
						*) printUsage;;
                esac
        done
}


#Reset terminal
reset

#Check $LogName
if [ -z $LogName ]; then
	LogName=" -LogName System"
fi

#Check $Newest (Newest: [int])
if [ -z $Newest ]; then
	Newest=" -Newest 100"
fi



#Main
checkOptions [email protected]

if [ -z $IP ]; then
	if [ ! -f ./server_list.txt ]; then 
		echo -ne '\033[1;31m'
		echo -e "ERROR: No IP provided!\n"
		echo -ne '\033[0m'
		exit 1
	else
		# IP Array
		IP=`cut -f 1 -d ' ' ./server_list.txt`
		set -- $IP
		diparray=( [email protected] ) 
	
		# Customer Code Array
		CCC=`cut -f 2 -d ' ' ./server_list.txt`
		set -- $CCC
		dcccarray=( [email protected] )
		
		# Check 1:1 array's match
		if [ ! ${#diparray[@]} -eq "${#dcccarray[@]}" ]; then
			echo -ne '\033[1;31m'
	        echo -e "ERROR: Arrays not match!\n"
	        echo -ne '\033[0m'
	        exit 1
		fi
		# Start value
		i=0

		# Welcome
		echo -ne '\033[1;32m'
		echo -e " -------------------------------------------------"
		echo -e "|     Welcome To Windows Server Log Viewer        |"
		echo -e " -------------------------------------------------"
		echo -ne '\033[0m'
		echo ""

		# Cycle
		while [ $i -lt ${#diparray[@]} ]
		do
			echo -ne '\033[1;34m'
			echo -e "INFO: Getting" `echo $EntryType | sed 's/-EntryType //'` "Log From" `echo $LogName | sed 's/-LogName //'` "Event on:" ${diparray[$i]} "("${dcccarray[$i]}")"  `echo $After | sed 's/-//'` `echo $Before | sed 's/-//'` `echo $Message | sed 's/-Message/Contains/'` `echo $IstanceID | sed 's/-IstanceID/With ID/'`"\n"
			echo -ne '\033[0m'
			ssh [email protected]${diparray[$i]} \$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size \(500, 100\) \; Get-EventLog $EntryType $LogName $Newest $Before $After $Message $InstanceID \| out-string -Width 200
			echo -e "\n"
			i=$(($i+1))
		done


	fi
else
		# Welcome
		echo -ne '\033[1;32m'
		echo -e " -------------------------------------------------"
		echo -e "|     Welcome To Windows Server Log Viewer        |"
		echo -e " -------------------------------------------------"
		echo -ne '\033[0m'
		echo ""


		echo -ne '\033[1;34m'
		echo -e "INFO: Getting" `echo $EntryType | sed 's/-EntryType //'` "Log From" `echo $LogName | sed 's/-LogName //'` "Event on:" ${IP}  `echo $After | sed 's/-//'` `echo $Before | sed 's/-//'` `echo $Message | sed 's/-Message/With text/'` `echo $IstanceID | sed 's/-IstanceId/With ID/'`"\n"
		echo -ne '\033[0m'
		ssh [email protected]${IP} \$Host.UI.RawUI.BufferSize = New-Object Management.Automation.Host.Size \(500, 100\) \; Get-EventLog $EntryType $LogName $Newest $Before $After $Message $InstanceID \| out-string -Width 200
		echo -e "\n"
fi

L'utilizzo è molto semplice: * Salvare lo script (path a scelta)
* Rendere eseguibile lo script
 chmod +x ./WinServer_Log_Viewer.sh
* Creare un file di testo chiamato "server_list.txt" (nello stesso path dove avete salvato lo script) e aggiungere l'elenco delle macchine in questo modo:
192.168.1.101 server1
192.168.1.102 server2
192.168.1.103 server3
* Eseguire lo script
./WinServer_Log_Viewer.sh
Informazioni utili:
* Il metodo illustrato funziona anche su sistemi non server (Windows 7, Windows 8/8.1, Windows 10)
* Il miglior client ssh che conosca per Windows è PuTTY
* Eseguendo lo script senza parametri verrà mostrata la guida
* Eseguendo lo script ignorando il file "server_list.txt" è possibile specificare singolarmente l'ip della macchina di cui consultare i log
* E' possibile passare allo script alcuni switch per semplificare il parsing dei log, consultare la guida per visualizzare gli switch.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *