IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Changer hostname par code [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    JYH
    JYH est déconnecté
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Par défaut Changer hostname par code
    Bonjour,

    j'essaye depuis un moment déjà à changer le hostname d'un Raspberry avec un interface graphique qui a d'autres fonctions.

    d'ici : https://pricklytech.wordpress.com/20...-command-line/
    je sais le commande que je souhaite passer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #change hostname in /etc/hosts & /etc/hostname
    sudo sed -i "s/$oldhostn/$newhost/g" /etc/hosts
    sudo sed -i "s/$oldhostn/$newhost/g" /etc/hostname
    à la main dans une console ça marche nickel, après on reboot et c'est plié

    j'ai lu et relu http://wiki.lazarus.freepascal.org/E...ing_under_root
    mais je n'arrive pas à faire fonctionner mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TForm1.PI2iniClick(Sender: TObject);
    Var
      FileIni : TIniFile;
      lig:string;
      Proc: TProcess;
      PW: String;
    begin
     FileIni:=TIniFile.Create('/home/pi/Raspi.ini'); // Ouvre ou crée le fichier
     Try
      // Sauvegarde SN et Hostname dans fichier ini
       FileIni.WriteString('Raspi', 's/n', lab_snpi.Caption);
       FileIni.WriteString('Raspi', 'hostname', ed_hostname.Text);
       // la il faudra mettre Ã* jour les fichiers linux
       Proc := TProcess.Create(nil);
       Proc.CommandLine := 'sudo -S /bin/sed -i "s/'+hoststring+'/'+ed_hostname.Text+'/g" /etc/hosts'; // -S causes sudo to read the password from stdin.
       proc.Options := [poWaitOnExit, poUsePipes];
       Proc.Execute; //start it. sudo will now probably ask for a password
     
       // write the password to stdin of the sudo program:
       PW := 'PWRootpi' + LineEnding;
       Proc.Input.Write(PW[1], Length(PW));
     
     
     finally
       FileIni.Free;
       Proc.Free;
     end;
    note : hoststring est un variable string globale initialisée au lancement de l'appli qui garde le hostname


    je dois louper un truc surement

    Si quelqu'un a une idée merci de son aide

    Zeg

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Bonjour,

    As-tu un message d'erreur ?

    Cette ligne là m'interpelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Proc.Input.Write(PW[1], Length(PW));
    Pourquoi ne pas passer tout le buffer, en l'ayant converti en array of char ? (Je n'ai pas testé...)

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut,

    2 choses :
    Citation Envoyé par JYH Voir le message
    mais je n'arrive pas à faire fonctionner mon code :
    ce qui précède n'est pas un message d'erreur valide et


    cependant, au vu de ce qui suit,
    Citation Envoyé par JYH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Proc := TProcess.Create(nil);
       Proc.CommandLine := 'sudo -S /bin/sed -i "s/'+hoststring+'/'+ed_hostname.Text+'/g" /etc/hosts'; // -S causes sudo to read the password from stdin.
       proc.Options := [poWaitOnExit, poUsePipes];
       Proc.Execute; //start it. sudo will now probably ask for a password
    il me semble que CommandLine est obsolete et périmé.

    Perso j'utilise Parameters.Add('option_à_passer') autant de fois qu'il faut, exemple avec la commande ping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      with aProcess do
      begin
        Executable := 'ping';
        Parameters.Add('-c3');
        Parameters.Add('localhost');
        Execute; // non bloquant, danger si boucle ! ou voir avec les options
      end;

  4. #4
    JYH
    JYH est déconnecté
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Par défaut
    Merci déjà pour ces réponses rapides

    j'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TForm1.PI2iniClick(Sender: TObject);
    Var
      FileIni : TIniFile;
      Proc: TProcess;
      Proc1: TProcess;
    begin
     FileIni:=TIniFile.Create('/home/pi/Raspi.ini'); // Ouvre ou crée le fichier
     Try
      // Sauvegarde SN et Hostname
       FileIni.WriteString('Raspi', 's/n', lab_snpi.Caption);
       FileIni.WriteString('Raspi', 'hostname', ed_hostname.Text);
       // la il faudra mettre Ã* jour les fichiers linux
       Proc := TProcess.Create(nil);
       Proc.Executable:='/bin/sed'; // sur linux il faut mettre le chemin complet 
       Proc.Parameters.Add('-i');
       Proc.Parameters.Add('"s/'+hoststring+'/'+ed_hostname.Text+'/g"');
       Proc.Parameters.Add('/etc/hosts');
       Proc.Execute;
       Proc1 := TProcess.Create(nil);
       Proc1.Executable:='/bin/sed';
       Proc1.Parameters.Add('-i');
       Proc1.Parameters.Add('"s/'+hoststring+'/'+ed_hostname.Text+'/g"');
       Proc1.Parameters.Add('/etc/hostname');
       Proc1.Execute;
     finally
       FileIni.Free;
       Proc.Free;
       Proc1.Free;
     end;
     
    end;
    il n'y a aucun message d'erreur mais pas de modification dans les fichiers "host" et "hostname" non plus
    ça ne me surprend pas sans l'élévation de droit "sudo" en console la commande sed retourne = sed: impossible d'ouvrir le fichier temporaire /etc/sed5WmRkW: Permission non accordée...

    j'ai aussi tenté d'ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Proc.Parameters.Add('sudo');
    sans plus de succès

    @+

    pour info je suis avec une Rasbian avec un Raspberry (ça peut être une précision importante ?)
    je cherche à faire une interface plus conviviale pour des clients freeRdp plutôt que de se faire à la main les fichiers de configurations.

    Zeg

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    2 nouvelles choses :

    Citation Envoyé par JYH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Proc.Parameters.Add('"s/'+hoststring+'/'+ed_hostname.Text+'/g"');
    Pour ce genre de plan, perso je tenterais (me souviens pas si j'ai déjà testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string1 := 's/' + hoststring + '/' + ed_hostname.Text + '/g';
    Proc.Parameters.Add(string1);
    et pareil pour les autres string.
    Des fois que...

    Maintenant, quand je vois ça :
    Citation Envoyé par JYH Voir le message
    il n'y a aucun message d'erreur mais pas de modification dans les fichiers "host" et "hostname" non plus
    ça ne me surprend pas sans l'élévation de droit "sudo" en console la commande sed retourne = sed: impossible d'ouvrir le fichier temporaire /etc/sed5WmRkW: Permission non accordée...
    je me demande pourquoi ne pas utiliser une bête StringList pour y charger le fichier à modifier et y faire les modifs à la mano (enfin, en code) ?
    Splitter les lignes de hostname dans une autre StringList, y changer ce qu'il faut puis récrire.


    Citation Envoyé par JYH Voir le message
    pour info je suis avec une Rasbian avec un Raspberry (ça peut être une précision importante ?)
    Je ne vois pas pourquoi : du Debian, même forké vers une machine lilliputienne, ça reste du Debian

  6. #6
    JYH
    JYH est déconnecté
    Membre averti
    Inscrit en
    Décembre 2005
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 24
    Par défaut
    J'ai aussi essayé de charger le fichier faire les modifs dans les lignes mais toujours le problème de droits pour l'enregistrement...

    testé également sans plus de résultat ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       parastr:='s/'+hoststring+'/'+ed_hostname.Text+'/g';
       Proc.Parameters.Add(parastr);


    @+
    Zeg

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par JYH Voir le message
    J'ai aussi essayé de charger le fichier faire les modifs dans les lignes mais toujours le problème de droits pour l'enregistrement...
    Chercher du côté de "su", alors ?

    Mais à partir de ce point je ne vais pas pouvoir aider plus, ces histoires de droits me gonflant au plus haut point (même si je les comprends parfaitement), sur ma machine perso je fais tout en root et basta !
    Oui je sais c'est mal, mais au moins je ne suis pas ennuyé avec ces prises de tête.
    Et du coup je n'ai jamais testé l'élévation de privilèges, désolé.

    Mais je propose de la lecture, trouvée en tapant "freepascal linux su tprocess"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment changer l'image inseré dans mon crystal reports par code?
    Par rochdi123 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/06/2009, 13h52
  2. Tabcontrol : changer d'onglet par code
    Par jacquesprogram dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 04/04/2009, 14h41
  3. changer l'heure système par code vba
    Par soussie dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/11/2008, 15h18
  4. Changer par code le content du refresh
    Par dadpub dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 06/07/2007, 16h23
  5. [NotifyIcon]Comment changer l'icone par code ?
    Par exclusif dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2007, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo