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 Administrator@IP_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:
tutto:
#!/bin/bash
# AUTHOR: Danfossi ([email protected])
# INFO: Show Windows server logs via ssh.
# VERSION: 3.0C_BASENAME=/usr/bin/basenamefunction 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 $@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=( $@ )
# Customer Code Array
CCC=`cut -f 2 -d ' ' ./server_list.txt`
set -- $CCC
dcccarray=( $@ )
# 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 Administrator@${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 Administrator@${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.
Originally published at www.anfossi.tk.
