Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/07/2011, à 19:48

PieroAgud

[RESOLU] Script bash : test si connexion en ssh établie et extinction

Bonjour à tous!
N'ayant pas trouvé la solution à mon problème, je viens vous en faire part.
Je souhaite réaliser un script bash afin d'éteindre un serveur lorsque personne n'est connecté en ssh dessus (ledit serveur va dans un 1er temps simplement me servir à m'amuser un peu et donc je ne souhaite pas qu'il reste allumé 24/24).
C'est un script à exécuter régulièrement (crontab) dont voici le code :

#!/bin/bash

# On test si quelqu'un est connecté via ssh (les ports 9922 et 443 sont ceux qui seront utilisés suivant les cas).
if [ netstat -ntaup | egrep '^.*:9922.*ESTABLISHED.*sshd.*$' ] || [ netstat -ntaup | egrep '^.*:443.*ESTABLISHED.*sshd.*$' ]
then 
# Si le fichier flag a été crée mais que qqn se connecte ensuite, on le supprime. Sinon on quitte simplement le script.
    echo "connexion active"
    if [ -e flag ]
    then rm -f flag && exit 0
    else exit 0
    fi
# Si personne de connecté la 1ere fois depuis 20 min, on touch un fichier flag. Si toujours personne de connecté alors que flag existe, on éteint.
else
    if [ -e flag ]
    then rm -f flag && echo "on éteint" #&& shutdown -h now
    else touch flag
    fi
fi
exit 0

J'ai commenté la commande shutdown car je test ce script sur mon laptop et j'ai pas envie de redémarrer toutes les 5 min...

Voilà ce qu'il renvoie en console :
Connexion ssh non active :

:~$ ./serverhalt.sh
./serverhalt.sh: ligne 4 : [: « ] » manquant
egrep: ]: Aucun fichier ou dossier de ce type
./serverhalt.sh: ligne 4 : [: « ] » manquant
egrep: ]: Aucun fichier ou dossier de ce type

Malgré les messages d'erreur, le fichier flag est bien crée et si j'exécute une seconde fois, j'ai bien le message "on éteint" qui s'affiche.

Avec un tunnel ouvert sur localhost (ssh localhost -p 9922 -L 1234:localhost:3214) (le port 9922 est le port d'écoute de mon serveur ssh) :

:~$ ./serverhalt.sh
./serverhalt.sh: ligne 4 : [: « ] » manquant
egrep: ]: Aucun fichier ou dossier de ce type
./serverhalt.sh: ligne 4 : [: « ] » manquant
egrep: ]: Aucun fichier ou dossier de ce type

Toujours les messages d'erreur. Là le problème, c'est que le fichier flag est aussi crée (et idem, extinction si je relance le script).

Visiblement, c'est le test if avec netstat qui est mal écrit... j'ai tenté ça sur le conseil d'un ami mais ça n'a pas l'air de fonctionner...
Si quelqu'un pouvait m'indiquer comment écrire le test suivant : if "quelqu'un est connecté en ssh sur la machine et/ou sftp et/ou un tunnel est ouvert" (je pense que c'est la même condition?)
De plus, j'ai mis des "exit 0" pour sortir du script (restes des 3 ou 4 cours de C de mon école d'ingé...) mais je ne sais pas si c'est la bonne méthode. Quelqu'un peut-il m'éclaire sur ce point?

Merci d'avance wink

Dernière modification par PieroAgud (Le 20/07/2011, à 17:40)

Hors ligne

#2 Le 19/07/2011, à 09:49

binouche22

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Bonjour,
il manque des  '`' a la ligne 4:

if [ `netstat -ntaup | egrep '^.*:9922.*ESTABLISHED.*sshd.*$'` ] || [ `netstat -ntaup | egrep '^.*:443.*ESTABLISHED.*sshd.*$'` ]

Pourquoi ne pas simplement utiliser la commande who pour voir la liste des utilisateurs connectés?

Dernière modification par binouche22 (Le 19/07/2011, à 09:53)


binouche22

Hors ligne

#3 Le 19/07/2011, à 11:30

PieroAgud

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Rhooo j'ai honte big_smile
Merci pour ta réponse, je teste ça en rentrant ce soir.

binouche22 a écrit :

Pourquoi ne pas simplement utiliser la commande who pour voir la liste des utilisateurs connectés?

Heu...excellente question ^^
Je suis un grand débutant en bash et je n'y avais pas pensé...
En fait j'ai rédigé ce script après une conversation avec un ami qui en utilisait un pour son serveur, sauf qu'il testait plusieurs services comme ça (ssh, ftp, samba, http...). Du coup c'était peut-être plus simple.
Ensuite, à terme, je compte crée des comptes user avec des chroot pour ma famille afin de faire un peu de SFTP...du coup tester si une connexion ssh est ouverte est peut-être plus simple que de faire un test sur tous les users? Mais peut-être me trompe-je. En tout cas si tu peux m'en dire plus sur la manière dont tu vois les choses, ça m'intéresse!

Hors ligne

#4 Le 19/07/2011, à 14:24

Watael

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

salut

les crochets ne sont pas nécessaires, et un seul grep suffit

if netstat -ntaup | egrep -q '(9922|443).*ESTABLISHED.*sshd'; then...fi

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 19/07/2011, à 14:51

PieroAgud

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Le ; c'est pour compenser l'absence de crochets?
Le début de l'expression (avant le port, ^.*:) n'est pas nécessaire?
Lorsqu'on ne met pas de crochets, on peut se passer de back quotes?

Hors ligne

#6 Le 19/07/2011, à 16:15

Watael

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Le ; c'est pour compenser l'absence de crochets?

non, c'est parce que j'ai tout écrit sur une ligne.

Le début de l'expression (avant le port, ^.*:) n'est pas nécessaire?

'^.*' siginifie "commence par n'importe quel caractère", c'est implicite.
Par contre les deux points peuvent être utiles, donc, en effet, plutôt

grep ':(9922|443).*ESTABLISHED.*sshd'

Lorsqu'on ne met pas de crochets, on peut se passer de back quotes?

oui, il faut ne pas utiliser la substitution de commande.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 20/07/2011, à 08:15

PieroAgud

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Merci Watael wink

EDIT : J'ai enfin pu tester, et ça fonctionne nickel!
Merci à tous les deux pour vos réponses!

Dernière modification par PieroAgud (Le 20/07/2011, à 17:39)

Hors ligne

#8 Le 25/07/2011, à 08:32

sputnick

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

Solution plus simple et très concise ^^

[[ $SSH_CONNECTION ]] || halt

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 25/07/2011, à 09:57

Watael

Re : [RESOLU] Script bash : test si connexion en ssh établie et extinction

salut,

simple et concis pour savoir si tu es connecté en ssh, mais ça ne dira pas si d'autres utilisateurs le sont.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne