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 10/06/2006, à 13:47

deadstar

problème insertion dans fichier text

Bonjour à tous smile

Voilà j'ai un petit souçis dans un de mes scripts. Je suis entrain d'écrire un script qui me permet de créer automatiquement des utilisateurs virtuels, leurs répertoires etc... dans vsftpd.
Mon problème se situe au niveau de la gestion de l'authentification. Le système consiste à insérer dans un fichier texte le nom puis le mot de passe de l'utilisateur :

user1
mdpuser1
|

Ensuite , il faut convertir ce fichier en .db l'histoire que PAM puisse le lire. Le problème est qu'il faut que le fichier texte se termine par un retour à la ligne. Je ne sais pas comment faire pour faire celà en shell. J'arrive bien à insérer le nom et mdp grâce à ECHO mais le curseur reste tout le temps à la même place :

user1
mdpuser1
|user2
mdpuser2

Voilà j'espère que j'ai été clair wink

Merçi d'avance

Dernière modification par deadstar (Le 10/06/2006, à 19:19)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#2 Le 10/06/2006, à 18:37

snapshot

Re : problème insertion dans fichier text

Salut,

et bien normallement, un simple

echo

sans aucun paramètre génère ce retour à la ligne.
Il faudrait donner la partie de ton script qui pose problème pour qu'on puisse bien voir...


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#3 Le 10/06/2006, à 19:19

deadstar

Re : problème insertion dans fichier text

le problème ne vient pas du script en lui-même mais bon voila le bout du script :

echo -e  "\nAjout de '$user' dans PAM"
rm -r $USER_PAM_LOGIN
echo  "$user" >> $USER_PAM
echo  "$mdp" >> $USER_PAM

le problème est toujours le même ...
Je voudrais grace à un commande, déplacer le curseur dans le fichier texte. Je dis ça mais ça me semble pas possible ....


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#4 Le 10/06/2006, à 20:20

snapshot

Re : problème insertion dans fichier text

C'est possible, mais pas en shell. Ce sont les fonctions fseek (et son "inverse" ftell) qui déplace la position (et non pas le "curseur") dans un fichier. Cependant, elle sont à peu près inutiles dans un fichier texte car l'insertion de caractère à une position donnée implique de décaler tous les autres caractères qui suivent.
Normallement, les fichiers textes se contruisent linéairement, sans jamais revenir en arrière.
Mais si j'ai bien compris ton problème, tu as pour le moment ceci :

user1
mdpuser1
|user2
mdpuser2

et tu voudrais obtenir ceci :

user1
mdpuser1
|
user2
mdpuser2

Mais où et qui insère le caractère pipe | ????


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#5 Le 11/06/2006, à 11:47

deadstar

Re : problème insertion dans fichier text

je viens de me rendre que j'ai oublié de préciser que le caractère | représente en fait la place du curseur dans le fichier texte. Je souhaite obtenir :

user1
mdpuser1
user2
mdpuser2
|

Dernière modification par deadstar (Le 11/06/2006, à 14:24)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#6 Le 11/06/2006, à 12:18

cep_

Re : problème insertion dans fichier text

un echo vide intercalé " "

#7 Le 11/06/2006, à 13:15

snapshot

Re : problème insertion dans fichier text

ok !!
bon alors voila, si tu fais ceci :

echo "user1" >  $FICHIER
echo "pass1" >> $FICHIER
echo "user2" >> $FICHIER
echo "pass2" >> $FICHIER

tu obtiendras ceci (les ¶ représentent les retour à la ligne \n, comme dans les traitements de texte, et ¤ la fin du fichier)

user1¶
pass1¶
user2¶
pass2¶
¤

tandis que si tu fais ceci :

echo  "user1" >  $FICHIER
echo  "pass1" >> $FICHIER
echo  "user2" >> $FICHIER
echo  "pass2" >> $FICHIER
echo >> $FICHIER

tu obtiendras ceci (les ¶ représentent les retour à la ligne \n, comme dans les traitements de texte)

user1¶
pass1¶
user2¶
pass2¶

¤

Certains programmes insitent pour avoir chaque ligne terminée par un retour chariot, y compris la dernière. Autrement dit, ils ne supportent pas d'avoir la dernière ligne d'un fichier sans retour à la ligne. Cette "mauvaise" configuration est obtenue en faisant ceci :

echo "user1" >  $FICHIER
echo "pass1" >> $FICHIER
echo "user2" >> $FICHIER
echo -n "pass2" >> $FICHIER

qui donne ceci :

user1¶
pass1¶
user2¶
pass2¤

Ce qu'il faut retenir, c'est que echo ajoute toujours un retour chariot à la fin de la chaine qu'il a sortie (y compris si elle est vide), sauf si l'option -n a été activée.
Mais le truc qui me parait bizarre, c'est que ton script me parait déjà bon. Je me demande si le bug n'est pas ailleurs. Tu es sûr que les logins et le mots de passe ne contiennent pas des caractères spéciaux qui pourraient flinguer la construction du fichier ?


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#8 Le 11/06/2006, à 14:46

deadstar

Re : problème insertion dans fichier text

Merçi snapshot de ces éclaircissements smile
Mais j'ai copié ton code et je l'ai exécuté dans un script séparé, mais j'obtiens toujours la même chose :

|user1
mdpuser1
user2
mdpuser2

ou | repésente toujours le curseur

Je ne comprends pas pourquoi ça me fait ça. Je souhaite voir le curseur à la fin mais celui çi reste à sa position initale ...


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#9 Le 11/06/2006, à 20:58

deadstar

Re : problème insertion dans fichier text

Je viens de remarquer que ça ne faisait celà que lorsque je suis en root !!!!!!!


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#10 Le 11/06/2006, à 21:15

snapshot

Re : problème insertion dans fichier text

J'ai plus l'impression que ce problème vien de l'éditeur de texte plutot que du fichier...

Tu utilises quoi comme éditeur ? Et tu as essayé avec d'autres éditeurs ? kate / gedit


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#11 Le 11/06/2006, à 22:30

deadstar

Re : problème insertion dans fichier text

j'ai essayé avec emacs et gedit : même résultat et ceçi seulement en root

Dernière modification par deadstar (Le 11/06/2006, à 22:49)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#12 Le 11/06/2006, à 22:57

snapshot

Re : problème insertion dans fichier text

Ok, j'ai compris !

Le fichier est hors de cause... pour la bonne et simple raison qu'il ne contient pas l'information pour positionner le curseur. Ce n'est que du texte brut, et c'est tout.

C'est gedit qui stocke dans le fichier /home/xxxxxx/.gnome2/gedit-metadata.xml où doit se trouver le curseur. Cela explique pourquoi le curseur se positionne ailleurs pour l'utisateur root (il n'a pas le même fichier .xml) et pourquoi toutes les tentatives d'insérer ou non des retour chariots ne font rien (elles n'agissent pas sur le bon fichier !).

Mon fichier gedit-metadata.xml ressemble à celui-ci :

<?xml version="1.0"?>
<metadata>
  <document uri="file:///etc/X11/xorg.conf" atime="1150058803">
    <entry key="position" value="3775"/>
  </document>
</metadata>

Dans le fichier /etc/X11/xorg.conf, le curseur est donc positionné 3775ème caractère. J'ai vérifié en ré-ouvrant et en déplaçant le curseur avant de quitter : le nombre varie bien en conséquence.

Donc, sauf à écrire un programme modifiant ce fichier, il n'y a pas de moyen de gérer l'emplacement du curseur avec gedit...


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#13 Le 12/06/2006, à 01:20

deadstar

Re : problème insertion dans fichier text

Et ben tu parles d'une affaire big_smile

J'ai regardé et en effet, ton explication est bonne ( je n'en doutais pas tu me diras wink )
Je vois comment faire pour déplacer ce curseur en fonction du nombre de caractère du nom et du mot de passe, mais je ne vois pas comment le forcer à retourner à la ligne car lorsque que l'on modifie la valeur :

<entry key="position" value="xxx"/>

on peut modifier la position du curseur mais le nombre de caractère est le même que l'on mette un espace en bout de ligne ou que l'on saute une ligne ....

Je pense donc résoudre le problème en demandant à l'utilisateur, lors de l'exécution du script, de modifier manuellement le fichier incriminé en conséquence car je ne vois pas trop comment je pourrais faire autrement.

En tout cas merçi beaucoup de ton aide.

Dernière modification par deadstar (Le 12/06/2006, à 01:21)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#14 Le 12/06/2006, à 13:24

snapshot

Re : problème insertion dans fichier text

ouff... là, ça devient usine à gaz.... dans ces cas là, la solution passe souvent par une remise à plat du problème.
Si j'ai bien compris, gedit se lance pour que l'on puisse modifier des valeurs ? mais pourquoi ne pas mettre directement les bonnes valeur dans le fichier, dès sa construction ?

echo -n "Nom de l'utilisateur: "
read nom
echo -n "Password: "
read pass
echo $nom >> $FICHIER
echo $pass >> $FICHIER

Comme ça, le fichier se construit tout seul !


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#15 Le 12/06/2006, à 19:20

deadstar

Re : problème insertion dans fichier text

c'est ce que je fait


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#16 Le 12/06/2006, à 19:58

Cathou

Re : problème insertion dans fichier text

Et si le problème était ailleurs?

Si on prend comme référence l'exemple qui se trouve ici, il faut d'abord créer un fichier logins.txt puis le passer dans une moulinette pour le faire rentrer dans une base (ce que tu appelles PAM):

db_load -T -t hash -f logins.txt /etc/vsftpd_login.db

Qu'est-ce que tu cherches à faire dans ton script?

- Si c'est une mise à jour de la base avec un nouveau couple login/passwd, alors peut-être qu'il existe une commande du genre db_append..

- Si c'est la construction complète de logins.txt puis passage à la moulinette comme dans l'exemple, alors dis-nous voir à quel endroit ça coince.. parce que le script de construction de logins.txt en lui-même est trivial roll

Remarque: le contenu du fichier logins.txt de l'exemple est une simple alternance login,passwd,login,passwd sans besoin d'un retour chariot supplémentaire à la fin, contrairement à ce que tu disais dans ton premier post.

#17 Le 12/06/2006, à 23:00

deadstar

Re : problème insertion dans fichier text

Ce script permet d'ajouter des utilisateurs sur mon serveur ftp avec ou pas un répertoire perso, droit d'upload ou pas. Je modifie tout d'abord login.txt et le convertit ensuite en vsftpd_login.db.

Voilà la partie incriminée :

echo -e  "\nAjout de '$user' dans PAM :"
if ! grep -q "^$user" login.txt 2>/dev/null; then
	rm -r vsftpd_login.db          [edit]
	echo "$user" >> login.txt
	echo "$mdp" >> login.txt
	db3_load -T -t hash -f login.txt vsftpd_login.db
	echo "'$user'a bien été ajouté dans PAM"
else
	echo "[ERREUR] : '$user' est déjà identifié dans 'login.txt'."
fi

Voilà sinon, pour que PAM puisse identifier l'utilisateur, il faut absolument que le fichier login.txt, avant d'être transformé en vsftpd_login.db, se termine par un retour chariot. Sinon ça ne marche pas ...

Pour l'idée de db_append, je vais chercher

Merçi

Dernière modification par deadstar (Le 13/06/2006, à 00:18)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#18 Le 12/06/2006, à 23:48

snapshot

Re : problème insertion dans fichier text

J'ai eu le même genre de problème avec exim ou je ne sais plus quel serveur : il fallait absolument une tab entre le champ et la valeur pour construire le .db .  Et une tab, ça ne distingue pas d'un espace dans les docs ! deux jours de perdu... grrr!!

Si j'ai bien compris, le fait d'ajouter ce CR supplémentaire t'empèche par la suite d'ajouter d'autres utilisateurs, car ils seront alors séparés par une ligne vide, ce qui trompera db3_load ?

Dans ce cas, je propose de passer par un fichier temporaire : d'un coté, on a le fichier des utilisateurs/mot de passe tout propre, et de l'autre, on fabrique un fichier temporaire avec son CR supplémentaire, juste pour faire plaisir à db3_load...
ça donne ceci :

echo -e  "\nAjout de '$user' dans PAM :"
if ! grep -q "^$user" login.txt 2>/dev/null; then
    rm -r vsftpd_login.txt
    echo "$user" >> login.txt
    echo "$mdp" >> login.txt

    tmp=$(tempfile)  # on demande au système de nous créer un fic. tempo.
    cp login.txt $tmp # on y copie le fichier des utilisateurs dedans
    echo >> $tmp  # et on lui ajoute ce retour chariot obligatoire

    # ensuite, on construit le hash à partir du tempo
    db3_load -T -t hash -f $tmp vsftpd_login.db

    # il ne reste plus qu'à effacer le tempo devenu inutile
    rm $tmp

    # le reste ne change pas

    echo "'$user'a bien été ajouté dans PAM"
else
    echo "[ERREUR] : '$user' est déjà identifié dans 'login.txt'."
fi

Mais il n'y a pas une erreur dans le script ? Il y a un "rm -r vsftpd_login.txt" alors qu'on construit un "vsftpd_login.db" ?


Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !

Hors ligne

#19 Le 13/06/2006, à 00:21

deadstar

Re : problème insertion dans fichier text

Ok merci je testerais ça demain et je te tiens au courant.

Sinon, oui il y a bien une erreur de recopiage, c'est bien vsftpd_login.db (et oui il y en a qui ne connaisse le copier-coller ou qui y pense après ...  la fatigue tongue) : c'est edit

Dernière modification par deadstar (Le 13/06/2006, à 00:22)


" En informatique, tout est possible ... mais... ce n'est pas toujours évident ! "

Hors ligne

#20 Le 13/06/2006, à 08:17

Cathou

Re : problème insertion dans fichier text

Bon j'ai fait mumuse avec les db3-utils et c'est bien ce que je pensais..

Il semble que tu fasses une confusion entre position de curseur et retour chariot (ce terme est d'ailleurs un abus de langage: dans les fichiers texte sous linux on a que des 'caractère de fin de ligne').

Au sujet de ce fameux caractère \n (ou LF, ou 0x0a, comme tu veux), dans le post 7 snapshot t'a parfaitement décrit les 3 configurations possibles à la fin de ton fichier login.txt: soit manquant, soit un seul, soit un en plus.

Il en faut exactement un seul. Dans les deux autres cas, effectivement tu te retrouves avec un vsftpd_login.db foireux.

Au passage, le fichier logins.txt de mon lien est bien dans ce format:

user1\n
pass1\n
user2\n
pass2\n

Je sais pas pourquoi t'as imaginé qu'il faut un \n supplémentaire, peut-être parce que dans gedit quand tu tapes enter après le dernier password le curseur va à la ligne suivante?

Dis-toi bien un truc en ce qui concerne la position du curseur: la moulinette elle sait pas ce que c'est un curseur, cette info est pas dans le login.txt. La moulinette voit un fichier texte et basta.

Si t'es pas convaincu, pour faire tes tests t'as qu'à oublier complètement gedit et fabriquer ton login.txt à la mimine avec des echo et regarder à chaque fois l'impact que ça a sur vsftpd_login.db. Tu verras que des 3 possibilités de snapshot, la seule qui marche c'est la première.

Donc ton script du post 17 est pas loin d'être ok smile

Quelques remarques sur l'utilisation des db3-utils:

- En examinant le fichier db avec un viewer hexa, on s'aperçoit que les users et les mots de passe sont en clair. Donc ton fichier db doit appartenir à root, ce qui doit être déja fait, et surtout t'as intérêt à faire un chmod 600 dessus.

- Tu peux examiner le contenu de ta base en faisant:

db3_dump -p vsftpd_login.db

- T'as intérêt à n'autoriser que de l'ascii pur pour les noms de users et les mots de passe. Essaye de rentrer léon comme user et regarde ta base ensuite, tu verras c'est rigolo. Peut-être même n'autoriser que l'alphanumérique. Enfin bref, tu dois faire un filtrage en amont et il doit être béton.

- Quand tu rentres un user qui existe déja dans la base, avec un nouveau password, alors db3_load supprime automatiquement le doublon. Essaye tu verras. Suivant ce que tu veux faire, ça peut te simplifier la vie. Mais bon ça c'est à toi de décider comment tu veux gérer les doublons..
(Au fait dans ton script tu fais un grep de user sur toutes les lignes de login.txt alors qu'il ne faudrait le faire qu'aux lignes impaires)

- Il semble que db3_load écrase le fichier vsftpd_login.db s'il existe: tu devrais pouvoir te passer du rm.

Dernière modification par Cathou (Le 13/06/2006, à 08:29)