Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Вопрос на счет get permission PHP до и после изменения
цитата
31/03/17 в 21:44
 Int13h
В скрипте участок проверки изменения пермишенс

Берется значение перм.., до изменяются и берется после. Изменения происходят по факту. но после берется значение которое равно до. Не могу раздулпить. Уже пробовал Sleep (1); делать, думал может система ставить какое то время и берутся старые.

EX. вывод лога: где значение для новых прав
File: fancybox/blank.gif 755 0666 ----> 0666 NOT REPLACE PERMISSSION-
File: fancybox/fancy_close.png 755 0666 ----> 0666 NOT REPLACE PERMISSSION-

Хотя по уму должно
File: fancybox/fancy_close.png 755 0666 ----> 0755 OK


Код:

$perms1 = substr(sprintf('%o', fileperms($file_name)), -4);
exec('chmod '. $files_chmod ." ".$file_name);
$perms2 = substr(sprintf('%o', fileperms($file_name)), -4);
          if ($perms1 == $perms2 )
                 {
                 echo "File: " . $file_name . "  ". $files_chmod . " ". $perms1 . " ----> ".  $perms2 . " NOT REPLACE! <br>"; 
                 }
       
           if ($perms1 != $perms2 )
                 {
                 echo "File: " . $file_name . "  ". $perms1 . " ----> ".  $perms2 . " OK <br>"; 
                 }
                 



Всем заранее благодарен за советы smail54.gif
цитата
31/03/17 в 23:43
 dizziness
Код:


exec('chmod '. $files_chmod .' '.$file_name, $output, $return);

var_dump($output);
echo($return);




что в $output и $return?

возможно у вебсервера нет прав на chmod?

сделай через php chmod ( string $filename , int $mode ) увидишь ошибку сразу, смысл через exec чмодить?
цитата
01/04/17 в 00:35
 Int13h
dizziness: Выводит array(0) {
}
0
File: index.php 666 0755 ----> 0755 NOT REPLACE! <br>

Код:
<?php
$files_chmod = 666;
$file_name = 'index.php';
$perms1 = substr(sprintf('%o', fileperms($file_name)), -4);
exec('chmod '. $files_chmod .' '.$file_name, $output, $return);
//chmod($file_name, $files_chmod = 0666);
var_dump($output);
echo($return);
$perms2 = substr(sprintf('%o', fileperms($file_name)), -4);
          if ($perms1 == $perms2 )
                 {
                 echo "File: " . $file_name . "  ". $files_chmod . " ". $perms1 . " ----> ".  $perms2 . " NOT REPLACE! <br>"; 
                 }
       
           if ($perms1 != $perms2 )
                 {
                 echo "File: " . $file_name . "  ". $perms1 . " ----> ".  $perms2 . " OK <br>"; 
                 }
                 
?>


На счет же PHP варианта chmod($file_name, $files_chmod);
Да он заменяет, но не во всех каталогах. Возможно это связано с группой к которой принадлежит каталог или файл или надо 777 задать каталогам до замены файлов PHP функцией chomd ((.

Поэтому пошел в лоб через exec - UNIX команду заюзал, она всё топорно заменяет.

Цель была написать замену пермишинс директорий и файлов от корня вверх рекурсивно. На нужные, исключая некоторые файлы и каталоги. Вроде корректно заменяет - вот загвоздка в том что хотел осуществить ещё проверку факта замены на лету, но не получается. Поэтому удалил сейчас эти условия.
Сам скрипт.

Код:
<?php

//Scrypt work with function EXEC !!!
//1. Set Chmods for Dirs and Files
//2. Add or delete STOP Dirs and Files {Files no Set Mods}
//3. Load in Root of http://domain.com/ch.php
//4. Run Scrypt

///INI
$dir_chmod   = 777; //Directories format Ex. 777
$files_chmod = 755; //Files format Ex.766

//Propuskaem eti catalogi i files
$stop_dirs  = 'cache, tmp'; //No ChMod Dirs ! Add ONE DIR IN STOP Array For Correct... Ex . ZZZZZZZZ;
$stop_files = 'ch.php, a_name_stop.ini, b_name_stop.ini'; //No ChMod Files - 1 or More Files To Correct Work Ex. zzzzzzz.txt


header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: " . date("r"));
echo "<h1>", date("H:i:s"), "</h1>";



checkExecFunction();
getDirList();
setPermissionFiles($all_data, $files_chmod, $stop_files, $stop_dirs, $dir_chmod);
setPermissionDirs($all_data, $dir_chmod, $stop_dirs);
echo "OK" . "<br>";



function getDirList()
{
    global $all_data;
    $dirs_array = glob('*', GLOB_ONLYDIR);
    //print_r ( $dirs_array); 
   
    foreach ($dirs_array as $work_dir) {
        $root_dirs   = $root_dirs . ":::" . $work_dir;
        $scan_result = makeScanDirs($work_dir);
       
        //  echo   $scan_result; 
    }
    $all_data = $root_dirs . $all_data;
}



function makeScanDirs($work_dir)
{
    global $all_data;
    $dirs_array = glob($work_dir . '/*', GLOB_ONLYDIR); {
        foreach ($dirs_array as $dir_name) {
            makeScanDirs($dir_name);
            // echo  $dir_name . "\n";
            $all_data = $all_data . ':::' . $dir_name;
        }
       
    }
   
   
}


function setPermissionDirs($all_data, $dir_chmod, $stop_dirs)
{
    echo "<h2> DIRS </h2>";
    $i    = 0;
    $dirs = explode(':::', $all_data);
   
    foreach ($dirs as $dir_name) {
       
        $dir_str_size = strlen($dir_name);
        //  $flag_dir =   
        if ($dir_str_size > 0) {
            $dir_len       = strlen($dir_name);
            $dir_array[$i] = $dir_len . ':' . $dir_name;
            $i++;
        }
       
       
    }
   
    natsort($dir_array);
    //print_r ( $dir_array);
    $k = 0;
    foreach ($dir_array as $new_dr) {
        $dir_array_ex       = explode(':', $new_dr);
        $dir_array_work[$k] = $dir_array_ex[1];
        $k++;
    }
   
    $z = count($dir_array_work);
    $i = 0;
    foreach ($dir_array_work as $dir_name_temp) {
        $sort_dir_array[$i] = $dir_array_work[$z - 1];
        $i++;
        $z--;
    }
   
    //Chmod
   
    foreach ($sort_dir_array as $directory_name) {
       
        $stop_flag = checkStop($object = $directory_name, $stop_str = $stop_dirs);
        if ($stop_flag != "stop") {
            exec('chmod ' . $dir_chmod . " " . $directory_name);
            echo $directory_name . "  " . $dir_chmod . "<br>";
        }
       
        if ($stop_flag == "stop") {
           
            echo $directory_name . " NO REPLACE.. OK?" . "<br>";
        }
       
    }   
   
}


function setPermissionFiles($all_data, $files_chmod, $stop_files, $stop_dirs, $dir_chmod)
{
   
echo "<h2> FILES </h2>";
hta_PermReplace($files_chmod, $stop_files);
    rootPermReplace($files_chmod, $stop_files);
   
    $dirs = explode(':::', $all_data);
    foreach ($dirs as $dir_name) {
        $dir_str_size = strlen($dir_name);
        $stop_flag    = checkStop($object = $dir_name, $stop_str = $stop_dirs);
       
        if ($dir_str_size > 0 and $stop_flag != 'stop') {
            // echo  $dir_name . "\n";
            $perms1      = substr(sprintf('%o', fileperms($dir_name)), -4);
            $files_array = glob($dir_name . "/*.*");
           
            foreach ($files_array as $file_name) {
                $stop_flag = checkStop($object = $file_name, $stop_str = $stop_files);
               
                if ($stop_flag == 'stop') {
                    echo $file_name . " NO REPLACE.. OK?" . "<br>";             
                }
                           
                if ($stop_flag != 'stop') {
                    // echo  $file_name . "\n"; 
                   
                    $perms1 = substr(sprintf('%o', fileperms($file_name)), -4);
                    exec('chmod ' . $files_chmod . " " . $file_name);
                    echo $file_name . "  " . $files_chmod . "<br>";
                   
                }
               
            }
                           
        }
           
    }
     
}


function checkStop($object, $stop_str)
{
    $stop_array = explode(",", $stop_str);
    foreach ($stop_array as $stp_component) {
        $pos = strpos("  " . $object, trim($stp_component));
        if ($pos > 1) {
            $flag = 'stop';
            // echo  $object . "!!!!!!!!!!!!!!!!"."\n" ;
            return $flag;
        }
       
    }
     
}


function rootPermReplace($files_chmod, $stop_files)
{
    $root_files = array_filter(glob("*"), 'is_file');
    //$root_files = glob ('*');
    foreach ($root_files as $root_file_name) {
        $stop_flag = checkStop($object = $root_file_name, $stop_str = $stop_files);
        if ($stop_flag == "stop") {
            echo $root_file_name . " NO REPLACE.. OK?" . "<br>";
        }
       
       
       
        if ($stop_flag != "stop") {
            exec('chmod ' . $files_chmod . " " . $root_file_name);
            echo $root_file_name . "  " . $files_chmod . "<br>";
        }
       
    }
   
}


function hta_PermReplace($files_chmod, $stop_files)
{
    $filename = '.htaccess';
    if (file_exists($filename)) {
        $stop_flag = checkStop($object = $filename, $stop_str = $stop_files);
        if ($stop_flag == "stop") {
            echo $filename . " NO REPLACE.. OK?" . "<br>";
        }
        if ($stop_flag != "stop") {
            exec('chmod ' . $files_chmod . " " . $filename);
            echo $filename . "  " . $files_chmod . "<br>";
        }
       
    }
   
   
}


function checkExecFunction()
{
exec ('ls > exec.txt');
$filename = 'exec.txt';
$flag = "no_exec";
if (file_exists($filename)) {
        echo 'Exec function Present in Sever Config! - OK <br>';
        echo 'WORK...<br>';     
       exec ('rm exec.txt');
        $flag = "exec";
        }
if ($flag == "no_exec")
{
  echo "Warning! Activate Exec function or ROOT / Directory not Writable";
  exit;

}


}


?>

цитата
01/04/17 в 01:42
 dizziness
Int13h: сделай clearstatcache(); после exec()


Цитата:

Список функций, результаты выполнения которых кешируются: stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype() и fileperms().
цитата
01/04/17 в 02:01
 Int13h
dizziness: спасибо smail54.gif

помогло, кеш сбросился icon_wink.gif
задал сменить с 666 на 755 проверка на лету показала замену
File: index.php 0666 ----> 0755 OK
цитата
01/04/17 в 23:20
 Mika
Int13h писал:
Цель была написать замену пермишинс директорий и файлов от корня вверх рекурсивно. На нужные, исключая некоторые файлы и каталоги. Вроде корректно заменяет - вот загвоздка в том что хотел осуществить ещё проверку факта замены на лету, но не получается. Поэтому удалил сейчас эти условия.
Сам скрипт.

Хрена себе простыня. Почитай Mastering Unix Shell Scripting и подобные задачи будешь решать в баше 1-строчниками, написанными за минуту.

P.S. Я даже боюсь представить во сколько строчек кода выливаются более-менее серьезные проекты.
цитата
19/04/17 в 14:01
 Ailk
Прошу прощения за поднятую темку. Уж больно интересно пишет ТС trollface.png

Ну, типа вот этого:
Код:
$all_data = $all_data . ':::' . $dir_name;


Далее:
Код:
$dirs = explode(':::', $all_data);


Вот это тоже. Массивы? Не не слышал.
Код:
//Propuskaem eti catalogi i files
$stop_dirs  = 'cache, tmp'; //No ChMod Dirs ! Add ONE DIR IN STOP Array For Correct... Ex . ZZZZZZZZ;
$stop_files = 'ch.php, a_name_stop.ini, b_name_stop.ini'; //No ChMod Files - 1 or More Files To Correct Work Ex. zzzzzzz.txt


Ну можно же было что-то типо того?
Код:

$excludedDirs = [
   'cache',
   'tmp',
];
$excludedFiles = [
   'ch.php',
   'a_name_stop.ini',
   'b_name_stop.ini',
];
$excludedExtensions = [
   'ini',
   'htaccess',
    // etc..
];

А потом проверять на наличие в массиве того или иного элемента.

Рекурсивный обход директорий без рекурсии функций:
http://php.net/manual/ru/class.recursivedirectoryiterator.php
цитата
19/04/17 в 15:47
 dizziness
Ailk: пффф... массивы... массивы для слабаков, смотри сюда,

Код:
##105**Наименование товара 1**60 штук**1**2650.00##79**Наименование товара 2**5 штук**1**0.00##



так хранится корзина заказа в одной работающей партнерке, и это еще не самое худшее в том коде icon_cool.gif
цитата
19/04/17 в 16:41
 Int13h
Ailk:
1) я же не кодер по специализации, вебмастер icon_wink.gif
2) время на рефакторинг, поиск функций, классов, фрейморков и тп не было, за час пока импульс был захотел написать на коленке код, что бы закрыть на сайте папки и файлы от вирусни из вне. С лету написал, работает и гуд smail101.gif

На счёт массивов - мне проще через запятую по быстрому в конфиг вписывать потом файлы и папки вот так
Код:
dirs = 'one, xxx, free';

сейчас подумал, что конфиг проще ещё может через пробел, что бы ещё быстрее вводить Код:
dirs = 'one xxx free';
потом только Код:
$dirs_array = explode (" ", dirs);


чем ковычки ставить, запятые...
Код:
dirs_array = array ('one', 'xxx', 'free');


и тем более

Код:
$excludedDirs = [
   'cache',
   'tmp',
];


одинарные ковычки ставить каждый раз, особенно если штук 20 файлов и столько же папок которые надо исключить и забыть поставить ковычку.
Хотя согласен - массивом будет правильней и проще в плане обработки через foreach махом.
цитата
19/04/17 в 17:27
 localhost
Int13h писал:
Ailk:
На счёт массивов - мне проще через запятую по быстрому в конфиг вписывать потом файлы и папки вот так
Код:
dirs = 'one, xxx, free';

сейчас подумал, что конфиг проще ещё может через пробел, что бы ещё быстрее вводить Код:
dirs = 'one xxx free';
потом только Код:
$dirs_array = explode (" ", dirs);


чем ковычки ставить, запятые...
Код:
dirs_array = array ('one', 'xxx', 'free');




text.txt:
1=one
2=two
3=three
4=four

похапэ скрипт:
$list=parse_ini_file('text.txt');
цитата
19/04/17 в 18:57
 dizziness
localhost писал:
text.txt:
1=one
2=two
3=three
4=four

похапэ скрипт:
$list=parse_ini_file('text.txt');



зачем такие сложности? тогда уж просто

dirs.txt
--------
one
two
three


Код:
$list = file('dirs.txt',FILE_IGNORE_NEW_LINES);


результат, чистый массив , каждый элемент = 1 строка файла.
цитата
19/04/17 в 19:47
 Int13h
localhost: я не хотел внешних файлов делать icon_wink.gif
stop_dirs.txt
stop_files.txt
... и тп хотел одним файлом с кодом и конфиг в коде. Что бы в корень домена залил и запустил.

Думаю, если развивать идею, то лучше даже так сделать можно было.
Код:
$stop_dirs = <<< HTML_END
folder-one
xxx
sysfolder
HTML_END;
$stop_dirs_array = explode ("\n", $stop_dirs);


Последний раз редактировалось: Int13h (19/04/17 в 20:05), всего редактировалось 1 раз
цитата
19/04/17 в 19:52
 dizziness
Int13h: ну а когда тебе $stop_dirs понадобиться в другом файле, копипастить будешь? а потом в двух местах редактировать код?


вообще если это не часть чего-то, а просто реально права на файлах менять, то проще как писали выше, средствами shell команд сделать, типа chown -R и т.д.
цитата
19/04/17 в 20:20
 Int13h
dizziness: если, структура движка будет другая ) поменяю в файле ch.php - значение stop_files и stop_dirs - через noteped2, без NuSphere, залью и запущу domain.txt/ch.php )
я знаю про рекурсивную смену прав chown -R , но прикол в том, что некоторые (папки и файлы) разной вложенности, надо было оставить, не меняя права, файлам задать одни права, папкам другие + запускать скрипт по web, без SSH доступа, не заходя по putty и не бродя там в поисках public_html )
цитата
19/04/17 в 20:22
 Ailk
dizziness писал:
Ailk: пффф... массивы... массивы для слабаков, смотри сюда,

Код:
##105**Наименование товара 1**60 штук**1**2650.00##79**Наименование товара 2**5 штук**1**0.00##



так хранится корзина заказа в одной работающей партнерке, и это еще не самое худшее в том коде icon_cool.gif

Сколько платят за поддержку этого говна?
Кстати в мускул 5.7 жсон поля ввели. И по ним есть поиск.

Int13h писал:
2) время на рефакторинг, поиск функций, классов, фрейморков и тп не было, за час пока импульс был захотел написать на коленке код, что бы закрыть на сайте папки и файлы от вирусни из вне. С лету написал, работает и гуд
К таким вещам надо ответственно относится. До кучи надо еще посчитать хеши файлов, и проверять периодически что изменилось. Пхп, жс, файлы шаблонов в особенности. Вот.

Еще 1 мысль. Вот закрыл ты все файлы, молодец. А потом надо что-то изменить. Что делать? Правильно, разлочить все нада =) Значит тулзу нада, которая запомнит у кого какие разрешения были, а потом по заранее созданной карте восстановит обратно, для работы.
цитата
19/04/17 в 20:31
 dizziness
Ailk писал:

Кстати в мускул 5.7 жсон поля ввели. И по ним есть поиск.


да я знаю, использую местами, но уже на новых проектах буду c postgresql работать, там типов поболее(в т.ч. и json, array), и свои создать можно, и еще много интересного, короче mysql, maria отдыхают.
цитата
19/04/17 в 20:32
 Int13h
Ailk: ну тогда цель была движок Joomla закрыть, на запись. Потом бы сменил бы временно тем же скриптом прописав, перед обновлением icon_wink.gif .
Код:

$dir_chmod   = 777;
$files_chmod = 755;


А так, да можно было log.txt делать где путь до файла, изначальные права, и CRC.
На крон поставил бы, что бы скрипт сверял было ли изменение в контрольных суммах файлов, так как время создания хакер может откорректировать и даже размер теоретически вернуть, вставив мини eval шелл с получением параметров по post,get,cookie и удалив комменты и тп что бы размер файла остался таким же. Но с CRC уже сложнее ему. Да и сам log.txt - защифровать xor, что бы в самом файле хакер не поменял данные проверочные, если догадается. Ну и с алертом в случае появления любых новых файлов. Так же можно было файлы сканировать на eval, base64_decode и тп
Но это совсем другая история smail101.gif


Эта страница в полной версии