Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] touch geht nicht (https://www.delphipraxis.net/57119-%5Bphp%5D-touch-geht-nicht.html)

Luckie 16. Nov 2005 05:18


[PHP] touch geht nicht
 
Ich versuche gerade mit touch das Datum einer Datei neu zu setzen. Doch
leider schlägt touch mit der Fehlermeldung
Zitat:

Warning: touch(): Utime failed: Operation not permitted in
/var/www/l3s11195/html/Developer/Artikel/settimestamp.php on line 48
fehl.

Die entsprechende Zeile sieht wie folgt aus:
Code:
touch("ICQLog_Win32API.shtml", strtotime("2003-09-17 15:12"));
Ist der Server eventuell so konfiguriert, dass diese Operation nicht erlaubt
ist?

Eine Datei mit touch anlegen geht übrigens.

Jetzt habe ich auf http://de.php.net gelesen:
Zitat:

Here's a little workaround that allows the PHP user to touch a file it
doesn't own:

Code:
<?php

   $target_file = "/path/to/file/filename.txt"; //system filepath to your
file
   $file_content = implode("",file($target_file));
   @unlink($target_file);
   if($savetofile = fopen($target_file, "w")) {
       fputs($savetofile, $file_content);
       fclose($savetofile);
   }
   $new_date = strtotime("23 April 2005"); // set the required date
timestamp here
   touch($target_file,$new_date);

?>

Bzw. die Ergänzung:
Zitat:

Here's how the code SHOULD be written:

Create the new file FIRST, rather than last, with a different
name such as $file.tmp.
Read the ownership, permissions, and creation time of the old file.
Set permissions and creation time of the new file the same as the old.
Rename the new file to the name of the old.
chown() the new file to the user that owned the file it's replacing.
Daraus resultiert folgend er Code:

Code:
function mytouch($file, $timestamp)
   {
     clearstatcache();
     $file = $_SERVER['DOCUMENT_ROOT']."/Developer/Artikel/".$file;
     echo "Datei: $file
";
     $ctime = filectime($file);
     echo "Datum: ".date("Y-m-d H:i", $ctime)."
";
     $owner = posix_getpwuid((fileowner($file)));
     echo "Besitzer: ".$owner["name"]."
";
     $perm = decoct(fileperms($file));
     echo "Attribute: $perm
";
     $file_content = implode("",file($file));
     if($savetofile = fopen('~.tmp', "w")) {
         fputs($savetofile, $file_content);
         fclose($savetofile);
     }

     if (@chmod('~.tmp', octdec($perm)))
     {
       echo "Attribute neu: ".decoct(fileperms('~.tmp'))."
";
     }
     else
     {
       echo "Dateiattribute konnten nicht gesetzt werden.
";
     }

     touch('~.tmp', $ctime);

     rename('~.tmp', $file);

     if (@chown($file, intval($owner["uid"])))
     {
       $owner = posix_getpwuid((fileowner($file)));
       echo "Besitzer: ".$owner["name"]."
";
     }
     else
     {
       echo "Besitzer konnte nicht geändert werden.
";
       $owner = posix_getpwuid((fileowner($file)));
       echo "Besitzer neu: ".$owner["name"]."
";
     }

     $new_date = $timestamp; // set the required date timestamp here
     $err = touch($file,$new_date);
     if ($err)
     {
       echo "Datum neu: ".date("Y-m-d H:i", filemtime($file))."
";
     }
     echo "<hr>
";
     return $err;
   }
Aber da nach ist der Besitzer immer "apache". Was natürlich nicht erwünscht
ist.

Nach dem mir die Datei nicht mehr gehört, sondern "apache" der Besitzer ist,
schlägt folgende Zeile
Code:
include $_SERVER['DOCUMENT_ROOT'].'/includes/head.shtml';
Mit folgenden Warnungen fehl:
Zitat:

Warning: main(): SAFE MODE Restriction in effect. The script whose uid is 48
is not allowed to access /var/www/l3s11195/html/includes/head.shtml owned by
uid 3922 in /var/www/l3s11195/html/Developer/Artikel/API_Zauberwuerfel.php
on line 13

Warning: main(/var/www/l3s11195/html/includes/head.shtml): failed to open
stream: No such file or directory in
/var/www/l3s11195/html/Developer/Artikel/API_Zauberwuerfel.php on line 13

Warning: main(): Failed opening '/var/www/l3s11195/html/includes/head.shtml'
for inclusion (include_path='.') in
/var/www/l3s11195/html/Developer/Artikel/API_Zauberwuerfel.php on line 13
Und deswegen müsste entweder touch funktionieren oder ich muss mit dem
Script (mytouch) Besitzer der Datei bleiben.

Ich bin da etwas ratlos, was da auf dem Server los ist. Es muss doch möglich
sein das Dateidatum von Dateien zu ändern deren Besitzer ich bin. :gruebel:

himitsu 16. Nov 2005 05:34

Re: [PHP] touch geht nicht
 
Bei mir funktionierten damals derartige Spielereien auch nicht, weil ebenfalls noch einige Sachen gesperrt waren.

Abhilfe hatte eine ganz nette Anfrage an meinen Provider erbracht ;)
Eventuell schaltet deiner es dir auch kostenlos frei - manche wollen aber auch Kohle sehn, wenn sie bestimmte Features freischalten sollen -.-''

Luckie 16. Nov 2005 09:00

Re: [PHP] touch geht nicht
 
Wie gefährlich kann denn touch sein? :shock:

himitsu 16. Nov 2005 09:35

Re: [PHP] touch geht nicht
 
Och, du glaubst garnicht was mal alles für harmlose Sachen als gefährlich ansieht.
Aber es kann ja auch sein, daß die nur was anderes gesperrt haben und dieses einfach nur irgendwie damit zusammenhängt, oder es wurde etwas noch nicht freigeschaltet, was standardmäßig aus ist :roll:


[add]
zu moritz's Beitrag:
bleibt nur zu hoffen, daß du diese Rechte auch hast, chown(...) ist ja eh oftmals abgeschalte/eingeschränkt, damit man an den Rechten nichts drehen kann ._.

moritz 16. Nov 2005 09:42

Re: [PHP] touch geht nicht
 
Also, das Problem bei solchen Servern ist, dass der FTP-User meist ein anderer als der PHP-User ist. D.h., Datein, die du mit FTP auf den Server spielst, gehören dir, und Dateien, die du per PHP aufspielst, gehören dem Apache/PHP-User. Da du als Apache-User allerdings die Rechte hast, musst du einfach ein chown(Dein-FTPUSERNAME) in deinen mytouch-Script einbauen, um den Besitzer wieder auf den FTP-User zu wechseln.
Dann sollte das klappen.

Gruß

Luckie 16. Nov 2005 14:29

Re: [PHP] touch geht nicht
 
Das hab eich in dem Script ja schon probiert, wenn du es dir genau anguckst, nur scheint es nicht zu gehen, wenn der apache der Besitzer ist:
Code:
if (@chown($file, intval($owner["l3s11195"])))
     {
       $owner = posix_getpwuid((fileowner($file)));
       echo "Besitzer: ".$owner["name"]."
";
     }
     else
     {
       echo "Besitzer konnte nicht geändert werden.
";
       $owner = posix_getpwuid((fileowner($file)));
       echo "Besitzer neu: ".$owner["name"]."
";
     }
Zitat:

Datei: /var/www/l3s11195/html/Developer/Artikel/ICQLog_Win32API.shtml
Datum: 2005-11-16 15:27
Besitzer: l3s11195
Attribute: 100644
Attribute neu: 100644
Besitzer konnte nicht geändert werden.
Besitzer neu: apache
Datum neu: 2005-11-16 15:27


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz