Scriptons ! ou pas !

Développement Web côté client (Xhtml, Css, Javascript), coté serveur et système (Php, Java, Mono, Perl, Python, C, C++), Gestion de projet (UML, CVS), Environnements de développement (Eclipse, Mozilla XPFE), 3D (OpenGL), Bases de données (PostgreSql, MySql) ...

Modérateur: Equipe de modération des forums

Scriptons ! ou pas !

Message par jonas » 09 Fév 2009, 08:05

Bonjour,
Dans le cadre de la préparation LPIC-1 il y a un gros chapitre sur les commandes en ligne qui se termine par une introduction aux scripts shell.

Ce chapitre est, je crois, le plus long mais il est néanmoins très intéressant.

Quand je travaillais chez EDS, j'ai été administrateur Solaris pendant quelques mois, juste avant de venir ici. A cette occasion j'ai pu me former un peu aux scripts shells. Je suis très loin d'être un crack de la discipline mais je trouve cela assez amusant à réaliser.

C'est assez intéressant de voir la puissance que l'on a par rapport aux batches MS-DOS.

Qui serait intéressé par la création d'une section scripts dans le forum ?
Pensez-vous que ce serait une bonne idée ?

J'en lance un que j'ai fait ce week-end pour donner l'exemple :

Il est encore un peu brouillon et manque peut-être de commentaire, mais c'est un premier jet et il fonctionne.

#!/bin/sh
# script visant a automatiser la creation de compte.
#=========================================================================
# Auteur | Jonas FERNANDEZ pour entrainement | 7 fevrier 2009
#=========================================================================
# N° de version | commentaire | date
#=========================================================================
# Version 0 | creation et premier tests. | 7 fevrier 2009
# Version Beta | creation compte UNIX uniquement | 8 fevrier 2009
# Version Beta2 | creation comptes Unix et samba |
#
#
#=========================================================================
echo "$0 permet de creer des comptes utilisateurs Unix (et samba prochainement ) en une seule commande."
##########################################
# recuperation du code utilisateur saisi dans une variable
echo "Veuillez saisir le code utilisateur en minuscules. (chiffres autorisés.) \c"
utilisateur=$utilisateur
read utilisateur
utilisateur=`echo "$utilisateur" | tr "[A-Z]" "[a-z]"`
echo "le compte utilisateur est $utilisateur , je vais verifier s'il n'existe pas deja."
vartmp=`cat /etc/passwd | cut -d: -f1 | grep "^$utilisateur$"`
if test -z "$vartmp"
then
echo "le compte n'existe pas"
elif test $vartmp=$utilisateur
then
echo "le compte existe deja"
sleep 2
exit 0
fi
# ############################################
# calcul de l'UID du nouveau compte en ajoutant un au dernier UID du
fichier /etc/passwd
echo "Recuperation UID nouveau compte"
lastUID=`cat /etc/passwd | grep "^[a-z]" | cut -d: -f3 | tail -1`
newUID=`expr $lastUID + 1`
echo "calcul UID donne $newUID"
######################################
#Controle de l'inexistance de l'UID
echo "verification de son inexistance dans la base des comptes"
varUID=`cat /etc/passwd | cut -d: -f3 | grep "^$newUID$"`
if test -z "$varUID"
then
echo " Numero $newUID disponible "
elif test $varUID -eq 0
then
echo " $newUID est deja utilise - controlez votre base "
exit 1
fi
echo "UID de $utilisateur sera $newUID"
#########################################
#Recuperation du nom de groupe et attribution du groupe users par defaut.
echo " Veuillez saisir le nom de groupe principal pour $reponse."
echo " Si vous ne saisissez rien, le groupe par defaut sera users"
echo " tapez sur enter pour ne rien saisir \c"
groupe=$groupe
read groupe
echo "$groupe"
searchgrp=`cat /etc/group | cut -d: -f1 | grep "^$groupe$"`
if test -z "$searchgrp"
then
echo "Le groupe saisi n'existe pas ou vous n'avez rien saisi."
echo "le groupe par defaut sera donc users"
groupe=${groupe:-users}
fi
case $groupe in
users)
echo "Le groupe par defaut sera users"
;;
*)
echo "le groupe par defaut sera $groupe"
;;
esac
###########################################
# recuperation du contenu du champs de commentaire (NOM, Prénom, age, sexe, qualités...)
echo "voulez-vous remplir le champs GECOS (commentaire Nom, prénom) ? (O/N) \c"
reponse=$reponse
echo "$reponse"
read reponse
case $reponse in
[oO])
echo "veuillez saisir le champs gecos \c"
gecos=$gecos
read gecos
echo "vous avez choisi $gecos -En cas d'erreur vous pourrez toujours le modifier plus tard."
;;
[nN])
echo "Vous ne souhaitez pas saisir le champs gecos."
echo "cette information etant facultative je n'insiste pas."
;;
esac
##########################################
# Les informations ont ete recuperees, on peut maintenant creer le compte.
echo "creation du compte $utilisateur avec UID $newUID dont le groupe par defaut est $groupe et le champs gecos contiendra $comment"
useradd -u $newUID -g$groupe -c "$comment" -d /home/$utilisateur -m -s /bin/bash $utilisateur
sleep 3
echo Voici la ligne cree dans la base des comptes UNIX
echo `cat /etc/passwd | grep "^$utilisateur:"`
#######################################
#
# A essayer : mettre un mot de passe à l'utilisateur en utilisant le script.
#######################################
# echo "Creation du compte samba"
# A faire : vérifier si le fichier smbusers existe et si le service est lancé.

# echo "si samba existe"
# A poursuivre...
Modifié en dernier par jonas le 11 Fév 2009, 14:38, modifié 2 fois.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Message par J » 09 Fév 2009, 10:49

tu avais deja propose une rubrique comme ca avec un script pour renommer en serie, script que j'ai reporte dans le spip lolita http://lolita.pf/spip/spip.php?article32

mais ta rubrique d'origine semble ne plus exister ??

et dans la partie programmation du forum, personne ne s'est prive d'en faire ...
ca risque de propager les doublons non ?
Avatar de l’utilisateur
J
Equipe LoLiTa
 
Message(s) : 939
Inscription : 10 Jan 2005, 13:31
Localisation : Dans le cyberpf de mana

Message par jonas » 09 Fév 2009, 14:20

Salut,
En effet et j'ai relu mon ancien script.
Je ne le trouve pas très propre, on peut faire nettement mieux avec moins de lignes.
Je vais le refaire.
Pour ce qui est du fil... ça y est, c'est déplacé.
A bientux.
Jonas.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Message par dominix » 09 Fév 2009, 17:14

lorsque tu poste du code balise le correctement avec les tag
Code : Tout sélectionner
[code][/code]
sinon c'est illisible
Image
Avatar de l’utilisateur
dominix
Equipe LoLiTa
 
Message(s) : 581
Inscription : 17 Mars 2005, 16:53
Localisation : Moorea : Zone urbano-végétale

Message par dominix » 09 Fév 2009, 17:16

je fait tout ça avec une ligne
Code : Tout sélectionner
 adduser
Image
Avatar de l’utilisateur
dominix
Equipe LoLiTa
 
Message(s) : 581
Inscription : 17 Mars 2005, 16:53
Localisation : Moorea : Zone urbano-végétale

Message par Cocobu » 10 Fév 2009, 08:26

J'aime pas trop la manière de supposer que le UID + 1 de la dernière ligne du fichier passwd sera libre, même si tu testes sa disponibilité plus tard.
De plus tu utilises des commandes qui peuvent gaspiller beaucoup de mémoire si le fichier est important.
Rien que dans cette partie de code :
Code : Tout sélectionner
cat /etc/passwd | grep "^[a-z]" | cut -d: -f3 | tail -1

des commandes moins gournandes peuvent être utilisées, de plus tu fais des suppositions qui ne sont pas forcement correctes (un login ne commence pas obligatoirement par une minuscule)


Mais comme tu le disais jonas, c'est pour s'entrainer alors amuse toi bien ;)
D'ailleur dans certaines écoles d'informatique, l'apprentissage de la programmation se fait en recodant les fonctions deja présentes sur les système (tel que adduser)
Avatar de l’utilisateur
Cocobu
Equipe LoLiTa
 
Message(s) : 831
Inscription : 24 Mars 2004, 16:20
Localisation : Polynésie Française

Message par jonas » 11 Fév 2009, 14:30

Ben justement, c'est pour m'entrainer et surtout pour mâcher le travail de mes trois collègues, parce que question GNU/Linux ils sont un peu bloqués.

Cela dit, j'ai déjà modifié ce tout jeune script et l'objectif est de le compléter assez vite pour en faire une belle usine à gaz... :oops:
J'ai toujours aimé les usines à gaz. :lol:


Pour ce qui est des logins sous unix, que ce soit en Solaris ou en Unix, j'ai toujours créé des comptes en minuscules. Par contre, le champs des commentaires peut contenir maj, min, chiffres _ -.
Et si je l'ai toujours fait, c'est parce que j'ai appris à faire comme ça.


Mais justement j'ai simplifié :
echo "$0 permet de creer des comptes utilisateurs Unix (et samba prochainement ) en une seule commande."
echo "Veuillez saisir le code utilisateur en minuscules. (chiffres autorisés.) \c"
utilisateur=$utilisateur
read utilisateur
utilisateur=`echo "$utilisateur" | tr "[A-Z]" "[a-z]"`

rien qu'avec ça j'économise 3 ou 4 lignes.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Message par jonas » 11 Fév 2009, 14:44

dominix a écrit :je fait tout ça avec une ligne
Code : Tout sélectionner
 adduser



Bonjour Domi,
J'aime ton humour froid et sophistiqué...
Cependant, j'ai un problème.
Ce problème s'appelle "collègues" (au pluriel).

Mes collègues à l'exception d'un petit djeune qui débute n'aiment pas Linux.

A la limite ils en ont peur.

Alors, je suis d'accord, la commande adduser fait ça très bien, d'ailleurs je m'en sers dans mon script, mais mes petits camarades ne l'utiliseront pas si je ne leur mâche pas un peu le boulot.

Quant à l'absence de commentaire, j'en conviens, mais nous sommes le 11 et j'ai tapé ce script ce week-end en quelques heures, d'ailleurs j'ai bien écrit en préambule qu'il manque encore de commentaire.
J'ai commencé à en rajouter.

Cela dit je suis conscient de mes faiblesses et de mes lacunes, c'est bien pour cela que je m'entraine.

A plus.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Message par dominix » 11 Fév 2009, 15:02

jonas a écrit :...
Alors, je suis d'accord, la commande adduser fait ça très bien, d'ailleurs je m'en sers dans mon script,


d'après ce que j'ai vu tu te sert de useradd, c'est pourquoi j'ai mentionné adduser.

Si tes collègues ont des problèmes avec la ligne de commande je te recommande d'utiliser les panneaux de contrôle graphique développé dans toutes les distrib, genre : [gnome-system-tools] /usr/bin/users-admin voire d'installer webmin qui, bien que codé archaïquement, est très utilisable pour ce genre d'administration a travers un navigateur.
Image
Avatar de l’utilisateur
dominix
Equipe LoLiTa
 
Message(s) : 581
Inscription : 17 Mars 2005, 16:53
Localisation : Moorea : Zone urbano-végétale

Message par jonas » 11 Fév 2009, 15:03

Jusqu'à présent mes collègues utilisaient yast pour créer des comptes mais à deux ou trois reprises, on s'est rendu compte qu'il y avait un problème.

Donc j'ai préféré leur montrer la méthode commande en ligne qui, bien qu'elle leur paraisse archaïque est la première méthode enseignée dans toute formation Unix.

Et c'est là que ça a un peu coincé.

A plus.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Message par J » 11 Fév 2009, 16:26

vous etes sous opensuze ?

quelle relation entre ton script de creation d'utilisateurs et le fait de resoudre vos problemes sous yast qui est un gestionnaire d'install...

aka sur son framblog donne des liens en vrac; parmi ceux-ci y'en a un qui pourrait clarifier ta gestion users unix/samba.

Linux and Ubuntu How-To Articles
http://www.howtogeek.com/howto/ubuntu/create-a-samba-user-on-ubuntu/

Create a Samba User on Ubuntu

If you are using Samba Server on your network, you will want to create users that have access to use it. There's a very simple command structure on how to do so.

I'm assuming that you've already installed Samba Server at this point.

There are two steps to creating a user. First we'll run the smbpasswd utility to create a samba password for the user.

Code : Tout sélectionner
sudo smbpasswd -a <username>


Next, we'll add that username to the smbusers file.

Code : Tout sélectionner
sudo gedit /etc/samba/smbusers


Add in the following line, substituting the username with the one you want to give access to. The format is <ubuntuusername> = "<samba username>". You can use a different samba user name to map to an ubuntu account, but that's not really necessary right now.

Code : Tout sélectionner
<username> = "<username>"


Now you can create samba shares and give access to the users that you listed here.
Avatar de l’utilisateur
J
Equipe LoLiTa
 
Message(s) : 939
Inscription : 10 Jan 2005, 13:31
Localisation : Dans le cyberpf de mana

Message par jonas » 12 Fév 2009, 15:06

Bonjour,
YaSt n'est pas qu'un gestionnaire d'installation.

Il est aussi sensé permettre de créer et supprimer des comptes, de gérer la sécurité, etc.

En fait nous sommes sous SLES9 (Novell)

De toute façon, avec le ligne de commande, ça fonctionne.
L'intérêt de faire un script est de simplement permettre la création d'un compte unix, suivi d'un compte samba en une seule saisie.

D'ailleurs hier, j'ai complété mon script et il fonctionne.
J'ai pu créer le compte Unix et samba en une seule commande, j'ai juste eu à donner des infos à l'invite lorsque cela était demandé et ça a fonctionné.

Il a fallu qu'à la fin de la création du compte unix, je fasse saisir à l'invite le mot de passe, que le colle dans une variable puis ensuite ça a roulé.
Par contre, je vais essayé de sécuriser un peu plus la saisi du mot de passe pendant le déroulement du script.
J'ai quelques pistes, mais je compte bien essayer de me débrouiller pour le moment.

Comme je l'ai dit, pour l'instant je m'entraine.
J'avais déjà scripté par le passé, mais jamais à ce niveau, je suis en phase d'apprentissage et je m'éclate parce que finalement le résultat est conforme à mes espérances.
Cela dit, j'ai encore bien du chemin à faire.

A bientux.
Jonas.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Re: Scriptons ?

Message par jonas » 15 Avr 2010, 15:46

En voici un autre, mais n'allez pas croire que je n'en fait qu'un par an... En fait j'aime bien tout automatiser, donc j'en ai quelques autres sous la main.

cat chpublicIP.sh
Code : Tout sélectionner
#!/bin/bash
# Auteur        :  Date de creation      :      observation
# Jonas : 20100322                       :   Version 0  et version 1 Creation et mise en production
# Jonas : 20100413                       :   Version 2 n'envoie l'adresse que lorsqu'elle a changée.
#
#creation variable OLDPUBIP servant de reference pour comparer avec la nouvelle IP.
OLDPUBIP=`cat IPPUB.txt`
# creation de la variable PUBIP pour : "Public IP". Elle contiendra l adresse IP publique du site.
PUBIP=`wget http://www.whatip.com ; grep -i "your IP: " index.html | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"`
echo affichage IP Publique
echo $PUBIP
# creation du fichier de reference pubip
echo $PUBIP > pubip
echo $PUBIP > IPPUB.txt
case $PUBIP in
        $OLDPUBIP )
                        echo "pas de changement"
                ;;
               * )
                        echo "changement adresse effectué depuis le dernier test"
                        # Envoi du contenu du fichier dans une boite aux lettre.
                        # L'extension ".txt" est ici  purement esthetique, bien que d un gout douteux.
                        mutt -a /usr/scripts/IPPUB.txt-s "IP publique modifiee - MONSITEDISTANT"  info@mondomaine.pf,adresse@domaine2.pf < /usr/scripts/IPPUB.txt
                ;;
esac
# suppression des anciens fichiers index.html qui peuvent parasiter et s accumuler.
rm -f /usr/scripts/index.html*


Comment envoyer l'adresse IP publique d'un site seulement lorsqu'il a changé d'adresse...
On exécute ce script tous les quarts d'heure et si et seulement si l'adresse a changé, alors on envoie un message.
Dans un environnement avec des IP dynamique, ce peut être un complément pour "doubler" un domaine dyndns.org par exemple.


Cordialement.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Re: Scriptons ?

Message par jonas » 15 Avr 2010, 15:54

Et en voici un autre dans lequel j'ajoute parfois un module.
Je l'ai appelé verif_service.sh. Il vérifie les services et il les
Code : Tout sélectionner
!/bin/bash
# Controle et relance de certains jobs ou application sur un serveur GNU/Linux ou Unix.
# Les sections inutilisées peuvent etre commentees par "# "  sur environ 15 lignes.
# Une section commence par #Section <n> (n étant un numéro)
# Ce script est lancé automatiquement,  par le planificateur de tache Unix (cron)
# mais comme il se rallonge copieusement avec le temps, on pourrait imaginer l'ajout d'un menu pour les démarrages manuels sur commande
# qui seraient effectués par un personnel d'exploitation peu qualifié sous ce type de systeme.
# Auteur    : date       : Observations
# Jonas      : 20091112   : version 0  test
# Jonas      : 20091112   : version 1 premiere version de prod. + ajout squid et dansguardian.
# Jonas      : 20100318   : version 2 deuxieme version de prod. Ajout de OpenSSH, ddclient et UPSILON (pour le système d'onduleur adéquat.).
# Jonas      : 20100322   : version 3 troisième version de prod. Insertion de postfix et décalage sections. (0= première section)
#       :      :
# Ce script peut être adapté pour controler tout autre application et la relancer si nécessaire.
# Chaque application a tester ou relancer est dans une section
#
# Section 0 - postfix
nligne1=`ps -ef | grep postfix | grep -v grep | wc -l`
echo "le nombre des occurences postfix : $nligne1 "
case $nligne1 in
   0)
      echo "postfix n'est pas demarre"
      /etc/init.d/postfix start
      sleep 5
      echo "postfix a ete relance par le script"
      mutt -s "postfix relance par le script" info@domaine.pf < /root/Message
      ;;
   *)
      echo "postfix est OK ! "
      ;;
esac

## Section 1 - amavis
nligne1=`ps -ef | grep amavis | grep -v grep | wc -l`
echo "le nombre des occurences amavis : $nligne1 "
case $nligne1 in
   0)
      echo "amavis n'est pas demarre"
      /etc/init.d/amavis start
      sleep 5
      echo "amavis a ete relance par le script"
      mutt -s "amavis relance par le script" info@domaine.pf < /root/Message
      ;;
   *)
      echo "amavis est OK ! "
      ;;
esac

## Section 2 - rainlendar
nligne2=`ps -ef | grep rainl | grep -v grep | wc -l`
echo "nombre occurences rainlendar : $nligne2"
case $nligne2 in
        0)
          echo "rainlendar est arrete"
          /usr/bin/rainlendar/rainlendarserver &
          sleep 5
          echo "rainlendar redemarre par le script"
          mutt -s "rainlendar relance par le script" info@domaine.pf < /root/Message
          ;;
         [1-9])
         echo "rainlendar est OK ! "
         ;;
esac


# Section 3  - squid + dansguardian
nligne3=`ps -ef | grep squid | grep -v grep | wc -l`
echo "nombre occurences squid : $nligne3 "
case $nligne3 in
   0)
      echo "Squid n'est pas demarre"
      /etc/init.d/squid start
      /etc/init.d/dansguardian restart
      sleep 5
      echo "squid redemarre par le script"
      mutt -s "squid relance par le script" info@domaine.pf < /root/Message
      ;;
      
   *)
      echo "squid est OK ! "
      ;;
esac
# Section 4 - dansguardian seul
nligne4=`ps -ef | grep dansguardian | grep -v grep | wc -l`
echo "nombre occurences dansguardian : $nligne4"
case $nligne4 in
   0)
      echo "dansguardian n'est pas demarre, mais squid si !"
      /etc/init.d/dansguardian start
      sleep 5
      echo "dansguardian redemarre par le script"
      mutt -s "dansguardian seul relance par le script" info@domaine.pf < /root/Message
      ;;
      
   *)
      echo "dansguardian  est OK ! "
      ;;
esac
# Section 5 - OpenSSH
nligne1=`ps -ef | grep sshd | grep -v grep | wc -l`
echo "le nombre des occurences OpenSSH : $nligne1 "
case $nligne1 in
   0)
      echo "OpenSSH n'est pas demarre"
      /etc/init.d/sshd start
      sleep 5
      echo "OpenSSH a ete relance par le script"
      mutt -s " OpenSSH relance par le script" info@domaine.pf < /root/Message
      ;;
   *)
      echo " OpenSSH est OK ! "
      ;;
esac
## Section 6 - ddclient
nligne1=`ps -ef | grep ddclient | grep -v grep | wc -l`
echo "le nombre des occurences ddclient : $nligne1 "
case $nligne1 in
   0)
      echo "ddclient n'est pas demarre"
      /etc/init.d/ddclient start
      sleep 5
      echo "ddclient a ete relance par le script"
      mutt -s "SAT - ddclient relance par le script" info@domaine.pf < /root/Message
      ;;
   *)
      echo " ddclient est OK ! "
      ;;
esac
# Section 7 - rupsd - upsilon
nligne1=`ps -ef | grep upsilon | grep -v grep | wc -l`
echo "le nombre des occurences upsilon : $nligne1 "
case $nligne1 in
   0)
      echo "upsilon n'est pas demarre"
      /etc/upsilon/upsilon start
      sleep 5
      echo "upsilon a ete relance par le script"
      mutt -s "upsilon relance par le script" info@domaine.pf < /root/Message
      ;;
   *)
      echo "upsilon  est OK ! "
      ;;
esac



Bien sur vous allez me dire que sous GNU/Linux, si les services s'arrêtent c'est qu'il y a un sérieux problème, donc relancer les services est débile...
Et bien soit, mais comme je l'ai déjà dit, je m'entraine...
Et si certains veulent reprendre tout ou partie du code de ces scripts, faites comme chez vous.

A plus.
Jonas.
Celui qui a des idées reçues sur tout a surtout des idées reçues.
jonas
Equipe LoLiTa
 
Message(s) : 368
Inscription : 13 Déc 2004, 17:08
Localisation : Faa'a

Re: Scriptons ?

Message par dominix » 16 Avr 2010, 11:47

Code : Tout sélectionner
nligne1=`ps -ef | grep postfix | grep -v grep | wc -l`
pas beau; trop de pipe

le même en 2 commandes au lieu de 4
Code : Tout sélectionner
nligne=$(ps -ef | awk 'BEGIN{i=0};/[p]ostfix/ {i++};END{print i}')


bilan 13 ouverture de fd contre 21.
Image
Avatar de l’utilisateur
dominix
Equipe LoLiTa
 
Message(s) : 581
Inscription : 17 Mars 2005, 16:53
Localisation : Moorea : Zone urbano-végétale

Suivant

Retour vers Développement et programmation

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)

cron