създаване на фаил в папка

systems

Registered
Добър вечер това е скрипт с които създавам папка въпроса ми е следния има ли начин
по които в създадената папка да се създаде празен фаил index.html или index.php
автоматично както създавам папка благодаря ви.


PHP:
<?php
$directory=strtolower("/тук директорията/$user");
                if (!is_dir($directory)) 
                { 
                mkdir("$directory",777,true)or die('Грешка при създаването на директория!');
                
                }
?>
 
teroristd каза:
PHP:
$file = fopen("/path/to/dir/index.php", "w");

Да но нестава несъздава index.php използвам debian 5.0.3 и PHP Версия: 5.6.36-1+0~20180714182146.1+stretch~1.gbpa3dade

ако е от значение.
 
реших да тествам с txt фаил създава го но ако опитам да задам директория като
/var/www/forlders/newfile.txt веднага казва Unable to open file! а в този му вид без да задавам директория работи.

има ли някакъв начин да проработи със субдиректорий?


PHP:
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");

$txt = "John Doe\n";
fwrite($myfile, $txt);

$txt = "Jane Doe\n";
fwrite($myfile, $txt);

fclose($myfile);
?>

моля ви помогнете ми!!!
 
Ако се опитваш да записваш в някоя външна директория, най-вероятно нямаш права.

Не би трябвало да е проблем да записваш в субдиректории, примерно:

PHP:
mkdir ("subdir");
fopen("subdir/newfile.txt", "w");

И ползвай относителни пътища, за да си сигурен, че подадения път е в директорията на сървъа.
 
Забелязах, че използваш strtolower за пътя. Имай предвид, че в unix базираните ОС имената на файловете и папките са case sensitive. Другият възможен проблем е apache user-а да няма права в папката. Опитах при мен (Ubuntu 18.04, PHP 7.2.7) 4 варианта за създаване на файл, само 2 от тях сработиха
Опитай така и напиши какво връща:
PHP:
$currrentDir = realpath(getcwd());
$dirToCreate = "folder123";
$dirPath = escapeshellarg($currentDir . "/" . $dirToCreate);
$fileToCreate = "index.php";
$filePath = escapeshellarg($currentDir . "/" . $dirToCreate . "/" . $fileToCreate);
$out = array();
$out['pwd'] = $currentDir;
$out['dirToCreate'] = $dirPath;
$out['fileToCreate'] = $filePath;
exec("ls -laR", $out);
exec("mkdir " . $dirPath, $out);
// touch($filePath); //Това не работи при мен
// file_put_contents($filePath, ''); //Това също не работи
// fclose(fopen($filePath, "w")); //Това работи
exec("touch " . $filePath, $out); //Това също работи
exec("ls -laR", $out);
print_r($out);

EDIT: Хрумна ми нещо, дай и резултата от:
PHP:
print decoct(umask());
 
raiden каза:
Забелязах, че използваш strtolower за пътя. Имай предвид, че в unix базираните ОС имената на файловете и папките са case sensitive. Другият възможен проблем е apache user-а да няма права в папката. Опитах при мен (Ubuntu 18.04, PHP 7.2.7) 4 варианта за създаване на файл, само 2 от тях сработиха
Опитай така и напиши какво връща:
PHP:
$currrentDir = realpath(getcwd());
$dirToCreate = "folder123";
$dirPath = escapeshellarg($currentDir . "/" . $dirToCreate);
$fileToCreate = "index.php";
$filePath = escapeshellarg($currentDir . "/" . $dirToCreate . "/" . $fileToCreate);
$out = array();
$out['pwd'] = $currentDir;
$out['dirToCreate'] = $dirPath;
$out['fileToCreate'] = $filePath;
exec("ls -laR", $out);
exec("mkdir " . $dirPath, $out);
// touch($filePath); //Това не работи при мен
// file_put_contents($filePath, ''); //Това също не работи
// fclose(fopen($filePath, "w")); //Това работи
exec("touch " . $filePath, $out); //Това също работи
exec("ls -laR", $out);
print_r($out);

EDIT: Хрумна ми нещо, дай и резултата от:
PHP:
print decoct(umask());


резултата от:
<?php
print decoct(umask());
?>
е 22

ето резултата от горния код:
Код:
Array ( [pwd] => [dirToCreate] => '//var/www/view/pic/testuser253/' [fileToCreate] => '//var/www/view/pic/testuser253//index.php' [0] => .: [1] => total 4376 [2] =>

папаката си я създава но самия фаил index.php неще трябва ръчно да го създам
иначе папката си има права:

51196.png
 
В момента правата на папката са 466, което е странно. При umask 022 и mkdir със 777 резултата би трябвало да е 755.
Опитай преди да извикаш mkdir да сложиш umask(0); и виж с какви права ще я създаде. Опитай и варианта за създаване на файл с exec("touch /path/to/file.php");

EDIT: Най-добре дай да видим owner-ите и правата по папките
$ls -laR /var/www/view/pic
 
Ето правата:

Код:
/var/www/view/pic/testusers251:
общо 8
dr--rwxrwt  2 www-data www-data 4096 авг 10 19:34 .
drwxrwxrwx 50 root     www-data 4096 авг 10 22:11 ..
 
systems каза:
Ето правата:

Код:
/var/www/view/pic/testusers251:
общо 8
dr--rwxrwt  2 www-data www-data 4096 авг 10 19:34 .
drwxrwxrwx 50 root     www-data 4096 авг 10 22:11 ..

най-после стана съдаде фаила ето така:
PHP:
<?php
exec("touch /var/www/view/pic/testuser253/index.php");
?>
PHP:
 
systems каза:
systems каза:
Ето правата:

Код:
/var/www/view/pic/testusers251:
общо 8
dr--rwxrwt  2 www-data www-data 4096 авг 10 19:34 .
drwxrwxrwx 50 root     www-data 4096 авг 10 22:11 ..

най-после стана съдаде фаила ето така:
PHP:
<?php
exec("touch /var/www/view/pic/testuser253/index.php");
?>

Правата не са ОК.
www-data user-а има права само за четене, от там идва проблема. Не виждам при това положение как е сработил touch-а. При мен резултата при тези права е очаквания:
Код:
dr--rwxrwt  2 srs srs    4096 авг 11 11:17 noPermission/
$ touch noPermission/test.php
touch: cannot touch 'noPermission/test.php': Permission denied
Всъщност ако целта на празния файл е просто да не се листват файловете в папката, можеш да го постигнеш и с 1 .htaccess файл във /var/www/view/pic. В него слагаш Options -Indexes и не се мъчиш повече.
 
Оправих проблема със правата сега се създава папка с права www четене и запис навсякъде но остана проблема със създаването на празен фаил индекс.

PHP:
  $structure = strtolower("/var/www/view/pic/$user");
                if (!mkdir($structure, 0777, true)) {
                die('Failed to create folders...');
                }
                if(!chmod($structure, 0777)){
                die('Failed to chmod');
                }
 
Юзъра трябва да има execute права, за да може да създаде файл в папката
Код:
drw-rwxrwt  2 srs srs    4096 авг 11 11:17 noPermission/
$ touch noPermission/test.php
touch: cannot touch 'noPermission/test.php': Permission denied
$ chmod +x noPermission/
$ touch noPermission/test.php
$ ll noPermission/
-rw-r--r--  1 srs srs    0 авг 11 15:41 test.php
 
Аз успях да го направя сега хем дава права хем създава index.php които пренасочва
към индекса ето го:

PHP:
$structure = strtolower("/var/www/view/pic/$user");
                if (!mkdir($structure, 0777, true)) {
                die('Failed to create folders...');
                }
                if(!chmod($structure, 0777)){
                die('Failed to chmod');
                }
                $text="<?php header( 'Location:http://site.com/index.php' );?>";
                $fp = fopen ("/var/www/view/pic/$user/index.php" ,"a");
                fwrite($fp,$text);
                fclose($fp);

а така даже и .htacess фаил създава.
PHP:
 $text="deny from all";
                $fp = fopen ("/var/www/view/pic/$user/.htacess" ,"a");
                fwrite($fp,$text);
                fclose($fp);


Благодаря на всички за помоща!!!!
 
За да не се занимаваш със сетване на права, можеш направо да сетнеш ACL:
Код:
Текущи права:
$ setfacl -Rm u:www-data:rwx,g:www-data:rx,o:rx /var/www/view/pic
Права по подразбиране:
$ setfacl -Rmd u:www-data:rwx,g:www-data:rx,o:rx /var/www/view/pic
От там нататък всички новосъздадени папки ще бъдат с права 755

А за редиректа можеш да направиш 1 RewriteRule в .htaccess:
Код:
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index\.(php|htm|html) !-f
RewriteRule ^ http://site.com/index.php [R=302]
Това ще пренасочва всички рекуести към съществуващи папки, в които няма файл с име index.php, index.htm или index.html към http://site.com/index.php
 

Горе