Page 1 sur 1

php / sed/ mysql

Posté : 08 sept. 2013, 09:51
par villeurdav
Bonjour,

débutant je me lance ,
je fais la migration de sites car on change de panel, et

je dois dans mon /etc/shadow/ changer le mot de passe temporaire des users recupérés. par leur vrai mot de passe que je vais recuperer dans une bdd

Aller récupérer le mot de passe dans la base ,pas de souci , je maitrise,

mon souci c'est la ou j'ai le symdrome de la page blanche, c'est comment remplacer le mot de passe pour chaque user dans mon /etc/shadow/

*dans ma base :

user1 passwd1

user2 passwd2

*dans /etc/shadow

user1:passwdcrypté:0:99999:7:::

etc...
et donc je veux faire un script qui pour chaque user de /etc/shadow on va remplacer le mot de passe crypté correspondant entre les ":"
et la etant débutant je comprends rien , je ne sais pas comment m'y prendre ... sed .? genre sed -i s/'passwd de shadow'/'$passwdbdd'/g etc/shadow remplacer des string ...? addashes()?

si un dieu de php peut me donner une voie à suivre je suis preneur .
merci pour votre aide
David :)

Re: php / sed/ mysql

Posté : 08 sept. 2013, 11:07
par moogli
Salut,

Il est généralement préférable d'utiliser la commande système pour ne rien louper :) (utilise par exemple la fonction exec, couplé avec un sudo car il y a peu de chance que l'utilisateur Apache ai les droits système :) )

Si tu es sur des modif a faire sur le fichier tu peux :

- donner les droits en lecture / écriture sur le fichier pour l'utilisateur qui fait tourner le serveur web (ou php si ce n'est pas le même )
- récupérer le contenu du fichier avec la fonction file (c'est utilisateur par ligne ?)
- traiter le fichier comme un fichier csv
- boucler sur le tableau et faire une requête sgbd pour chaque utilisateur (pense aux requêtes préparées)
- modifier le mot de passe dans le tableau
- remettre le tableau dans le fichier (implode, file_put_contents)


@+

Re: php / sed/ mysql

Posté : 08 sept. 2013, 13:15
par villeurdav
merci Moogli pour ces pistes,
en fait , j'avais oublié de préciser
c'est mes anciens users que je j'ai déjà récupéré sur mon noveau panel et dans le nouveau systeme , ils ont un passwd temporaire, ( dans mon script d'avant j'ai fais comme ca ct plus facile)
donc ils sont deja dans mon systeme, et en fait je veux faire un script qui automatise le changement de mot de passe dans mon /etc/shadow
et zou je balance mon script php et hop il va recuperer les passwd dans la bdd et les mettre dans /etc/passwd pour chaque user

merci :)
David

Re: php / sed/ mysql

Posté : 08 sept. 2013, 15:27
par moogli
tu as deux solutions.

La première n'est pas utilisable tu n'as pas les mots de passe en clair.

Je te conseil sauvegarder ce fichier avant modification ;)


@+

Re: php / sed/ mysql

Posté : 08 sept. 2013, 17:12
par villeurdav
ho oui , j'ai pas envie de jouer avec le feu, lol , prudence est mère de sûreté :P

mais j'ai de la chance les mots de passe que je recupere sont crypté de la meme forme que ceux que je retrouve dans mon /etc/shadow, donc ca doit marcher , j'ai fais un essai pour un et ca marche...

Re: php / sed/ mysql

Posté : 08 sept. 2013, 17:56
par moogli
ok, donc je te conseil la seconde solution.

essai avec un fichier bateau et quelque ligne voir ce que ça donne et s'il y a des choses que tu ne comprend pas ou ne vois pas comment faire tu sais comment faire ;)


@+

Re: php / sed/ mysql

Posté : 08 sept. 2013, 22:15
par villeurdav
je te tiens au courant merci :)

Re: php / sed/ mysql

Posté : 12 sept. 2013, 14:40
par villeurdav
PROBLEME RESOLU !!!!!

Comment remplacer les mots de passes cryptés de mes users dans /etc/shadow par ceux de ma base de données.
voila comment je m'y suis pri :

//
connexion à la base de données pour récupérer les users et passwd
$connect_ispcp=mysql_connect("serveur,xxxx,xxxxxx");
mysql_select_db("ispcp",$connect_ispcp);
$query = "SELECT mes colonnes de ma table . ";
$result = mysql_query($query,$connect_ispcp);


// pour chaque username
while ($data = mysql_fetch_object($result))

{
// traitement sur le username pour echaper la majorite des caracteres voir preg_quote()(
$data->username= preg_quote($data->username, '/');
// on echape les @ car mes users sont sous la forme webmaster@.....
$user= str_replace("@","\@","$data->username");
// et on desechappe les - pour l'adresse de mon domaine bibi-titi.fr
$user= str_replace("\-","-","$user");

$data->passwd= preg_quote($data->passwd, '/');
// on desechape les . qui n'aurait pas du l'etre dans le mot de passe.
$passwd= str_replace("\.",".","$data->passwd");

//traitement sed qui va remplacer l'ancien passwd par le nouveau

// '.$user.\:[^:]*\:' veut dire : toute chaine commencant par la variable user : suivi de n'importe quel caractere sauf : suivi de :

echo "\n".$command = "/bin/sed -i s/'".$user."\:[^:]*\:'/'".$user."\:".$passwd."\:'/g /cheminduscript/shadow";
exec($command);

}


et voila.
j'espere que ca sera utile pour d'autre.

David.