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

  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 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    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"

  8. #8
    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 pour le lien je l'avais déjà vu mais bon

    ggrrrmmlll j'ai l'impression que j'ai toutes les briques du "lego" mais pas le plan du truc ni une photo une fois fini!!

    je vais patienter et continuer à tester

    @+

    Zeg

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut
    Salut,

    Peut-être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Proc := TProcess.Create(nil);
    Proc.Executable:='/bin/bash';
    Proc.Executable.Add('-c');
    Proc.Executable.Add('sudo sed -i "s/$oldhostn/$newhost/g" /etc/hosts'); 
    Proc.Execute;
    Si ca marche pas, essayer en séparant tous les paramètres avec .add()

    @+

  10. #10
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 244
    Par défaut
    hello,
    sinon un code plus générique qui utilise cmd.exe pour windows et bash pour linux

    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
    function execCmd(cmd: string; wait : boolean) : integer;
    // J.P 2013
    var AProcess : TProcess;
    var exitcode : integer;
    begin
    result := -1;
    AProcess := TProcess.Create(nil);
    try
    {$IFDEF WIN32}
    AProcess.Executable := 'cmd.exe' ;
    AProcess.Parameters.DelimitedText :=  '/c "' + cmd + '"';
    {$ENDIF}
    {$IFDEF LINUX}
    AProcess.Executable := 'bash' ;
    AProcess.Parameters.DelimitedText :=  '-c "' + cmd + '"';
    {$ENDIF}
    if wait then AProcess.Options := AProcess.Options + [poWaitOnExit]; //  wait for the end of the process
    AProcess.ShowWindow := swoHide;
    AProcess.Execute;
    Except
    on E: Exception do
          ShowMessage('Error with cmd  : ' + E.message);  //Show Exception
    end;
    result := AProcess.ExitStatus;
    Aprocess.Free;
    end;
    exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var exitcode : integer;
    begin
    {$IFDEF WIN32}
    execCmd('notepad.exe',false);
    exitcode :=  execCmd('sort<f:\testsort.txt >f:\resultu.txt',true);
    {$ENDIF}
    {$IFDEF LINUX}
    exitcode :=  execCmd('sort</home/user/testsort.txt >/home/user/result.txt',true);
    {$ENDIF}
    if (exitcode <> 0 ) then ShowMessage('Error exit code = ' + inttostr(exitcode));
    end;
    Ami calmant, J.P

  11. #11
    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 pour vos idées

    @Mukatai
    j'ai essayé ton code mais "Proc.Executable.Add" ne passe pas je peux "Proc.Parameters.Add" mais ça ne fait rien sans message d'erreur...


    @jurassic pork (waoo!! ZX81 : c'était ya longtemps quelques nuits blanches ce truc)
    ton code a l'avantage d'être plus parlant j'ai un message d'erreur
    pour vérification je colle dans un memo ce que j'envoie execCmd(cmd: string... et j'ai la bonne commande de la console : sudo sed -i "s/ASRpi-000/ASRpi-00A/g" /etc/hosts
    mais (qui a dit sinon c'est pas drôle ?) j'ai "Error exit code = 4" et la commande n'a pas d’effet sur le fichier.

    bon je ne lâche pas l'affaire je vais voir si je trouve c'est quoi ce code 4

    le truc qui me déroute un peu ici : http://wiki.lazarus.freepascal.org/E...ing_under_root
    le gars dans ses exemples donne le password dans le code pour exécuter avec des privilèges "Using fdisk with sudo on Linux" et ici personne ne semble s'en occuper ?

    bon je retourne creuser (vais finir en Chine)

    @+

  12. #12
    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 trouvé (grâce à vous)

    la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AProcess.Parameters.DelimitedText :=  '-c "' + cmd + "';
    m'a fait comprendre qu'il fallait sur-coté mon paramètre sudo sed -i "s/ASRpi-000/ASRpi-00A/g" /etc/hosts
    avec sudo sed -i ""s/ASRpi-000/ASRpi-00A/g"" /etc/hosts

    et la nickel

    MERCI Beaucoup

    Zeg

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Io !
    Citation Envoyé par JYH Voir le message
    le truc qui me déroute un peu ici : http://wiki.lazarus.freepascal.org/E...ing_under_root
    le gars dans ses exemples donne le password dans le code pour exécuter avec des privilèges "Using fdisk with sudo on Linux" et ici personne ne semble s'en occuper ?
    C'est parce qu'on sait lire l'anglais, nous (nan, j'déconn' )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudoPassword := 'MyPassword';     // I know this is bad practise but it's just to get things working for now
    Le question que je me pose, moi, c'est "d'où sort ce fichier temporaire qu'on retrouve dans ton message d'erreur ?" (
    commande sed retourne = sed: impossible d'ouvrir le fichier temporaire /etc/sed5WmRkW: Permission non accordée...
    )
    Comme si le boulot était à moitié fait...


    Une idée comme une autre : recopier ailleurs les fichiers à modifier, histoire qu'un user lambda puisse les modifier, et une fois cela fait, passer en root pour les mettre dans /etc en écrasant ceux qui y sont ?

    Et les 3 derniers posts de la page 2 de mon lien d'hier ne te conviennent pas ?

    Mais quelque part on tourne en rond autour de la problématique "mettre le password root dans le code (ou un fichier ini, car lorsqu'il change, s'il faut recompiler l'exe c'est lourd), ou le demander à l'utilisateur".
    Le mettre dans un ini ça permettrait 1- de ne pas appeler la ligne RootPassword= mais plutôt un autre nom anodin genre Path4Network=
    2- de le chiffrer un poil (a devient z, b devient y, etc., ou n'importe quelle autre fonction de chiffrement).

    C'étaient les idées du petit matin.

    Citation Envoyé par JYH Voir le message
    bon je retourne creuser (vais finir en Chine)
    P'têt' pas le meilleur endroit pour passer des vacances, surtout si on trifouille du code à coups de "sudo" et autres passwords dans le texte,

    EDIT :
    Citation Envoyé par JYH Voir le message
    J'ai trouvé (grâce à vous)
    Bon ben c'était pas la peine que je me décarcasse sur cette réponse, alors

    Bien joué,

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 12
    Par défaut
    Salut,

    Oui c'était bien Proc.Parameters.Add() qu'il fallait utiliser. (mauvais copier/coller)

    Si tu as besoin d'être en root pour cette commande et que tu doit taper un password quand tu utilise sudo le problème doit venir de la. Apres comment faire !? Aucune idée car mes programmes sont toujours exécutés avec l'utilisateur root...

    Sinon pour changer le hostname tu as d'autre solution comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo MonNom > /etc/hostname
    ou carrément enregistrer une stringlist dans /etc/hostname...

    Dans les deux cas il faudra se passer de la commande sed et faire l'équivalent en lazarus.

    @+

+ 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