Forum Programmation.shell Remplacer des lignes dans un fichier

Posté par  .
Étiquettes : aucune
0
11
avr.
2005
Bonjour,

j'ai mis en place un environnement chrooté pour mon serveur ssh pour certains utilisateurs.

Ces utilisateurs veulent pouvoir changer leur mot de passe.
Donc je leur ai donné la commande passwd, et une copie de /etc/shadow (avec uniquement leurs passwords dedans) se trouve dans l'environnement chrooté.

Maintenant, quand ils changent leur password, seul le fichier shadow dans l'env est impacté.
Et donc a leur prochaine connection, le mot de passe qui leur est demandé est toujours l'ancien (du fichier shadow contenu dans /etc).

Pour "impacter" le changement, j'aimerai faire un crontab qui remplacerai dans le fichier /etc/shadow, les lignes correspondantes à une liste d'utilisateur (ceux qui sont chrootés uniquement) par celles correspondantes du fichier env-chrooté/etc/shadow

Et là, j'avoue que je sèche grandement.
J'ai regardé la commande
grep env-chrooté/etc/shadow -e "^$USERNAME"
Mais je n'arrive pas a comprendre comment remplacé la ligne correspondante dans le "bon" fichier...

je suis parti sur une base comme ceci:

#!/bin/bash

# Les utilisateurs dont modifier les passwords
USERNAME="user1 user2 user3"

for user in $USERNAME; do

# La le remplacement des lignes ???
grep env-chrooté/etc/shadow -e "^$USERNAME" >> /etc/shadow

done

merci beaucoup d'avance
  • # Quelques idées, comme ça, en passant....

    Posté par  . Évalué à 5.

    Tu dis que dans l'environnement chrooté, il n'y a qu'une ligne dans le /etc/shadow : celle de l'utilisateur concerné, bien. Pourquoi ne pas faire un cron qui concatène :
    • Le début de ton fichier /etc/shadow qui contient ce qui est indispensable au système
    • L'ensemble des fichiers /etc/shadow chrootés ?
    Comme ça, pas besoin de faire des grep et autres. Si vraiment il y a des informations redondantes dans ces /etc/shadow chrootés, évidement, grep semble être une bonne idée pour ne récupérer que la partie pertinente de ces fichiers. Sinon, plutôt que de faire un cron, tu ne peux pas regarder du côté de FAME (?), pas sûr du nom, qui est sensé surveiller les activités sur le système de fichier, et ne déclencher tes concaténations que si l'un au moins des /etc/shadow chrootés a été modifié ? Autre solution : centraliser tout ça dans un annuaire ldap. Je ne sais pas du tout comment ça se met en oeuvre, ni si ça apportera quelque chose à ta configuration. Question subsidiaire (pour ma curiosité personnelle) : je ne vois vraiment pas à quoi ça peut servir ? Un lien hard vers /etc/shadow ne suffirait-il pas ? D'autant plus que ce fichier ne doit être lisible par personne d'autre que root....
    • [^] # Re: Quelques idées, comme ça, en passant....

      Posté par  . Évalué à 1.

      Bonjour,

      désolé de ne pas avoir répondu plus tot.

      L'environnement est chrooté, mais pour un ensemble d'utilisateurs qui doivent acceder aux mêmes fichiers.

      Donc un seul fichier shadow pour eux tous (et plusieurs lignes dedans).
      Dans ce fichier, la ligne du root+une ligne par user.

      Dans le shadow "original", les users chrootés sont à la fin, le root en 1ere ligne.

      L'idée de concatener est simple, mais si je rajoute des users, il faut que je pense à les "remonter" dans le fichier shadow si je veux pas concatener n'importe comment après.
      D'où ma preference vers le remplacement des lignes...

      FAME... j'ai pas trouvé... Les recherches sur la concatenation me donne juste les > et >> ???

      L'annuaire ldap... je connais pas du tout, et j'avoue que je pense pas que ca soit la meilleure solution pour moi.

      Et pour repondre à la question subsidiaire, le lien hard est impossible car les partitions sont differentes... too bad :'(

      P.
      • [^] # Re: Quelques idées, comme ça, en passant....

        Posté par  . Évalué à 2.

        Ben....
        Pour commencer, tu as les utilitaires "classiques" pour régler tes problèmes de lignes en double exemplaires. En combinant sort et uniq, tu peux arriver à tes fins.
        Jettes un oeil aux pages de man, mais il me semble que ce n'est pas trop compliqué....
        Allez, juste parce que tu m'as remercié pour mon intervention (ce qui est quand même un peu rare ici !), quelques indices :
        Pour sort, les options utiles sont les suivantes (dans ton cas) :
        -k (ou --key) pour préciser que quel champ trier
        -t (ou --field-separator) pour indiquer le séparateur de champ.
        L'idée, c'est que comme les utilisateurs sont triés d'origine par uid, il faut faire de même lors de la concaténation.
        De plus, la description de sort indique : "Write sorted concatenation of all FILE(s) to standard output", donc en clair, cette commande devrait suffire (à adapter à ta configuration quand même) :
        sort -k 1 -t : /home/userchrooté1/etc/shadow /home/userchrooté2/etc/shadow ... | uniq > /etc/shadow
        Attention
        Ne tapes surtout pas cette commande sans avoir fait des tests avant.
        Je ne suis pas certain que l'ordre des utilisateurs dans le fichier shadow soit important, mais bon.... Il y aura sûrement quelqu'un qui lira ces lignes et qui confirmera/informera mes dires....
        Voilà, en epérant que ça aidrea, comme on dit.
        P.S. : désolé pour cette réponse tardive, mais les vacances n'aident pas à rester informé !
  • # foo

    Posté par  (site web personnel) . Évalué à 5.

    Bon j'ai peut-être été un poil trop loin mais le programme suivant devrait faire ton affaire. D'autre part, je te suggèrerais de faire cela sur le logout de tes users plutôt qu'en cron : moins bourrin et plus propre.

    -=-=---=-=---=-=---=-=---=-=---=-=---=-=---=-=--
    #!/usr/bin/perl

    sub get_new_line {
        my ($user) = @_;
        open F, '/tmp/foo2';
        while () {
            if (/^\Q$user:/) {
                return $_;
            }
        }
        return undef;
    }

    sub subst_new_line {
        my ($user, $new_line) = @_;
        my $file = '/tmp/foo1';
        if (-s $file) {
            local @ARGV = $file;
            local $^I = '';
            local $_;
            while (<>) {
                if (/^\Q$user:/) {
                    $_ = $new_line;
                }
                print;
            }
        }
    }

    my $new_line = get_new_line('bar');
    if (defined($new_line)) {
        subst_new_line('bar', $new_line);
    }
    -=-=---=-=---=-=---=-=---=-=---=-=---=-=---=-=--
    • [^] # Re: foo

      Posté par  . Évalué à 1.

      Merci beaucoup.

      Par contre, je ne connais pas du tout le perl. J'ai essayé de comprendre comment fonctionne ce script et de l'utiliser... mais je dois etre trop novice... rien réussi (ni comprendre exactement le prog, ni le faire tourner)
      Le prog rentre dans une boucle sans fin (le while() je pense) et n'exit pas...

      Le perl, je pense que ca attendra encore quelques années pour moi.

      Merci néanmoins pour la peine que vous vous êtes donné pour moi
  • # \_o<

    Posté par  (site web personnel) . Évalué à 0.

    Je ne veux pas t aider a resoudre ce probleme, car tu semble avoir oublie un probleme important: si deux utilisateurs se deloguent en meme tems, ton 'truc' subira un conflit: si deux scripts se lancent en meme temps, seul celui se finissant en dernier modifira shadow.

    Le plus simple est donc d utiliser un diff ... mais quoi que tu fasse, il faut IMPERATIVEMENT locker shadow !!!

    Une methode plus simple consiste apparement a creer un lien hard entre le vrai shadow, et celui dans le chroot, ( si tu as pense a un symbolique, t as rien compris), mais meme avec un hard, tu aura le meme probleme de lock.

    En bref, tu n a plus qu a re ecrire un demon propre.

    Et surtout .. n oublies jamais: Murphy existe, mais il se cache quand tout va bien.
    • [^] # Re: \_o<

      Posté par  . Évalué à 1.

      C'est pour eviter le probleme de conflit que je prefere le cron. Un seul script s'execute la nuit, quand je ne suis pas censé avoir d'user de connectés de toute facon...

      Je ne connaissais pas la commande diff, je vais regarder comment elle marche, merci... et regarder aussi comment tu locke un fichier...

      Le lien hard n'est pas possible car j'utilise 2 partitions.

      heu, pour le daemon... un poil au dessus de mes capacités, là :')

      Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.