[resolt] Algun Script per apagar màquines?

A vegades no s'apaguen les màquines de l'aula, i sovint ho faig manualment amb SSH posant la ip i escrivint la contrasenya, després amb un halt i surto.
Voldria automatitzar-ho una mica. A veure si algú sap alguna manera via script per apagar unes màquines concretes. La idea és que les màquines que van de 192.168.0.180/195 s'apaguin executant un script.
La segona part seria, que després des del servidor via cron(tab) fer que les apagui en una hora concreta.

Fins ara he trobat alguna cosa, però fent claus ssh i anant client per client i servidor. Jo voldria alguna cosa que només amb la ip i el password (que totes tenen igual) ja em servís.

Moltes gràcies!
De moment m'he fet aquest Script que ja m'apaga una sóla màquina, ara hem cal fer que agafi tot el rang des de 192.168.0.180 fins a 192.168.0.192...

Code

#!/usr/bin/expect -f
# Autor: Manel Sales msales24 llicència:GPLv3 http://www.gnu.org/licenses/gpl-3.0-standalone.html
# Script per apagar via SSH les màquines, Octubre 2012
#
# cal tenir instal·lat el paquet "expect" sinó fem un>> zypper in expect
# ens avisa que apagarà i continua
send "Apagant els clients..."
#
# rang de la ip per exemple la IP 192.168.0.189
set ip "192.168.0.189"
# definim el client
# usuari nom de l'usuari administrador
set usuari "nom"
# contrasenya de l'administrador, per exemple 1234
set password "1234"
# crida al client
spawn ssh $usuari@$ip
#
# si no hem accedit mai ens preguntarà si volem continuar i espera la pregunta de la contrasenya i respon
expect {
    "Are you sure you want to continue connecting (yes/no)?" {
    send -- "yes\r"}
    "Password:"  {
    send -- "${password}\r"}
    }
# permet interactuar
# interact
# ---- fins aquí podríem connectar-nos sense haver d'apagar, només cal comentar tot el que segueix ----
# ara espera entrar al root, espera el símbol de sistema # i...
expect "# "
# mana l'ordre d'apagar
send -- "halt\r"
# i ara sortim de la màquina i script
expect "# "
send -- "exit\r"
#### ---- fins aquí comentaria si només vull connectar-me i no apagar
expect eof


Ara ho tinc desat com a apagar.exp i amb permisos d'execució poso a la terminal:

Code

expect apagar.exp

o tambér podem executar com:

Code

./apagar.exp

i apaga la màquina.
Una altra opció és canviar les línies:

Code

# rang de la ip per exemple la IP 192.168.0.189
set ip "192.168.0.189"


per

Code

# si volem cridar la ip des de la comanda activem la següent ordre i executem ./apagar.exp 192.168.0.194 a la terminal
set ip [lindex $argv 0]

i ho executem com:

Code

./apagar.exp 192.168.0.194

Així podem indicar la IP de la màquina que volem apagar en cada cas.
Si algú el vol millorar, perfecte!!!
Manel Sales



Editat per msales24 el 26/Oct/2012 - 14:16.
Gràcies Manel,

Segur que més d'una persona ho farà servir.

Salut.

Projecte Linkat
Gràcies Manel !

Al centre tinc una entrada al cron que atura les màquines a una hora determinada. També ho tinc als servidors de terminals però a aquests, a més, tinc una entrada a la bios que engega els servidors de terminals, de dilluns a divendres, 15 minuts abans de començar les classes.

A més, a les aules d'informàtica hi tenim interruptors perquè tot quedi aturat tant aviat com s'ha acabat la classe, així no queden 'leds' ni aparells en funcionament.

Continuant amb temes de racionalització del consum enerègetic, a la connexió dels punts wifi hi tenim un rellotge que només els manté engegats mentre el centre és obert.
Gràcies ldalmau,
penso que és molt important la idea que dones sobre la racionalització del consum elèctric.
I és més, aquests dies de tempestes en alguns centres hem tingut problemes amb aparells que s'havien quedat encesos (stand-by) i la tronada els ha malmés. Crec que tenir rellotges que engeguen o apaguen és una molt bona idea!

La idea de l'Script és senzilla, només a partir de les ip poder aturar una màquina, ja que al centre no ho tenim per DHCP. El cron a les màquines de forma individual és una opció que havia fet però pensant-ho millor, l'ideal crec que és poder modificar únicament un script sense haver de tocar res a cap lloc, i des del servidor, poder apagar totes, o la que volguem. Amb el cron al servidor queda tot el centre automatitzat.

Només em queda millorar l'script per a que pugui marcar un rang d'ips concretes. A veure si algú s'anima!

Salut!
Manel
Si poses el rang d'IP amb un guió interior (120-260 per exemple) no et funciona?
Una altra opció podria ser detectar totes les IP de la xarxa amb nmap -f.
Tens més opcions per a nmap aquí.



Editat per fteruelo el 01/Nov/2012 - 10:15.
Una idea millor amb una modificació bàsica del'script:

Un bucle (while) amb els valors de les IP afectades que passi a la variable amb un condicional per si la màquina és apagada que no s'esperi. Sembla la solució més senzilla i reaprofites el codi que ja tens preparat.

Ja em diràs.

PS: De tota manera i com a redundància de seguretat, el tancament programat a cada màquina uns deu minuts després de la crida oficial del servidor per si de cas no l'anul·laria; si no funciona l'un, funciona l'altre.



Editat per fteruelo el 05/Nov/2012 - 06:52.
Gràcies ftruelo,

la idea de nmap era la que estava barallant creant un segon script en bash que cridés el primer, però al final ho he deixat per massa scripts. Busco alguna cosa més simple, si es pot fer amb una cosa millor que amb dues :-) i com que les ip ja les sé, no cal buscar-les, és un rang concret.
La idea del bucle és bona, només amb les ip que vull.... miraré de buscar una estona i fer-ho.
El que dius de la redundància de seguretat hem sembla perfecte!

Manel Sales
Hola Manel,

Be no se si et servirà, aquesta setmana he publicat com treure una finestra per avisar que es tanquen les màquines, ho he publicat al meu bloc.

http://tecnocat.blogspot.com.es/2012/11/linux-cron-executar-programes-grafics.html

Bespres tinc al crontab de cada màquina que s'aturi a una hora concreta per exemple a les 6:

00 18 * * * * root shutdown -h now

i així m'asseguro que no quedin màquines posades en funcionament a la nit.

No se si es el que cercaves, però es una altra opció.

Josep M Sardà
Coordinador Informàtica
IES Ramon Turró i darder
Hola Manel,


Ja us compartiré uns scripts que tinc que fa el següent:

1- Comparteix claus ssh per la qual cosa els scripts es simplifiquen molt
2- Fa un escanneig de la xarxa cercant els ordinadors que tenen el port 22 d'ssh obert
3- Permet executar ordres remotes per la qual cosa podem aturar les màquines (shutdown -h now) o bé instal·lar programes, etc (tot dependrà del que li poseu a dins).

Aquests scripts son una mena de plantilla que us permetrà executar ordres remotes. Ara bé, haureu d'emplenar la part corresponent a l'acció que voleu dur a terme.


Us els publicaré i us els comentaré (segurament m'haureu sentit a dir ...la màquina de fer xurros...o sigui que són aquests scripts ;-)


Joan
Hola Manel,


T'he deixat a:

http://goo.gl/FnTl0

(és el meu compte de dropbox)

els scripts fer fer gestió centralitzada de les màquines Linkat.

Com veuràs, el paquet tar.gz conté dos scripts:

L'script ssh_distribueix_claus.sh s'encarrega d'escannejar la xarxa 192.168.0.0/24 (definida a la variable XARXA), i copiar la clau pública ssh. Si fem un petit recordatori, la generació del parell de claus pública/privada es fa a través de l'ordre: ssh-keygen. Doncs aquest script mira dins de la xarxa quines màquines tenen el port 22 obert (port d'ssh i per tant màquina amb Linkat).

Un cop s'ha fet el repartiment de la clau pública (recorda de generar-la abans tal i com t'he comentat) tens un altre script d'exemple que he anomenat ssh_canvi_contrasenya.sh. Aquest script l'agafes com a model ja que el que fa és escannejar la xarxa, connectar-se remotament via ssh i després executa una acció. En el cas de l'exemple, l'acció és de canviar la contrasenya de root dels ordindors remots.

Espero que siguin útils aquests scripts (aka màquina de fer xurros ;-) ). La meva recomanació és que, abans de fer qualsevol acció massiva dins del centre, ho proveu amb un ordinador de proves.

:-)



Joan
Gràcies Josep M,
el tema d'apagar-los amb el cron ja ho tenia present, però entre sessions de classes em quedaven oberts, i amb l'script que he fet al principi em va bé, ja que mentre es recull la classe l'executo i s'apaguen totes les màquines. La meva idea principal era poder decidir quan volia apagar-les, que pot variar...
Ara em queda per al nadal que executi una sèrie seguida de màquines a partir d'una llista que es detecti de màquines engegades, tipus nmap 0.0.0.0/24 > llista.txt i després un ./apagar.exp llista.txt (alguna cosa +/-)... ja veure'm.

Gràcies pel post al bloc!
Molt interessant
Manel
Hola Joan,

ja m'he abaixat els scripts!
em sembla molt interessant les possibilitats que ofereixen, ara cal fer proves (controlades). Executant el segon script per apagar podria ser una molt bona opció per al que vull fer!

Moltes gràcies Joan

Manel
Hola Manel,

Correcte, si t'hi fixes, al segon script només hauries de posar l'ordre shudown o halt.

Si vols provar això:

ssh -o StrictHostKeyChecking=no -o BatchMode=yes $USUARI@$IP "/sbin/halt"


et tancarà les màquines de forma immediata.

Fixa't bé que l'ordre que hem de posar es troba al final i entre cometes. La part inicial (ssh -o StrictHostKeyChecking=no -o BatchMode=yes) s'ha de posar perquè és l'ordre que et permet executar coses en remot.

;-)



Joan
Hola Joan,
Ara estic fent les proves ...
Mirant el 2n Script veig el perill que apagui el servidor també!?
El primer Script combina el llenguatge expect amb l'nmap... sembla que amb el primer script serviria, només canviant les comandes de crear les claus de ssh per la comanda d'apagar? estic en el cert?
Com que l'nmap fa un escaneig de tota la xarxa, agafa totes les màquines... veig que s'hauria de canviar la comanda per que només apagui un rang concret.

Gràcies,

Manel
Hola de nou Manel,


Bé, l'script funciona correctament sempre i quan la contrasenya de l'usuari root del servidor de centre sigui diferent de l'usuari root de la resta de les màquines. Si partim d'aquesta base, la clau pública que es copia i es desa al fitxer authorized_keys de totes les màquines menys al servidor de centre (ja que NO tenim la mateixa contrasenya al servidor de centre que a la resta de les màquines!!!!) i per tant aquest fitxer NO es crea al servidor.

També podríes modificar l'script per tal de saltar la IP del mateix servidor. Així doncs, pots estar tranquil que si utilitzes aquest petit truc podràs tancar totes les màquines.


Què et sembla la idea?



Joan
Hola Joan,
tens tota la raó, la contrasenya del servidor és diferent XD (no hi havia caigut).
Amb l'script que he fet jo em serveix per anar tancant les màquines concretes quan vull i amb els que ens has passat podem fer-ho per tot el centre :-)
L'script que ens passes ens permet fer moltíssimes coses, em sembla perfecte!

Crec que queda resolt el tema.
Moltes gràcies!

Manel
Hola Manel,


L'script és només una proposta. Segurament es pot millorar moltíssim. Es pot excloure la IP del servidor en comptes de fer-ho per la "força bruta". La qüestió es que tenim una base per tal que es facin les modificacions que calguin i millorar l'script. Sona a programari lliure oi? :-)

Ànims i me n'alegro molt que l'hagis trobat interessant.

:-)

Joan