Algo de código para apagar selectivamente Pcs Windows desde Linux

En un anterior post, indique que podemos tener un criterio para apagar computadores , en ese caso comentaba que la condición era si la computadora estaba ocupada o siendo utilizada por un usuario.


Basándome en lo anterior , requeriré modificar el código mostrado en dicho post; usando para ello un paquete llamado winexe y haciendo uso de algunos comandos propios de Windows , bueno , un comando.







¿Y que es winexe?
Un paquete que te te permite ejecutar comandos en Windows de forma remota desde Linux. Ejemplo

¿Como obtener winexe?
En ArchLinux vía AUR , aunque en lo particular no me funciona porque fue compilado con Samba4, por lo que lo he estado usando es la versión 0.90 , descargable de este foro.

He visto paquetes generados para otros distribuciones en el servicio de compilación de openSuse vía este enlace https://build.opensuse.org/project/repositories?project=home:ahajda:winexe


Usando  winexe
Al usar winexe es requerido los datos de las credenciales del usuario del dominio/grupo con los privilegios requeridos, en este caso de apagar la pc , el comando a ejecutar de forma remota y la ip o el nombre de la pc. 

En estos script apenas uso el comando tasklist , mencionado en algunos blogs , para obtener la lista de procesos de Windows.

Reutilizar código es bueno
En estas líneas de código hago uso de scripts que he mencionado en un post anterior ,  con la salvedad que yo asumo que están el el mismo directorio de uso que estarán estos.

Apagando una pc selectivamente

Lo llamaré apagar_pc2.sh al siguiente script.

#! /bin/bash
cyan='\e[1;36m'
gris='\e[1;30m'
white='\e[1;37m'
NC='\e[0m' # No Color  
echo -e "${white}::Revisando >>${NC}$1"
echo " "
a
=`winexe -A /home/user/.credentials //$1 "tasklist /fo list /v " | grep DOMAIN | awk '{print $4}' | uniq | wc -l`

 if [ $a == "1" ];
  then
     ./apagar_pc.sh $1
 fi

 if [ $a == "0" ];
  then
     echo -e "${cyan} $1 esta apagada|inaccesible ${NC}"
 fi

 if [ $a == "2" ];
  then echo -e "${gris} $1 esta ocupada ${NC}"
 fi

exit

Hay que tener en cuenta que es más fácil tener un archivo donde tengas tu usuario, tu contraseña y el nombre de dominio para no estar tecleando esos datos. En el ejemplo,  /home/user/.credentials posee este formato:

username=Usuario
password=laContraseñadeUsuario
domain=ElDominiooGrupodeTrabajo



Lo primero que se observa es el uso de filtrado de la salida de winexe. Inicialmente usaba 'tasklist /v' pero da problemas en la salida, así que con el parámetro /fo list , obtengo una lista de procesos con muchos detalles, filtro el nombre de usuario en el formato DOMAIN\usuario_dominio y elimino las repeticiones y cuento el numero de líneas.

Si se ejecuta el comando sin usar wc debería de haber uno de los tres escenarios posibles, nulo o cero (indicando que la pc esta mal configurada o esta apagada) , una línea o dos líneas. Si hay dos lineas,  la pc posee una sesión abierta,  pero tasklist indicaría que hay dos usuarios , el que este allí y el que ejecutó winexe, wc diría en ese caso 2.  Si hay una línea, sólo sería de quien ejecuto winexe, es decir no hay usuario usando la pc. De allí los 3 if después del uso de winexe. $1 vendría ser la ip por pase de valor.

Y el script se usaría ./apagar_pc2.sh IP

Entonces, apagar varias subredes selectivamente
...sería algo así, un script llamado apagar_subred2.sh y la única modificación con respecto al script presentado anteriormente sería así

sustituir ./apagar_pc.sh ${vector[$i]} & por ./apagar_pc2.sh ${vector[$i]} &

es decir quedaría así

#! /bin/bash

if [[ $EUID -ne 0 ]]; then
echo "Root requerido!!!"
exit
fi
##Este if es requerido para usar nmap

if [ $1 'no es un valor correcto' ];
then
 echo "valor ingresado no valido"
exit
fi

##El if anterior validaría subredes, ejemplo [ $1 !=1 -o $1 !=8 ]; 


if [ $1 -eq 1 ]; then
limit=24
fi

if [ $1 -eq 2 ] ; then
limit=15
fi
##Habría n condicionales como subredes hubiese si son limites dispares, esto define un valor que le pasaremos a nmap. Este limite esta determinado por el numero de pcs en cada subred, ejemplo subred 1 tiene 24 pc, subred 2 tiene 15



lista=`nmap -sn Rango$1 -$limit -pr | grep report | awk {'print $5'}`
##En esta linea, limit es el valor limite del rango de la SubRed numero X
##
##Ejemplo de rango  192.168.1.1-24
##
## Nmap es usado para detectar pcs encendidas en un rango de ip por ARP,
## el filtrado grep  sería usado para obtener la línea que reporta ejemplo
##sudo nmap -sn 192.162.1.1-24 -pr | grep report
##Nmap scan report for 192.162.1.5
##Nmap scan report for 192.162.1.6
##Nmap scan report for 192.162.1.11
##Nmap scan report for 192.162.1.20
##
## Awk facilitaría la obtención de la ip que esta "viva"


vector=($lista)
fin=${#vector[*]}
echo "Pcs detectadas en subred $1 ::: $fin "
##El uso de nmap nos dejo como resultado , una cadena, por lo que sería muy útil pasar la data ##recolectada a un vector para uso posterior


if [ $fin -eq 0 ] ; then
exit
fi
##Si no se detectó pcs encendidas, termina el script

for (( i=0; i<$fin; i++ ));
do

./apagar_pc2.sh ${vector[$i]} &


done
wait
echo "Subred $1 Revisada"
exit
##Fin de Script

El script se podría usar de la forma sudo ./apagar_subred2.sh 7

Recordatorio
No esta de más recordar que las validaciones de ip y de enumeración de subredes , lo mencione en ese post anterior. Lo que no esta en el código es lo que debes de adaptar a tu necesidad

Detalles encontrados
Mientras llega Samba4, habrá detalles de demora en la conexión a pcs que estén mal configuradas , en caso de ser muchas pcs (mas de 30 en mi caso) , puede quitarle el et (ampersand) . Hay un comportamiento extraño cuando la Pc es Windows 7 , el delay no siempre aparece.

Y si lo usamos en crontab
Es materia del siguiente post.

0 comentarios:

Publicar un comentario