Més utilitats per administrar windows remotament: winkill, winshell, wininfo

En la linia en la que estavem en posts anteriors , si hem plantat la llavor amb el psexec, ara fer utilitats es senzillissim. Tres exemples:

winshell.sh
Amb aquesta utilitat aconseguim un shell al servidor windows que volguem. No fa servir el psexec perque no li cal, el cmd esta al path.

#!/bin/bash

[ $# -ne 1 ] && echo "Error, I need one argument" && echo "Use: $0 server" && exit 1
PROGPATH=echo $0 | /bin/sed -e 's,[\/][^\/][^\/]*$,,'
. $PROGPATH/winvars.sh

winexe //$1 "cmd" $PSCREDENTIALS

wininfo.sh
Amb aquesta utilitat podem aconseguir informació sobre el servidor. Memòria RAM física, versio de SO, uptime, numero de processadors, freqüència dels mateixos, i el driver de la tarja de video. Aquest últim detall sembla de poca importància, serveix per saber si una màquina es virtual o física. Si el driver es quelcom com “VMware SVGA II”, aleshores es una màquina virtual. Si el driver es quelcom com “ATI Technologies Inc. 3D RAGE IIC PCI”, aleshores es una màquina física.

#!/bin/bash

[ $# -ne 1 ] && echo "Error, I need one and only one argument" && exit 1
PROGPATH=echo $0 | /bin/sed -e 's,[\/][^\/][^\/]*$,,'
$PROGPATH/winpsexec.sh $1 pstools\psinfo

winkill.sh
Com el seu nom indica, serveix per matar algun procés de windows (prèviament podem haver sabut el pid fent servir el winps.sh).

#!/bin/bash

[ $# -ne 2 ] && echo "Error, I need two arguments" && echo "Use: $0 server pid" && exit 1
PROGPATH=echo $0 | /bin/sed -e 's,[\/][^\/][^\/]*$,,'
$PROGPATH/winpsexec.sh $1 "pstools\pskill $2"

Canviant-li la cara al nagios: nagios nuvola style

Siguem sincers. Nagios té moltes moltes coses bones. Però també en té de dolentes: guarda l’històric en fitxers de text no indexats, executa un CGI compilat, el sistema d’arxius de configuració es força farragós per fer altes i baixes de màquines (sobretot baixes)… i sobretot: es lleig. Potser lleig no és la paraula… és auster, simple, poc atractiu.

A mi (i suposo que no sóc l’únic) m’importa ben poc, perquè és una eina i fa la seva feina. No estic per gaudir de mirar-la, sinò perquè m’avisi quan les coses van malament, i m’expliqui per què van malament. Però en aquest món, els que prenen les decisions i compren coses, acostumen donar-li importància a l’aparença, moltes vegades més enllà de les funcionalitats. Aleshores si vols convèncer algú perquè faci servir nagios tindries moltes més possibiltats si fos maco.

Aquí es on entra el nagios nuvola style, per donar-li un altre aspecte molt diferent al nagios i fer-lo més agradable (a la pàgina completa d’aquest article podreu veure dues captures de pantall per comparar). Està fet pels mateixos que van desenvolupar el nagiosql, i tot i que té una pàgina a nagiosexchange, l’arxiu descarregable d’allà esta corrupte (falla un css, el status.css, i es veu tot molt diferent). Jo el vaig treure d’aquesta web, i el podeu descarregar d’aquí també.

Instal·lar-ho es senzillíssim. Només cal copiar els arxius dintre del directori “html” de la teva instal·lació. En una debian, per exemple, es tan senzill com:

wget http://tomas.cat/blog/sites/default/files/nagios-nuvola-1.0.3.tar_.gz
mkdir nuvola
cd nuvola
tar zxvf ../nagios-nuvola-1.0.3.tar_.gz
cp -a html/* /usr/share/nagios3/htdocs/
cp -a html/stylesheets/* /etc/nagios3/stylesheets/.

I llestos, ja hem millorat l’aspecte del nostre nagios!

Així és com es veu el nagios “original”:

I aixi és com es veu amb la cara canviada:

Primer exemple d’execució remota de pstools: winps.sh

La següent missió era fer scripts que executessin les diferents pstools remotament. Vaig començar fent-ne un per cada, pero vaig trobar que tots compartien molta part de codi, així que vaig decidir crear un script generic, psexec.sh (en “honor” al psexec de les pstools), al que li poguessim passar el nom del servidor i la eina que voliem executar, amb els seus parametres. I després l’unic que ens quedaria seria crear un wrapper per cada comanda que ens fes la feina mes còmoda.

El script ha de comprovar si les credencials del fitxer són bones, i demanar-ne d’altres si no ho són. Un cop autenticat, ha de comprovar si existeixen les pstools o no, i copiar-les en cas que no.

En la historia completa podreu veure el codi del psexec.sh i d’un wrapper d’exemple, el winps.sh. Recordeu que per funcionar, necessiten dels fitxers winvars.sh i cp_pstools.sh, que apareixien en rc=$?

if [ $rc -eq 0 ];then
echo "Default credentials"
elif [ $rc -eq 1 ];then
echo "$? Hola"
echo "Default credentials doesn't authentify. Try others."
read -p "Type username (DOMAIN/user):" user
read -s -p "Type password:" pass
PSCREDENTIALS="--user $user --password $pass"
winexe //$1 "$TOOLS_UNIT:\$TOOLS_DIR\pstools\pslist.exe /accepteula -t" $PSCREDENTIALS
rc=$?
if [ $rc -eq 1 ];then
echo "Credentials error or unit not available (check smbmount errors)" && exit 1
elif [ $rc -eq 99 ];then
echo "There's no pstools, I'll copy them"
$PROGPATH/cp_pstools.sh $1 $user $pass
[ $? -ne 0 ] && echo "There's no pstools and I couldn't copy them." && exit 1
winexe //$1 "d:\scripts\pstools\pslist.exe /accepteula -t" $PSCREDENTIALS
rc=$?
if [ $rc -eq 99 ];then
echo "Pstools are copied, but they don'y work, somethings going on." && exit 1
fi
fi
elif [ $rc -eq 99 ];then
echo "There's no pstools, I'll copy them"
$PROGPATH/cp_pstools.sh $1
[ $? -ne 0 ] && echo "There's no pstools and I couldn't copy them." && exit 1
winexe //$1 "d:\scripts\pstools\pslist.exe /accepteula -t" $PSCREDENTIALS
rc=$?
if [ $rc -eq 99 ];then
echo "Pstools are copied, but they don'y work, somethings going on." && exit 1
fi
fi

Exemple de wrapper: winps.sh

#!/bin/bash

[ $# -ne 1 ] && echo "Error, I need one and only one argument" && exit 1
PROGPATH=echo $0 | /bin/sed -e 's,[\/][^\/][^\/]*$,,'
$PROGPATH/psexec.sh $1 pstools\pslist -t

Copiant automàticament les pstools al servidor windows des del teu linux

En la línia en la que anàvem… Què passa si volem fer servir les pstools en 50 servidors? Una idea és crear una unitat compartida i que tots les executin des d’allà. Pero si tenim alguns en unes xarxes, unes en unes altres (fins i tot en DMZ), amb dominis i sense… No podria haver alguna forma còmoda de copiar-los?

Doncs per aquest motiu he creat aquest petit script, que fa exactament això: copiar les pstools al servidor que volguem. Primer munta la unitat cifs (amb smbmount), després copia els fitxers i després la desmunta.

Està pensat per ser cridat des d’altres scripts. Per exemple, si fem un “winps”, primer que comprovi si estan les pstools instal·lades, i si no ho estan, que les copii. Per això, posarem un fitxer de variables que puguin fer servir tots els scripts, de forma que si volem canviar algun parametre no haguem de modificar-los tots. A aquest fitxer li direm “winvars.sh”.

En l’article complet podeu mirar el codi i descarregar el fitxer.

winvars.sh

#!/bin/bash

TOOLS_DIR=tools
TOOLS_UNIT=d
CREDENTIALS="/home/user/secretfile"
SMBCREDENTIALS="credentials=$CREDENTIALS"
PSCREDENTIALS="-A $CREDENTIALS"

La diferència entre les SMBCREDENTIALS i les PSCREDENTIALS està en la forma d’acceptar-les que té el smbmount i el winexe.

cp_pstools.sh

#!/bin/bash

# We get the script path
PROGPATH=echo $0 | /bin/sed -e 's,[\/][^\/][^\/]*$,,'
# We load our vars
. $PROGPATH/winvars.sh

PSTOOLS_SRC=/home/user/pstools/
RAND_DIR=$1-$RANDOM

[ $# -lt 1 ] && echo "Error, too few parameters" && echo "Use: $0 server [unit]" && exit
[ ! -z "$2" ] && SMBCREDENTIALS="username=$2,password=$3"

mkdir /tmp/$RAND_DIR
smbmount //$1/$TOOLS_UNIT$ /tmp/$RAND_DIR -o $SMBCREDENTIALS

if [ $? -eq 0 ];then
echo "Default credentials"
else
echo "Default credentials doesn't authentify. Try others."
read -p "Type username (DOMAIN/user):" user
read -s -p "Type password:" pass
smbmount //$1/$TOOLS_UNIT$ /tmp/$RAND_DIR -o username=$user,password=$pass
[ $? -ne 0 ] && echo "Credentials error or unit not available (check smbmount errors)" && rmdir /tmp/$RAND_DIR && exit 1
fi

mkdir /tmp/$RAND_DIR/$TOOLS_DIR
cp -av $PSTOOLS_SRC /tmp/$RAND_DIR/$TOOLS_DIR/.
smbumount /tmp/$RAND_DIR

rmdir /tmp/$RAND_DIR

Desconnectant usuaris de l’escriptori remot (terminal server) de windows

Intentes connectar-te via remote desktop (terminal server) al servidor, però et trobes que ja hi ha gent connectada. El maleït missatge:

You can't connect!

Què fer en aquest cas? Doncs molt senzill. Donat que tenim la nostra flamant eina winexe , podem fer un petit script que ens faciliti la vida:

#!/bin/bash

[ $# -lt 1 ] && echo "Error: Missing argument" && echo "Use: $0 server [disc #session]" && exit

[ ! -z "$2" ] && [ $2 != disc ] && echo "Error: Can't understand second argument" && echo "Use: $0 server [disc #session]" && exit
[ "$2" == "disc" ] && echo "Disconnecting session $3 from server $1..." && winexe //$1 "logoff $3" -A secretfile && exit
echo "Listing server $1 sessions:"
winexe //$1 "query session" -A secretfile

L’arxiu “secretfile” és opcional, és per no haver de posar usuari i contrassenya. El seu contingut és aquest:

domain=YOURDOMAIN
username=user
password=pass

Es un script sense gaire control d’errors, pero et permet veure qui hi ha connectat:

[email protected]:~/$ ts.sh server2
Listing server server2 sessions:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
> user1 0 Disc rdpwd
rdp-tcp 65536 Listen rdpwd
Administrator 3 Disc rdpwd
user2 1 Disc rdpwd
console 5 Conn wdcon
[email protected]:~/$

En aquest servidor ja no s’hi pot entrar. Veiem que tothom esta en estat “disconnected”, amb la qual cosa no hi ha ningú treballant. Escollim l’usuari que ens caigui pitjor, i el fem fora:

[email protected]:~/$ ts.sh server2 disc 1
Disconnecting session 1 from server server2...
[email protected]:~/$ ts.sh server2
Listing server server2 sessions:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
> user1 0 Disc rdpwd
rdp-tcp 65536 Listen rdpwd
Administrator 3 Disc rdpwd
console 5 Conn wdcon

Et voilà! ja tenim una sessió lliure per connectar-nos a administrar aquest servidor.

Evidentment és molt millor que tothom tanqui el terminal server quan acabi de treballar. Però si has de compartir servidors amb despistats, t’has de buscar la vida…