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 21/04/2006, à 11:57

bris

script bash et "vi"

Bonjour à tous,
découvrant les joies de l'administration, je me dois aussi de découvrir les joies des automatisation si je ne veux pas devenir fou que que mes doigt restent collés aux clavier 24/24 sur... Je dois don apprendre à écrire des script bash.

Le premier que je souhaiterai faire est la création de la création d'un nouveqau utilisateur pour un partage samba avec security=user. Voici ma question :

Comment inclure dans mon script :
- ouvrir le fichier /etc/samba/smb.conf avec vi
- positionner le curseur à la fin du fichier
- aller à la ligne et insérer une ligne
- insérer les lignes suivantes : #ou $USR a été défini précédement

[doc_$USR]
path = /home/$USR/documenti_$USR
valid users = $USR
public = no
writable = yes
create mask = 0700
browseable = no

- enfin sauvegarder et quitter


Voilà, je connais bien évidement les commandes : vi, i pour insérer, :wq, etc... mais comment faire les inclure dans un script bash?

Merci d'avance pour votre aide;-)
A+

Dernière modification par bris (Le 21/04/2006, à 11:57)


un vaut mieu que deux ! CQFD

Hors ligne

#2 Le 21/04/2006, à 12:26

cep_

Re : script bash et "vi"

Plusieurs solutions, dont :

http://abs.traduc.org/abs-3.7-fr/io-redirection.html

#3 Le 24/04/2006, à 09:22

bris

Re : script bash et "vi"

salut cep,
J'ai bien compris les redirections, j'ai fait quelques tentatives infructeuses du genre :

cat /etc/samba/smb.conf > /temp/smf.provisoire
echo 'gnangangna....' > /temp/smf.provisoire
cp /temp/smf.provisoire /etc/samba/smb.conf
rm /temp/smf.provisoir

mais je me retrouve avec un smb.conf avec seulement 'gnagnagna...' d'écrit alors que mon but est d'écrire d'abord le smb.conf précédent puis d'y ajouter à la fin 'gnagnagna...' .

Donc comment fait-on pour positionner le curseur à la fin d'un fichier pour  pouvoir y ajouter quelque chose? ou alors peut-etre que mon approche est complètement mauvaise...?! hmm

Dernière modification par bris (Le 24/04/2006, à 09:23)


un vaut mieu que deux ! CQFD

Hors ligne

#4 Le 24/04/2006, à 09:38

cep_

Re : script bash et "vi"

Salut bris :

echo 'gnangangna....' > /temp/smf.provisoire 

echo 'gnangangna....' >> /temp/smf.provisoire

#5 Le 24/04/2006, à 09:39

cep_

Re : script bash et "vi"

plus en détail wink


remplacer > par >>

#6 Le 24/04/2006, à 09:48

kaworu

Re : script bash et "vi"

dans les redirections tu peux aussi ajouter une ligne dans un fichier de manière très simple en bash :
EXEMPLE
le fichier foo.conf :

1. ici la 1er ligne du fichier
2. ici la 2eme ligne etc..

il y'a un fichier nommé foo.conf avec 2 lignes !
maitenant abracadabra :

alex@gentoo ~ $ echo '3. voici la 3ème ligne ajoutée par la redirection!' >> foo.conf

et foo.conf ressemble à :

1. ici la 1er ligne du fichier
2. ici la 2eme ligne etc..
3. voici la 3ème ligne ajoutée par la redirection!

Tadaaaaaaaa !

ainsi avec echo 'ce que tu veux' >> le_fichier_que_tu_veux
tu peux ajouter des lignes à la fin d'un fichier !
pas besoin d'ouvrir/éditer/fermer !!!

pour ton cas :
- soit tu fais pleins d'echo dans ton script ---> pas joli et pas modulable !!!
- tu crée un fichier (genre newuser.conf) ou tu ajoute toutes les lignes :

[doc_$USR]
path = /home/$USR/documenti_$USR
valid users = $USR
public = no
writable = yes
create mask = 0700
browseable = no

et tu redirige dans ton script original :

more newuser.conf >> smb.conf

ou 

less newuser.conf >> smb.conf

biensur faut mettre les PATH corrects ! (là j'ai fais ça à l'arache, mais c'est pas compliqué à adapter!)

Si j'ai pas été clair, crie !

Enjoy !

Dernière modification par kaworu (Le 24/04/2006, à 09:53)


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#7 Le 24/04/2006, à 10:33

bris

Re : script bash et "vi"

Merci les gars pour votre aide, tout est clair wink

J'ai meme trouver une autre solution :

cat << HERE >> /etc/samba/smb.conf
[doc_$USR]
path = /home/$USR/documenti_$USR
valid users = $USR
public = no
writable = yes
create mask = 0700
browseable = no
HERE

Ce qui est à peu de chose près ce que vous m'avez écrit... J'aime beaucoup la solution de kaworu de créer un fichier newuser.conf.

Si vous etes, peut-on paaser à quelque chose d'un peu plus compliqué big_smile :

Je suis en train de faire un petit script pour éliminer un user, et à un moment donné, je voudrai tester s'il existe une ligne [doc_$USR] dans /etc/samba/smb.conf et le cas échéant l'éliminer ainsi que les 6 lignes qui suivent... vous voyez ce que je veux dire?

C'est possible? je fais fausse route?
A+ :-)


un vaut mieu que deux ! CQFD

Hors ligne

#8 Le 24/04/2006, à 13:25

kaworu

Re : script bash et "vi"

oui ta solution marche aussi, mais c'est comme mettre pleins de "echo". C'est plus élégant de ce servir d'un autre fichier wink

Pour ta 2eme question j'ai le début de la réponse :

bool=`grep "[doc_$USR]" smb.conf`
if [ "${bool}" = "" ]
then 
    :
else
    #je sais pas quoi mettre
fi

voilà pour le début, après il faut peut etre te diriger vers sed pour l'édition, mais je suis vraiment pas sur !

Dernière modification par kaworu (Le 24/04/2006, à 14:08)


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#9 Le 24/04/2006, à 14:07

kaworu

Re : script bash et "vi"

En faite la 1ère solution de fichier séparé ne marche pas !
car avec un less/more on copie l'information littéral et la variable $USR ne sera pas la valeur de $USR mais '$USR' !!!
donc je te propose une autre solution (qui garde l'avantage d'un fichier séparé ):
un fichier newuser.conf.sh

echo "[doc_$USR]"
echo "path = /home/$USR/documenti_$USR"
echo "valid users = $USR"
echo "public = no"
echo "writable = yes"
echo "create mask = 0700"
echo "browseable = no"
echo ""

et dans ton script principal :

source newuser.conf.sh >> smb.conf

"source" sert à executer le code d'un fichier.
(pas oublier de bien initialiser ta variable $USR)
voilà c'est moins joli mais au moins ça marche !

Dernière modification par kaworu (Le 24/04/2006, à 15:33)


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#10 Le 24/04/2006, à 16:05

kaworu

Re : script bash et "vi"

Salut !
après quelques test :

1. fichier qui sert à crée les lignes dans smb.conf

#/bin/bash

USR=$1
source newuser.conf.sh >> smb.conf
echo "done for user $1"

Ce script prend le nom de user que tu veux ajouter en argument, chuis toujours pas satisfait de la technique, ça doit etre possible de le faire en se basant sur un fichier de conf normal...

2. le fichier demandé par le 1er script (newuser.conf.sh):

echo "[doc_${USR}]"
echo "path = /home/${USR}/documents_${USR}"
echo "valid users = ${USR}"
echo "public = no"
echo "writable = yes"
echo "create mask = 0700"
echo "browseable = no"
echo ""

3. le fichier pour virer un utilisateurs du fichier smb.conf :

#!/bin/bash

USR=$1

#on cherche la ligne où doc_${USR} apparait avec grep, le cut sert à isoler le no de ligne :
LINE=`grep "doc_${USR}" smb.conf -n | cut -d ":" -f 1`

#on initialise un compteur pour la boucle, on va éffacer 8 lignes :
COUNTER=0


until [ $COUNTER -eq 8 ]
do

#on redirige la sortie de sed (qui est tout le fichier SAUF la ligne que l'on va effacer) 
#vers un fichier temporaire
    sed ${LINE}d smb.conf > smb.conf.temp

#on renomme le fichier temporaire par le fichier définitif que l'on veut :
    mv smb.conf.temp smb.conf

#on incrémente le compteur pour la boucle :
    COUNTER=$(( $COUNTER + 1 ))
done

il prend le nom de user en argument. pas très compliqué, chuis sur qu'on peut faire vraiment mieux, mais chuis une pioche en BASH je viens juste de commencer...

voilà ! je laisse à d'autres et à toi le soin de donner des améliorations à ces bouts de codes.

Enjoy !


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#11 Le 25/04/2006, à 00:18

kaworu

Re : script bash et "vi"

re
1.

#/bin/bash

export USR=$1

# cette ligne va ajouter le contenu du fichier newuser.conf
# au fichier smb.conf en remplacant toutes les occurences de
# USER par la variable $USR
echo "$(sed "s/USER/${USR}/g" newuser.conf)" >> smb.conf

# on insère une ligne vide pour faire joli !
echo "" >> smb.conf

echo "Modifications faites pour l'utilisateur $USR dans smb.conf"

2.

[doc_USER]
path = /home/USER/documents_USER
valid users = USER
public = no
writable = yes
create mask = 0700
browseable = no

3.

#!/bin/bash

export USR=$1

# on cherche la ligne où [doc_${USR}] apparait avec grep, le cut sert à isoler le no de ligne :
FIRSTLINE=`grep "\[doc_${USR}\]" smb.conf -n | cut -d ":" -f 1`
LASTLINE=$(( $FIRSTLINE + 7))

# on redirige la sortie de sed (qui est tout le fichier SAUF les lignes que l'on va effacer) 
# vers un fichier temporaire
sed "${FIRSTLINE},${LASTLINE}d" smb.conf > smb.conf.tmp
mv smb.conf.tmp smb.conf

voilà c'est déjà nettement mieux, et comme ça j'ai appris un peu sed (ouais enfin, y'a des bouquins entiers juste sur cette méthode...)

Enjoy !


"There are in order of increasing severity: lies, damn lies, statistics, and computer benchmarks."

Hors ligne

#12 Le 27/04/2006, à 18:32

bertrand0

Re : script bash et "vi"

Tu peux aussi faire directement
sed "/^\[doc_$USR\]$/,+6d" smb.conf > smb.conf.tmp


Ceux qui écrivent comme ils parlent, quoiqu'ils parlent très bien, écrivent mal.
                                                            Buffon, Discours sur le style

Hors ligne