Algo de código para apagar Pcs Windows desde Linux


En un principio pensé compartir código fuente de los scripts de lo que uso para tal fin, sin embargo, no en todos los ámbitos hay más 30 pcs u se segmenta las direcciones Ips en sub-redes. Así que 
mejor muestro parcialmente código para que se pueda adaptar a su ámbito u necesidad. Claro, ando en un dominio Windows con más de 60 pcs y una clara distribución de ips/pcs vía unidad organizativa y con la limitante de estar pensando en ahorrar energía eléctrica.De por sí esa es la inicial necesidad. .





Para comenzar debemos pensar en como esta organizada las oficinas, salas, salones , subredes u algún otro nombre de la unidad organizativa con respecto a los rangos de ips así como la terminología para poder apagar la pc. Esto ayudará a generar validaciones en los scripts a usar. La pc destino debe tener al menos las opciones de "Compartir archivos e impresoras" en el firewall (en Windows 7 añadir la opción de administración remota ) en el caso de que se requiere el firewall activo. Y por supuesto, login y password con privilegios administrativos de dominio/grupo de trabajo.

Como la pc en donde estará los scripts es Linux , deberíamos tener instalado Samba y configurado en /etc/samba/smb.conf la opcion 'workgroup'
de la siguiente forma:

[global]
workgroup = NOMBRE_DEL_DOMINIO


En este post asumo que las pcs se organizan en subredes , pudiendo ser oficinas, aulas, salas; que cada subred tiene un numero limite , que las pcs tienen ips fijas y que cada subred posee como ip inicial en algún octeto ,1,

Hago la salvedad que podemos apagar la(s) pc(s) de forma selectiva o de forma directa. En la  forma directa, indicamos que queremos apagar las sin importar si las pc(s) esta siendo usada por usuario(s).

En un próximo post , indicaré una variante  , apagamos la pc siempre que en este ,no haya sesión abierta . Para esta forma , usare un paquete que envía comandos a Windows.(Oh lala )

Apagando una sóla pc
Llamemos apagar_pc.sh a este script que pudiera ser de esta forma

#! /bin/bash
net rpc shutdown -I $1 -C "Apagando PC" -t 8 -U usuario%'contraseña' -f | grep -v Shutdown

yellow='\e[1;33m'
NC='\e[0m'#No Color
echo -e "${yellow}Comando de apagado aplicado a $1 ${NC}"

Y se usaría de la siguiente forma

./apagar_pc.sh IP

Siendo la IP, el parámetro de entrada . El uso de 'echo -e' es meramente decorativo pero útil en el caso de usarse con otros scripts.

ejemplo ./apagar_pc-sh 192.168.1.70

Aja, ¿y para un conjunto de pcs?
Se puede hacer un script para aquellas pcs que estén encendidas en una misma subred, por lo que deberemos de saber como esta organizadas para asignarle un numero, ejemplo, subred 1 , subred 2 , siendo cada subred un rango de ip ; basado en ese rango podemos validar un limite que es referente al numero de pcs presente en cada una de ellas, ejemplo la subred 1 tiene 24 pcs, la subred 2 tiene 15 pcs y así sucesivamente. Un idea lo que quiero decir puede ser este script , llamado apagar_subred.sh

#! /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 (en este casio) 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_pc.sh ${vector[$i]} &

done

wait

echo "Subred $1 Revisada"

exit 0

## Este loop haría efectivo un apagado de sólo las pcs que están
## encendidas.
## Observase que al final de la línea de "./apagar_pc.sh " hay un et (en
## ingles ampersand ) , esto ejecuta en segundo planos los comandos a
## modo de
## hilos y el wait es la señal de parada de cada hilo.


Una idea de uso sería sudo ./apagar_subred.sh 1

¿Les gustó? El siguiente post relacionado reutilizará lo dicho acá para apagar pcs pero considerando una condicion: Si la pc esta desocupada se apaga.

0 comentarios:

Publicar un comentario