Systemuhr über PHP stellen

  • schlosser: Ich weiß nicht genau wie die Uhr reagiert, probier es doch einfach mal aus. Ich vermute das ist kein großes Problem.
    @spacecap: Natürlich geht das auch mit vi(m)/nano/gedit oder was auch immer, visudo macht bloß vor dem speichern checks, damit die Syntax nicht fehlerhaft ist. Denn die sudoers birgt die Gefahr, sich komplett aus dem System auszusperren.
    @MichaRPI: Du sagst, du wärst nicht dumm, du hättest es richtig verstanden. Die Logik diktiert, wenn es doch falsch ist (worauf wir uns ja inzwischen alle geeinigt haben) bist du laut deiner eigenen Aussage dumm. Ich hätte das so nicht gesagt, das warst du! Und dass du da jetzt so drauf reagierst, zeigt eher, dass du der beleidigte bist (zu dem Schluss kam ja auch meigrafd...)

  • Es macht kein Sinn für diesen einen Befehl extra ein bash Script zu erstellen. Man muss sowas nicht unnötig verkomplizieren.



    PHP + Webserver: er müsste immer auf die Webseite gehen und irgendwas machen, damit das Datum gespeichert wird.
    Shell-Script + cronjob = alles automatisch.


    Auch das ist eigentlich falsch. Ein PHP Script kann genauso gut via crontab ausgeführt werden - spielt hier aber absolut keine Rolle, da der TE die Systemzeit ja manuell via Webseite einstellen möchte.
    Wenn er das gerne so machen möchte dann lass ihn halt? Insbesondere wenn er nicht jedesmal SSH nutzen möchte und auch keine Internetverbindung besteht, macht das so wie ers haben möchte nämlich schon Sinn



    "visudo" ausführen und folgendes eintragen:

    Code
    www-data ALL=(ALL) NOPASSWD: /pfad/zum/phpskript.php


    Wenn Du "vi" nicht beherrschst, vorher in der gleichen Shell "export EDITOR=/pfad/zum/lieblingseditor" (z.B. /usr/bin/nano).


    Das ist So falsch. Zum einen brauch er nicht "/pfad/zum/phpskript.php" eintragen sondern vielmehr /pfad/zur/date/binary, da im shell_exec der 'date' Befehl mithilfe von sudo ausgeführt werden soll(te), also dann auch das Recht ohne Password-Nachfrage für den 'date' Befehl erforderlich wäre... Aber zum anderen brauch man bei "export EDITOR=nano" nicht den Pfad zum Editor angeben da dieser für gewöhnlich im PATH liegt (Umgebungsvariable)


    Hast Du mit "visudo" gerarbeitet, oder die sudoers direkt editiert? Letzteres funktioniert nämlich nicht.


    Funktioniert schon, sollte man aber nicht machen. Denn wenn man die Datei direkt bearbeitet, dabei aber einen Fehler macht, ist die gesamte Datei sozusagen kaputt... Und standardmäßig ist für root kein Password gesetzt, pi kann dann aber kein sudo mehr nutzen da die Konfigurationsdatei ja kaputt ist, und somit hätte man sich dann ausgesperrt.... Nutzt man aber wie empfohlen 'visudo' wird von diesem Programm beim speichern die Syntax verifiziert und erst wenn alles i.O. ist die original Datei überschrieben.


    So und jetzt noch ein paar Hinweise für den TE:


    shell_exec(); ist nicht wirklich toll. Das gibt keine Rückmeldung ob ein Befehl erfolgreich war oder irgendwelche Fehler ausgegeben wurden. Nutze stattdessen lieber exec(); und seh dir dazu die Exit-Code (Error Handling) Geschichte am Ende von > diesem Beitrag < an.


    Um die Zeit über 'date' einstellen zu können musst du date --set bzw date -s verwenden. Standardmäßig erwartet er dann eine Zeit in dem von Horroreyes erwähnten Format. Man kann das Format zwar auch angeben, wäre aber hierbei unnötig.


    Wie hier auch schon erklärt wurde, darf nur jemand mit root Rechten die Systemzeit einstellen. Du musst also 'sudo' vor den Befehl setzen. Damit der 'www-data' Benutzer das über sudo darf musst du den 'date' Befehl für ihn freigeben, also sähe der Eintrag über 'visudo' wie folgt aus:

    Code
    www-data ALL=NOPASSWD:/bin/date

    (den Pfad zum Befehl findest du über which date heraus)


    Um jetzt genauer darauf eingehen zu können wie das PHP Script aussehen sollte bzw was du ggf falsch gemacht haben könntest, müssten wir das vollständige Script kennen/sehen - du scheinst nämlich auch noch ein <form zu haben was du aber nicht gezeigt hast...

  • hier mal das komplette php script:
    <?PHP
    if (isset($_POST['setServerDateTime']))
    { //anfang ifisset
    if ($_POST['setServerDateTime'] == "Serverdatum setzen")
    { //anfang ifisset
    $datetxt = $_POST['date_txt'];

    $a = exec('sudo date "$datetxt"');
    }
    }
    ?>
    <html>
    <head>
    <script type="text/javascript" >
    function addLeadingZeros(number, length) {
    var num = '' + number;
    while (num.length < length) num = '0' + num;
    return num;
    }


    function setDateTime(){
    //MMDDhhmmYY
    var heute = new Date();
    var heute_txt = heute.toLocaleString();
    var MM = addLeadingZeros((heute.getMonth()+1),2).toLocaleString();
    var DD = addLeadingZeros(heute.getDate(),2).toLocaleString();
    var hh = addLeadingZeros(heute.getHours(),2).toLocaleString();
    var mm = addLeadingZeros(heute.getMinutes(),2).toLocaleString();
    var YY = addLeadingZeros((heute.getFullYear()-2000),2).toLocaleString();
    var output = "";

    output = output.concat(MM, DD,hh,mm,YY);
    document.getElementById('datefull_txt').value = heute_txt;
    document.getElementById('date_txt').value = output;
    }

    function showAktDatum(){
    var ng = new Date().toLocaleString();
    document.getElementById("akt_device_time").innerHTML = ng;
    }

    setInterval("showAktDatum();", 500);

    </script>
    </head>
    <body>
    Aktuelle Uhrzeit auf Ihrem Ger&auml;t:<span id="akt_device_time"></span>
    <form name="dateTimeForm" method="post">
    <input type="text" name="date_txt" id="datefull_txt"><br>
    <input type="text" name="date_txt" id="date_txt"><br>
    <input type="button" name="setDate" onclick="setDateTime()" value="Datum auslesen">
    <input type="submit" name="setServerDateTime" value="Serverdatum setzen">
    </form>

    <?php echo $a; ?><br>
    <?php echo $datetxt; ?><br>
    <?php echo date(DATE_RFC822); ?>


    </body>
    </html>
    Automatisch zusammengefügt:[hr]
    unten die Zeilen dienen nur der Kontrolle

  • Schön wäre es gewesen, wenn Du schreiben würdest was bei den unteren Zeilen heraus kommt.


    Mir ist aufgefallen, dass du zwei Mal den Namen "date_txt" vergeben hast:


    Code
    <input type="text" name="date_txt" id="datefull_txt"><br>
    <input type="text" name="date_txt" id="date_txt"><br>



    Viele Grüße
    Olaf

    Es gibt immer verschiedene Möglichkeiten um an ein Ziel zu kommen.
    Alle angegebenen Eingaben, wenn nicht anders angegeben, sind als Benutzer 'root' auszuführen.

    Edited once, last by korky2 ().