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