1 (edytowany przez patryk 2011-01-03 12:12:05)

Temat: http/php manager plików

funkcje:
- usuwanie / kopiowanie / edycja plików
- tworzenie linków
- tworzenie i usuwanie katalogów
- graficzny chmod
- możliwość definiowania użytkowników bez prawa zapisu
- możliwość ukrycia zawartości wybranych katalogów
- ładowanie plików z poziomu przeglądarki
- szybkie udostępnianie plików i katalogów przez http
- przekazywanie komend do shella (z możliwością zastrzeżenia wybranych poleceń)

wymagania:
- serwer http (skrypt oczywiście ma tylko takie uprawnienia jak serwer)
- obsługa php
- prawo zapisu i odczytu w /tmp dla serwera

wodotryski:
narazie brak wink

skrypt będzie wymagał utworzenia pliku z użytkownikami (instrukcja jest wyświetlana po pierwszej próbie zalogowania się)
nazwa pliku zawierającego skrypt nie odgrywa roli.
komendy 'reboot' i 'firstboot' są domyślnie zablokowane (do zmiany w konfiguracji na początku skryptu - wszystko jest opisane)
zeby zablokować wyświetkanie wybranego katalogu umieść z nim plik 'zakaz_wjazdu' lub 'zakaz_wjazdu_admin'. pierwszy zablokuje wyświetlanie dla użytkownika, drugi dla wszystkich.
logowanie z uzyciem cookie i pliku-tokena.

blokując komende definiujesz TYLKO komende - nie jej patametry (zablokowanie 'ls' zablokuje również 'ls -al', 'ls /dir' itd)

do utworzenia listy użytkowników będzie potrzebny generator md5 (np. ten: http://patryk.x10.mx/php_file_manager/generator.php )
WAŻNE: przeczytaj komentarze w skrypcie. zeby działał upload plików wiekszych niz kilka kilo, konieczna jest konfiguracja.
(proste jak drut, ale trzeba to zrobić)
sam skrypt wtgląda tak:

<?php
//klasy CSS:
// link_dir - link przejścia do katalogu (tylko tabela)
// link_opcje - 'przycisk' [opcje]
//
// skrypt obsluguje dwa rodzaje użytkowników: admin i user
// admin ma pełną kontrole nad systemem plików, natomiast
// user może sobie tylko pooglądać ;)
// użytkowników definiujemy tworząc plik /etc/php_file_manager/users
// składnia pliku to: 'użytkownik:hash_md5_hasła:admin' - dla admina
// i 'użytkownik:hash_md5_hasła:user' - dla "read only"
// (bez apostrofów oczywiście)
// jeden użytkownik na wiersz. możesz ich zdefiniować ile chcesz
// serwer musi mieć też prawo zapisu i odczytu w /tmp

////////////////////////////////////////////konfiguracja///////////////////////////////////////////////////

$GLOBALS['sessionv'] = 60 * 60 * 24; //ważność sesji - po takiej ilości sekund zostaniesz wylogowany

$strefa_czasu = 'CET';            //strefa czasowa. jak trzeba, to zmienić ;)
$tabela_kolor1 = '#CCCCCC';     //
$tabela_kolor2 = '#FFFFFF';     //tych dwuch chyba nie trzeba tłumaczyć ;)
$date_format = 'd-m-Y H:i:s';    //format daty do tabeli(w internecie jest dobrze opisane, jak go zdefiniować dla php)
$link_tag = ' **link**';        //indykator linku (jeżeli element jest linkiem, to ten ciąg pojawi sie za jego nazwą)
$www_link_dir = '/www/public/';    //katalog, dla "szybkich linków" - żeby działało udostępnianie
                                //w ten sposób, serwer musi obsługiwać symlinki)

$www_link_prefix = 'http://twoja_domena.com/public/';    //adres, pod którym widać katalog $www_link_dir
                                                        //(np. do wygodnego wklejania w komunikatory)
                                                        //jeżeli nie zostanie ustawiony, wszystko dalej będzie działać.
                                                        //ale może sie to okazać upierdliwe ;)

$no_access = 'zakaz_wjazdu';    //jeżeli taki plik istnieje w jakimś katalogu, katalog nie
                                //zostanie wylistowany jeżeli użytkownik nie jest administratorem.

$no_access_admin = 'zakaz_wjazdu_admin';    //jeżeli istnieje, nikt nie zobaczy zawartości
                                            //(to tak, zeby sobie samemu przez przypadek nie namieszać)

////filtr komend
$command_filter_list = '|reboot|firstboot|wget|';    //(każda konemda musi być między dwoma znakami "|").
$command_filter_mode = 'off';                        //filtr obsluguje tryby 'allow', 'deny' i 'off'
                                                    //'deny' - nie można wykontwać komend z listy
                                                    //'allow' - można wykonywać tylko komendy z listy
                                                    //'off' - filtr jest wyłączony

////opcje istotne tylko przy ładowaniu plików

///niestety w ten sposób nie da sie zmienić wartości 'max_execution_time' i 'memory_limit' z php.ini
///musisz to zrobić "na piechotę" - sorry :D
///
///'max_execution_time' to paksymalny czas wykonywania skryptu (musi wystarczyć na załadowanie pliku, poskładanie plików
///        tymczasowych do kupy i skopiowanie gotowego pliku do docelowego katalogu)
///'memory_limit' to limit pamięci operacyjnej (pewnie nie bedzie odgrywał wiekszej roli, ale tak na wypadek W. napisałem)

$set_upload_ini = FALSE;            // jeżeli FALSE, poniższe ustawienia zostaną pominięte (php użyje ustawień z php.ini)
                                    // zmień wartość na TRUE, jeżeli chcesz ładować duże pliki na serwer

$max_input_time    = 600;                // maksymalny czas odbierania danych (w sekundach)
                                    // (musi wystarczyć na przesłanie pliku)

$post_max_size = '200M';            // maksymalny rozmiar danych POST (czyli pliku w wypadku uploadu) - tu 200MB

$upload_max_filesize = '200M';        // maksymalny rozmiar pliku - tu 200MB

$upload_tmp_dir = '/mnt/nas/tmp';    // katalog na pliki tymczasowe .Jeżeli używasz lighttpd musisz zmienić jeszcze
                                    // ustawienia samego serwera edytując plik lihttpd.conf (parametr 'server.upload-dirs'),
                                    // bo z jakichś powodów lighttpd tam właśnie ładuje wsystkie pliki tymczasowe (oczywiście musi tam
                                    // być odpowiednia ilość miejsca. w przypadku OpenWrt /tmp odpada - konieczna zmiana)

//odkomentowanie następnego wiersza (usuniecie '//' z przodu spowoduje zablokowanie wyświetlania błądów.
// ini_set('display_errors', 0);

////////////////////////////////////////////////////koniec konfiguracji////////////////////////////////////////

ini_set('date.timezone', $strefa_czasu);
if($set_upload_ini) {
    ini_set('max_input_time', $max_input_time);
    ini_set('post_max_size', $post_max_size);
    ini_set('upload_max_filesize', $upload_max_filesize);
    ini_set('upload_tmp_dir', $upload_tmp_dir);
}
if(isset($_GET['logout'])) {
    $tokenfile = '/tmp/php_file_manager_' . $_COOKIE['user'] . '.hash';
    unlink($tokenfile);
    setcookie ("hash", $hash, - 86400, "/");
    setcookie ("user", $nazwa, - 86400, "/");
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' . "\n";
    echo '<html xmlns="http://www.w3.org/1999/xhtml">' . "\n";
    echo '<head>' . "\n";
    echo '<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />' . "\n";
    echo '<title>PHP File Manager</title>' . "\n";
    echo '<pre>' . "\n";
    echo 'Do zobaczenia ;)<br />' . "\n";
    echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">' . "\n";
    echo 'login <input name="login" type="text" size="20" /><br />' . "\n";
    echo 'hasło <input name="haslo" type="password" size="20" /><br />' . "\n";
    echo '<input name="submit" type="submit" value="  Zaloguj  " />' . "\n";
    echo '</form>' . "\n";
    echo '</pre>' . "\n";
    echo '</body>' . "\n";
    echo '</html>' . "\n";
    die;
}

if(isset($_COOKIE['user'])) {
    $GLOBALS['username'] = $_COOKIE['user'];
    $GLOBALS['hash'] = $_COOKIE['hash'];
    //logowanie ciasteczkowe
    $file = '/tmp/php_file_manager_' . $_COOKIE['user'] . '.hash';
    if(file_exists($file)) {
        $data = explode("\n", file_get_contents($file));
        if($data[0] === $_COOKIE['hash']) {
            $GLOBALS['auth'] = TRUE;
            if($data[1] === 'admin') {
                $GLOBALS['admin'] = TRUE;
                $GLOBALS['usertype'] = $data[1];
            }else{
                $GLOBALS['admin'] = FALSE;
                $GLOBALS['usertype'] = $data[1];
            }
        }else{
            $GLOBALS['auth'] = FALSE;
            unlink($file);
        }
    }else{
        $GLOBALS['auth'] = FALSE;
    }
}else{
    $GLOBALS['auth'] = FALSE;
}

if ($GLOBALS['auth'] === FALSE) {
    if(file_exists('/etc/php_file_manager/users')) {
        if(isset($_POST['login']) and isset($_POST['haslo'])) {
            $users = file_get_contents('/etc/php_file_manager/users');
            $users = explode("\n", $users);
            $i = 0;
            while(isset($users[$i])) {
                $tmp = explode(':', $users[$i]);
                $GLOBALS['users'][$tmp[0]][$tmp[1]] = $tmp[2]; ///$GLOBALS['users']['nazwa_użutkownika']['md5hash'] = typ_konta
                $i++;
            }
            $nazwa = $_POST['login'];
            $hash = md5($_POST['haslo']);
            if(isset($GLOBALS['users'][$nazwa][$hash])) {
                $GLOBALS['auth'] = TRUE;
                $valid = time() + $GLOBALS['sessionv'];
                $nazwa = $_POST['login'];
                $hash = md5($_POST['haslo']);
                setcookie ("hash", $hash, $valid, "/");
                setcookie ("user", $nazwa, $valid, "/");
                $GLOBALS['firstlogin'] = TRUE;
                $toput = $hash ."\n". $GLOBALS['users'][$nazwa][$hash];
                $tokenfile = '/tmp/php_file_manager_' . $nazwa . '.hash';
                file_put_contents($tokenfile, $toput);
                if ($GLOBALS['users'][$nazwa][$hash] === 'admin') {
                    $GLOBALS['admin'] = TRUE;
                }else{
                    $GLOBALS['admin'] = FALSE;
                }
            }else{
                $GLOBALS['auth'] = FALSE;
            }
        }
    }else{
        echo 'błąd: nie można otworzyć pliku haseł<br />';
        echo 'upewnij się, czy plik \'/etc/php_file_manager/users\' istnieje<br />';
        echo 'i czy serwer ma prawo odczytu do tego pliku<br />';
        echo 'składnia pliku jest następująca: user:hasło(md5):typ. np.:<br />';
        echo '<pre><code>';
        echo 'kuba:1f3870be274f6c49b3e31a0c6728957f:admin' . "\n";
        echo 'tomek:e734dc5328d5a555de5f06c7c9459667:user';
        echo '</code></pre><br />';
        echo 'pamiętaj! nazwy użytkowników nie mogą zawierać \':\'<br />';
        echo 'do wygenerowania pliku z hasłami możesz użuc <a href="http://patryk.x10.mx/php_file_manager/generator.php">TEGO GENERATORA</a><br />';
    }
}
unset ($GLOBALS['user']);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>PHP File Manager</title>

<style type="text/css">
<!--
a:link {
    color: #00F;
    text-decoration: none;
}
a:visited {
    color: #00F;
    text-decoration: none;
}
a:hover {
    color: #0C6;
    text-decoration: underline;
}
a:active {
    color: #F00;
    text-decoration: none;
}
.x {
    text-decoration: line-through;
    color: #00F;
}
-->
</style>
</head>
<body>

<?php
$GLOBALS['www_prefix'] = $www_link_prefix;
$auth = $GLOBALS['auth'];
$admin = $GLOBALS['admin'];

//ustalenie bierzącego katalogu
if(isset($_GET['dir'])) {
    $GLOBALS['katalog'] = $_GET['dir'];
}else{
    $GLOBALS['katalog'] = '/';
}
$dir = $GLOBALS['katalog'];
///////////
////funkcje
///////////

function my_chmod($file, $rights) {
    ///funkcja chmod
    $file = str_replace('//', '/', $file);
    $komenda = 'chmod ' . $rights . ' "' . $file . '"';
    shell_exec($komenda);
    echo 'wykonano [ ' . $komenda . ' ]';
}

function my_link($target, $link) {
    ///funkcja link
    $target = str_replace('//', '/', $target);
    $komenda = 'ln -s "' . $target . '" "' . $link . '"';
    shell_exec($komenda);
    if(is_link($link)) {
        echo 'utworzono link [ ' . $link . ' ]';
    }else{
        echo 'BŁĄD: tworzenie linku nie powiodło się';
    }
}
function my_qlink($dir, $target) {
    ///szybki link do serwera
    $target = str_replace('//', '/', $target);
    $link = implode('[]', explode('/', $target));
    $link = implode('_', explode(' ', $link));
    $linkname = $link;
    $link = $dir . $link;
    $komenda = 'ln -s "' . $target . '" "' . $link . '"';
    shell_exec($komenda);
    if(is_link($link)) {
        echo 'utworzono link [ ' . $link . ' ]<br />';
        echo 'plik jest dostępny tutaj:<br />';
        echo '<a href="' . $GLOBALS['www_prefix'] . $linkname . '">' . $GLOBALS['www_prefix'] . $linkname . '</a><br />';
        echo 'aby zatrzymać udostępnianie pliku usuń<br />';
        echo '[ ' . $linkname . ' ]<br />';
        echo 'z katalogu [ ' . $dir . ' ]';
    }else{
        echo 'BŁĄD: tworzenie linku nie powiodło się';
    }
}

function edytor($file) {
    //edytor
    if(isset($_POST['content'])) {
        file_put_contents($file, trim(stripslashes($_POST['content'])));
    }
    echo '<pre><form action="' . $_SERVER['PHP_SELF'] . '?context=edytor&object=' . $file . '" method="post">';
    echo '<textarea name="content" cols="57" rows="28">' . file_get_contents($file) .'</textarea><br />';
    echo '<input name="submit" type="submit" value="zapisz" />';
    echo '</form></pre>';
}

function my_copy($object, $cel, $typ) {
    $komenda = 'cp -r "' . $object . '" "' . $cel . '"';
    shell_exec($komenda);
    if($typ === 'dir') {
        if(is_dir($cel)) {
            echo 'skopiowano';
        }else{
            echo 'BŁĄD';
        }
    }
    if($typ === 'slink') {
        if(file_exists($cel)) {
            echo 'skopiowano';
        }else{
            echo 'BŁĄD';
        }
    }
    if($typ === 'file') {
        if(file_exists($cel)) {
            echo 'skopiowano';
        }else{
            echo 'BŁĄD';
        }
    }
}

//tworzenie katalogu

if($auth) {
    if($admin) {
        if(isset($_POST['mkdir'])) {
            $new_folder = $dir . $_POST['mkdir'];
            mkdir($new_folder);
        }
    }
}

$command = 'ls -1a \'' . $dir . '\'';
$output0 = shell_exec($command);
$no_access = "\n" . $no_access . "\n";
$no_access_admin = "\n" . $no_access_admin . "\n";
//czy jest plik zakazu?
if($admin === FALSE) {
        if(strpos($output0, $no_access)) {
        unset($output0);
        }
}
if(strpos($output0, $no_access_admin)) {
    unset($output0);
}

if($auth) {
    if(isset($_GET['context'])) {
    if($admin) {
        if($_GET['context'] === 'edytor') {
            edytor($_GET['object']);
        }
        if($_GET['context'] === 'slink') {
        //popup dla katalogu-linku//////////////////////////////////////////////////////
        if(isset($_GET['rm'])) {
                    if(unlink($_GET['object'])) {
                        echo '<pre>symlink został usunięty</pre>';
                    }else{
                        echo '<pre>BŁĄD: SYMLINK NIE ZOSTAŁ USUNIĘTY</pre>';
                    }
                }else{
                    echo '<pre>dir/symlink [ ' . $_GET['object'] . ' ]<hr />';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $_GET['object'] . '&rm=yes">[[usuń]]</a> '; // ok
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $_GET['object'] . '&do=cp">[[skopiuj]]</a> ';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $_GET['object'] . '&do=qlink">[[udostępnij]]</a> ';
                    echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get"><input name="do" type="hidden" value="cp" /><input name="context" type="hidden" value="slink" /><input name="object" type="hidden" value="' . $_GET['object'] . '" />cel <input name="cel" type="text" size="10" /><input name="submit" type="submit" value="skopiuj" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=slink&object=' . $_GET['object'] . '&do=chmod" method="post">chmod <input name="value" type="text" size="3" maxlength="3" /><input name="submit" type="submit" value="zmień" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=slink&object=' . $_GET['object'] . '&do=link" method="post"> link <input name="value" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>';
                    
                    if(isset($_GET['do'])) {
                        // tworzenie linku
                        if($_GET['do'] === 'link') {
                            $target = '/' . implode('/', explode('/', $_GET['object']));
                            my_link($target, $_POST['value']);
                        }
                        if($_GET['do'] === 'qlink') {
                            my_qlink($www_link_dir, $_GET['object']);
                        }
                        if($_GET['do'] === 'chmod') {
                            my_chmod($_GET['object'], $_GET['value']);
                        }
                        if($_GET['do'] === 'cp') {
                            my_copy($_GET['object'], $_GET['cel'], $_GET['context']);
                        }
                    }
                    echo '</pre>';
                }
        ////////////////////////////////////////////////////////////////////////////////////
        }
        if($_GET['context'] === 'file') { //context file
            if(isset($_GET['object'])) {
                //menu pliku (....?context=file&object=...)
                if(isset($_GET['rm'])) {
                    if(unlink($_GET['object'])) {
                        echo '<pre>plik został usunięty</pre>';
                    }else{
                        echo '<pre>BŁĄD: PLIK NIE ZOSTAŁ USUNIĘTY</pre>';
                    }
                }else{
                    echo '<pre>Plik [ ' . $_GET['object'] . ' ]<hr />';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&rm=yes">[[usuń]]</a> '; // ok
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=edytor&object=' . $_GET['object'] . '">[[edytuj]]</a> ';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=qlink">[[udostępnij]]</a> ';
                    echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get"><input name="do" type="hidden" value="cp" /><input name="context" type="hidden" value="file" /><input name="object" type="hidden" value="' . $_GET['object'] . '" />cel <input name="cel" type="text" size="10" /><input name="submit" type="submit" value="skopiuj" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=chmod" method="post">chmod <input name="value" type="text" size="3" maxlength="3" /><input name="submit" type="submit" value="zmień" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=link" method="post"> link <input name="value" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>';
                    
                    if(isset($_GET['do'])) {
                        // tworzenie linku
                        if($_GET['do'] === 'link') {
                            $target = '/' . implode('/', explode('/', $_GET['object']));
                            my_link($target, $_POST['value']);
                        }
                        if($_GET['do'] === 'qlink') {
                            my_qlink($www_link_dir, $_GET['object']);
                        }
                        if($_GET['do'] === 'chmod') {
                            my_chmod($_GET['object'], $_POST['value']);
                        }
                        if($_GET['do'] === 'cp') {
                            my_copy($_GET['object'], $_GET['cel'], $_GET['context']);
                        }
                    }
                    echo '</pre>';
                }
            }
        }
        if($_GET['context'] === 'dir') { //context dir
            if(isset($_GET['object'])) {
                // menu katalogu (....?context=dir&object=...)
                if(isset($_GET['rm'])) {
                    if(rmdir($_GET['object'])) {
                        echo 'Katalog [ ' . $_GET['object'] . ' ]<hr />';
                        echo '<pre>katalog został usunięty</pre>';
                    }else{
                        echo 'Katalog [ ' . $_GET['object'] . ' ]<hr />';
                        echo '<pre>BŁĄD: KATALOG NIE ZOSTAŁ USUNIĘTY<br />';
                        echo 'Prawdopodobnie nie jest pusty lub nie masz.<br />';
                        echo 'odpowiednich uprawnień';
                        echo 'Rekusywne usuwanie wiesza serwer...<br />';
                        echo 'Sprawdź swoje uprawnienia i/lub oprużnij katalog';
                    }
                }else{
                    echo '<pre>Katalog [ ' . $_GET['object'] . ' ]<hr />';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&rm=yes">[[usuń]]</a> '; //ok
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=qlink">[[udostępnij]]</a> ';
                    echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="get"><input name="do" type="hidden" value="cp" /><input name="context" type="hidden" value="dir" /><input name="object" type="hidden" value="' . $_GET['object'] . '" />cel <input name="cel" type="text" size="10" /><input name="submit" type="submit" value="skopiuj" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=chmod" method="post">chmod <input name="value" type="text" size="3" maxlength="3" /><input name="submit" type="submit" value="zmień" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=link" method="post"> link <input name="value" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>'; // ok
                    
                    if(isset($_GET['do'])) {
                        // tworzenie linku
                        if($_GET['do'] === 'link') {
                            $target = '/' . implode('/', explode('/', $_GET['object']));
                            my_link($target, $_POST['value']);
                        }
                        if($_GET['do'] === 'qlink') {
                            my_qlink($www_link_dir, $_GET['object']);
                        }
                        if($_GET['do'] === 'chmod') {
                            my_chmod($_GET['object'], $_POST['value']);
                        }
                        if($_GET['do'] === 'cp') {
                            my_copy($_GET['object'], $_GET['cel'], $_GET['context']);
                        }
                    }
                    echo '</pre>';
                }
            }
        }
        if($_GET['context'] === 'konsola') { //konsola
            if(isset($_POST['command'])) {
                if($command_filter_mode === 'deny') {
                    // jeżeli oprucz
                    $test_com = explode(' ', $_POST['command']);
                    $test_com2 = '|' . $test_com[0] . '|';
                    if(strpos($command_filter_list, $test_com2)) {
                        echo 'komenda [ ' . $test_com[0] . ' ] została zablokowana<ha />';
                    }else{
                        if(strpos($command_filter_list, $_POST['command'])) {
                            echo 'komenda [ ' . $test_com[0] . ' ] została zablokowana<ha />';
                        }else{
                            echo '<pre>wyjście z komendy ' . $_POST['command'] . '<hr />';
                            echo shell_exec($_POST['command']) . '</pre><hr />';
                        }
                    }
                }
                if($command_filter_mode === 'allow') {
                    //jeżeli tylko
                    $test_com = explode(' ', $_POST['command']);
                    $test_com2 = '|' . $test_com[0] . '|';
                    if(strpos($command_filter_list, $test_com2)) {
                        echo '<pre>wyjście z komendy ' . $_POST['command'] . '<hr />';
                        echo shell_exec($_POST['command']) . '</pre><hr />';
                    }else{
                        echo 'komenda [ ' . $test_com[0] . ' ] została zablokowana<ha />';
                    }
                }
                if($command_filter_mode === 'off') {
                    //jeżeli brak filtracji
                    echo '<pre>wyjście z komendy ' . $_POST['command'] . '<hr />';
                    echo shell_exec($_POST['command']) . '</pre><hr />';
                }
            }
            echo '<pre><form action="' . $_SERVER['PHP_SELF'] . '?context=konsola" method="post">';
            echo 'komenda do wykonania<br />';
            echo '<input name="command" type="text" size="80" />';
            //echo '<input name="submit" type="submit" value="go" />';
            echo '</form></pre>';
            //koniec konsoli
        } //konsola
        if($_GET['context'] === 'upload') {
            echo '<pre>[upload] plik zostanie załadowany do:<br />';
            echo '[ ' . $_GET['target'] . ' ]<hr />';
            //upload
            if(isset($_FILES['plik']['name'])) {
                if(is_uploaded_file($_FILES['plik']['tmp_name'])) {
                    $zap_jako = $_GET['target'] . $_FILES['plik']['name'];
                    move_uploaded_file($_FILES['plik']['tmp_name'], $zap_jako);
                    echo 'Plik: ' . $_FILES['plik']['name'] . ' o rozmiarze ' . $_FILES['plik']['size'] . ' bajtów został załadowany';
                }
            }
            //formulaż
            echo '<form action="' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $_GET['target'] . '" enctype="multipart/form-data" method="post">'; 
            echo '<input name="plik" type="file" />';
            echo '<input type="submit" value="załaduj" />';
            echo '</form></pre>';
        }      //context upload
    }
     // stopka wspólna dla wszystkich podstron z '?context'
}else{
    
    ///file explorer

//password parser
$data = explode("\n", file_get_contents('/etc/passwd'));
$i = 0;
while(isset($data[$i])) {
    $data1 = explode(':', $data[$i]);
    $GLOBALS['user'][$data1[2]] = $data1[0];
    $i++;
}
//górne menu


if($admin) {
    // konsola
    echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?context=konsola" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=konsola\',\'popup\',\'width=600,height=500,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[konsola]]</a> '; 

// upload
    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=upload" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $dir . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[upload]]</a> ';
}else{
    echo '<pre><span class="x">[[konsola]]</span> <span class="x">[[upload]]</span> ';
}

//logout
echo '<a href="' . $_SERVER['PHP_SELF'] . '?logout=do">[[logout]]</a></pre>';
//echo '<hr />';

//ścieżka z linkami
$dir_e = explode('/', $dir);
$i = 0;
$path = '/';
echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">[root]</a>/';
while(isset($dir_e[$i])) {
    if($dir_e[$i] != '') {
        $path = $path . $dir_e[$i] . '/';
        echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">' . $dir_e[$i] . '</a>/';
    }
    $i++;
}
echo '</pre>' . "\n";

//tabela
$kolor = $tabela_kolor1;
$togle = TRUE;
$i = 0;
$output = explode("\n", $output0);
echo '<pre><table border="1" cellspacing="1" cellpadding="0">' . "\n";
while(isset($output[$i])) {
    if($output[$i] != '.') {
        if($output[$i] != '..') {
            if($output[$i] != '') {
                $file = $dir . $output[$i];
                
                $perms = fileperms($file);
                if (($perms & 0xC000) == 0xC000) {
                    // Socket
                    $info = 's';
                    $isdir = FALSE;
                } elseif (($perms & 0xA000) == 0xA000) {
                    // Symbolic Link
                    $info = 'l';
                    $isdir = FALSE;
                } elseif (($perms & 0x8000) == 0x8000) {
                    // Regular
                    $info = '-';
                    $isdir = FALSE;
                } elseif (($perms & 0x6000) == 0x6000) {
                    // Block special
                    $info = 'b';
                    $isdir = FALSE;
                } elseif (($perms & 0x4000) == 0x4000) {
                    // Directory
                    $info = 'd';
                    $isdir = TRUE;
                } elseif (($perms & 0x2000) == 0x2000) {
                    // Character special
                    $info = 'c';
                    $isdir = FALSE;
                } elseif (($perms & 0x1000) == 0x1000) {
                    // FIFO pipe
                    $info = 'p';
                    $isdir = FALSE;
                } else {
                    // Unknown
                    $info = 'u';
                    $isdir = FALSE;
                }

                // Owner
                $info .= (($perms & 0x0100) ? 'r' : '-');
                $info .= (($perms & 0x0080) ? 'w' : '-');
                $info .= (($perms & 0x0040) ?
                           (($perms & 0x0800) ? 's' : 'x' ) :
                           (($perms & 0x0800) ? 'S' : '-'));

                // Group
                $info .= (($perms & 0x0020) ? 'r' : '-');
                $info .= (($perms & 0x0010) ? 'w' : '-');
                $info .= (($perms & 0x0008) ?
                           (($perms & 0x0400) ? 's' : 'x' ) :
                           (($perms & 0x0400) ? 'S' : '-'));

                // World
                $info .= (($perms & 0x0004) ? 'r' : '-');
                $info .= (($perms & 0x0002) ? 'w' : '-');
                $info .= (($perms & 0x0001) ?
                           (($perms & 0x0200) ? 't' : 'x' ) :
                           (($perms & 0x0200) ? 'T' : '-'));

                echo '<tr bgcolor="' . $kolor . '" height="1">';
                echo '<td width="90">' . $info . '</td>';
                echo '<td align="right" width="60">' . $GLOBALS['user'][fileowner($file)] . '</td>';
                echo '<td width="50">' . filegroup($file) . '</td>';
                echo '<td align="right" width="70">' . filesize($file) . '</td>';
                echo '<td align="right" width="160">' . date($date_format, filemtime($file)) . '</td>';
                echo '<td width="220">';
                if($isdir) {
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $dir . $output[$i] . '/"  class="link_dir">' . $output[$i] . '/</a>';
                }else{
                    echo $output[$i];
                }
                if(is_link($file)) {
                    echo $link_tag;
                }
                echo '</td>';
                echo '<td width="60">';
                if($admin) {
                    if($isdir) {
                        if(is_link($file)) { //jezeli katalog jest linkiem
                            echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                        }else{ //jeżeli katalog niejest linkiem
                        echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                        }
                    }else{ // jezeli plik lub link do pliku
                        echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                    }    
                }else{
                    echo '<span class="x">[opcje]</span>'; // jezeli brak uprawnień
                }
                echo '</td>';
                echo '</tr>' . "\n";
            }
        }
    }
    if($togle) {
        $togle = FALSE;
        $kolor = $tabela_kolor1;
    }else{
        $togle = TRUE;
        $kolor = $tabela_kolor2;
    }
    $i++;
}
if($admin) {
    echo '</table>' . "\n";
    echo '<form action="' . $_SERVER['PHP_SELF'] . '?dir=' . $dir . '" method="post">Nowy folder <input name="mkdir" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>';
    echo '</pre>';
}
}
}else{
    //moduł logowania
    echo '<pre>';
    echo 'Zaloguj się<br />';
    echo '<form action="' . $_SERVER['PHP_SELF'] . '" method="post">';
    echo 'login <input name="login" type="text" size="20" /><br />';
    echo 'hasło <input name="haslo" type="password" size="20" /><br />';
    echo '<input name="submit" type="submit" value="  Zaloguj  " />';
    echo '</form>';
    echo '</pre>';
}
?>
</body>
</html>

2

Odp: http/php manager plików

Koncepcja super, proste, lekkie i na temat smile Tylko u mnie jest maly problem: Nie uploaduje mi plikow do biezacego folderu. Winscp nie znajduje go.
BTW: Utworzylem index.php w winscp, wkleilem kod i zapisalem plik. Ze nie ma polskich znakow to pikus (sa krzaczki). Przydaloby sie tez pobieranie plikow za pomoca linku smile

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

3 (edytowany przez patryk 2010-12-25 21:18:39)

Odp: http/php manager plików

tu masz poprawione kodowanie znaków:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>PHP File Manager</title>

<style type="text/css">
<!--
a:link {
    color: #00F;
    text-decoration: none;
}
a:visited {
    color: #00F;
    text-decoration: none;
}
a:hover {
    color: #0C6;
    text-decoration: underline;
}
a:active {
    color: #F00;
    text-decoration: none;
}
-->
</style></head>
<body>

<?php
//klasy CSS:
// link_dir - link przejścia do katalogu (tylko tabela)
// link_opcje - 'przycisk' [opcje]

$auth = TRUE; //tylko do testów

//konfiguracja
$tabela_kolor1 = '#CCCCCC';
$tabela_kolor2 = '#FFFFFF';
$date_format = 'd-m-Y H:i:s';
$download_dir = '/www/downloads/';
//koniec konfiguracji

if($auth) {
    
if(isset($_GET['context'])) {
    if($_GET['context'] === 'file') {
        //menu pliku
        echo '<pre>Plik [ ' . $_GET['object'] . ' ]</pre>';
    } // plik
    if($_GET['context'] === 'dir') {
        //menu katalogu
        echo '<pre>Katalog [ ' . $_GET['object'] . ' ]</pre>';
    } //katalog
    if($_GET['context'] === 'konsola') {
        //konsola
        if(isset($_POST['command'])) {
            echo '<pre>wyjście z komendy ' . $_POST['command'] . '<hr />';
            echo shell_exec($_POST['command']) . '</pre><hr />';
        }
        echo '<pre><form action="' . $_SERVER['PHP_SELF'] . '?context=konsola" method="post">';
        echo 'komenda do wykonania<br />';
        echo '<input name="command" type="text" size="80" />';
        //echo '<input name="submit" type="submit" value="go" />';
        echo '</form></pre>';
        //koniec konsoli
    } //konsola
    if($_GET['context'] === 'upload') {
        echo '<pre>[upload] plik zostanie załadowany do:<br />';
        echo '[ ' . $_GET['target'] . ' ]<hr />';
        //upload
        if(isset($_FILES['plik']['name'])) {
            if(is_uploaded_file($_FILES['plik']['tmp_name'])) {
                $zap_jako = $_GET['target'] . $_FILES['plik']['name'];
                move_uploaded_file($_FILES['plik']['tmp_name'], $zap_jako);
                echo 'Plik: ' . $_FILES['plik']['name'] . ' o rozmiarze ' . $_FILES['plik']['size'] . ' bajtów został załadowany';
            }
        }
        //formulaż
        echo '<form action="' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $_GET['target'] . '" enctype="multipart/form-data" method="post">'; 
        echo '<input name="plik" type="file" />';
        echo '<input type="submit" value="załaduj" />';
        echo '</form></pre>';
    } //upload
    if($_GET['context'] === 'logout') {
        //logout
        echo 'TU BĘDZIE PROCEDURA KOŃCZĄCA SESJĘ';
    } //logout
     // stopka wspólna dla wszystkich podstron z '?context'
}else{
    ///file explorer

    //ustalenie bierzącego katalogu
if(isset($_GET['dir'])) {
    $GLOBALS['katalog'] = $_GET['dir'];
}else{
    $GLOBALS['katalog'] = '/';
}
$dir = $GLOBALS['katalog'];

//password parser
$data = explode("\n", file_get_contents('/etc/passwd'));
$i = 0;
while(isset($data[$i])) {
    $data1 = explode(':', $data[$i]);
    $GLOBALS['user'][$data1[2]] = $data1[0];
    $i++;
}
//górne menu

// konsola
echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?context=konsola" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=konsola\',\'popup\',\'width=600,height=500,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[konsola]]</a> '; 

// upload
echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=upload" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $dir . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[upload]]</a> ';

//logout
echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=logout">[[logout]]</a></pre>';
//echo '<hr />';

//ścieżka z linkami
$dir_e = explode('/', $dir);
$i = 0;
$path = '/';
echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">[root]</a>/';
while(isset($dir_e[$i])) {
    if($dir_e[$i] != '') {
        $path = $path . $dir_e[$i] . '/';
        echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">' . $dir_e[$i] . '</a>/';
    }
    $i++;
}
echo '</pre>' . "\n";

//tabela
$command = 'ls -1a ' . $dir;
$kolor = '#CCCCCC';
$togle = TRUE;
$output0 = shell_exec($command);
$i = 0;
$output = explode("\n", $output0);
echo '<pre><table border="1" cellspacing="1" cellpadding="0">' . "\n";
while(isset($output[$i])) {
    if($output[$i] != '.') {
        if($output[$i] != '..') {
            if($output[$i] != '') {
                $file = $dir . $output[$i];
                
                $perms = fileperms($file);
                if (($perms & 0xC000) == 0xC000) {
                    // Socket
                    $info = 's';
                    $isdir = FALSE;
                } elseif (($perms & 0xA000) == 0xA000) {
                    // Symbolic Link
                    $info = 'l';
                    $isdir = FALSE;
                } elseif (($perms & 0x8000) == 0x8000) {
                    // Regular
                    $info = '-';
                    $isdir = FALSE;
                } elseif (($perms & 0x6000) == 0x6000) {
                    // Block special
                    $info = 'b';
                    $isdir = FALSE;
                } elseif (($perms & 0x4000) == 0x4000) {
                    // Directory
                    $info = 'd';
                    $isdir = TRUE;
                } elseif (($perms & 0x2000) == 0x2000) {
                    // Character special
                    $info = 'c';
                    $isdir = FALSE;
                } elseif (($perms & 0x1000) == 0x1000) {
                    // FIFO pipe
                    $info = 'p';
                    $isdir = FALSE;
                } else {
                    // Unknown
                    $info = 'u';
                    $isdir = FALSE;
                }

                // Owner
                $info .= (($perms & 0x0100) ? 'r' : '-');
                $info .= (($perms & 0x0080) ? 'w' : '-');
                $info .= (($perms & 0x0040) ?
                           (($perms & 0x0800) ? 's' : 'x' ) :
                           (($perms & 0x0800) ? 'S' : '-'));

                // Group
                $info .= (($perms & 0x0020) ? 'r' : '-');
                $info .= (($perms & 0x0010) ? 'w' : '-');
                $info .= (($perms & 0x0008) ?
                           (($perms & 0x0400) ? 's' : 'x' ) :
                           (($perms & 0x0400) ? 'S' : '-'));

                // World
                $info .= (($perms & 0x0004) ? 'r' : '-');
                $info .= (($perms & 0x0002) ? 'w' : '-');
                $info .= (($perms & 0x0001) ?
                           (($perms & 0x0200) ? 't' : 'x' ) :
                           (($perms & 0x0200) ? 'T' : '-'));

                echo '<tr bgcolor="' . $kolor . '" height="1">';
                echo '<td width="90">' . $info . '</td>';
                echo '<td align="right" width="60">' . $GLOBALS['user'][fileowner($file)] . '</td>';
                echo '<td width="50">' . filegroup($file) . '</td>';
                echo '<td align="right" width="70">' . filesize($file) . '</td>';
                echo '<td align="right" width="160">' . date($date_format, filemtime($file)) . '</td>';
                echo '<td width="220">';
                if($isdir) {
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $dir . $output[$i] . '/"  class="link_dir">' . $output[$i] . '/</a>';
                }else{
                    echo $output[$i];
                }
                if(is_link($file)) {
                    echo ' **link**';
                }
                echo '</td>';
                echo '<td width="60">';
                if($isdir) {
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                }else{
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                }
                echo '</td>';
                echo '</tr>' . "\n";
            }
        }
    }
    $i++;
    if($togle) {
        $togle = FALSE;
        $kolor = $tabela_kolor1;
    }else{
        $togle = TRUE;
        $kolor = $tabela_kolor2;
    }
}}
echo '</table></pre>';
}else{
    //moduł logowania
    echo 'sorry dude';
}
?>
</body>
</html>

i teraz tak. jak sie pozbędesąsiada z domu, to dopisze linkowanie plików do podkatalogu w serwerze, zebyś mogł je sobie sciagac.
jezeli nie działa ci upload, to sprawdz ustawienia w php.ini

sekcja upload powinna wyglądać mniej-wiecej tak:

; File Uploads

file_uploads = On
upload_tmp_dir = "/mnt/hdd/tmp"
upload_max_filesize = 2M
max_file_uploads = 20

ścieżka musi prowadzić gdzieś,gdzie serwer moze bez problemu zapisywać

4

Odp: http/php manager plików

Czyli gdzie mam to wkleic? Nie znajduje takiej frazy w istn. pliku.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

5

Odp: http/php manager plików

w /etc/php.ini
i nie wklejać 'na pałę', tylko zrobić tak,zeby ci ścieżka pasowala do struktury katalogów

6

Odp: http/php manager plików

Upload dziala, bo zwiekszylem upload_max_filesize na 2000M. Jednak gdy probuje przeslac plik 50MB, to po kilku sekundach wyswietla

Połączenie z serwerem zostało zresetowane podczas wczytywania strony.

. Domyslam sie, ze to kwestia ustawien serwera lub php.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

7 (edytowany przez patryk 2010-12-25 22:23:21)

Odp: http/php manager plików

skrypt ci musi działać przez caly czas, jak ładujesz plik.
php jest domyślnie ustawione na 60 albo 30 sekund - nie pamietam.
przy takich duzych plikach to oczywiscie za mało - musisz przestawić (tez w php.ini)
no i musisz mieć odpowiednią ilość miejsca na partycji, gdzie masz pliki tymczasowe

8

Odp: http/php manager plików

Przestawilem w php.ini i nie pomaga, po 33 sek. resetuje sie.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

9

Odp: http/php manager plików

to jest chyba jakiś timeout w samym lighttpd.
u mnie tez da sie załadowac tylko pliki do ok 5 mega
niestety nie udało mi sie jak na razie wykminic, jak sobie z tym poradzic.
na razie mozesz uzyć swego rodzaju obejscia, jak musisz koniecznie duze pliki ładować z wanu
załaduj plik na inny serwer i potem zaciągnij go na router wgetem.
albo poszukaj innego serwera z obslugą cgi. apache pewnie da rade, ale nie bedziesz mial pełnej kontroli, bo apache nie odpalisz jako root.

jak znajde jakies rozwiązanie, to napisze wink

10

Odp: http/php manager plików

Jeszcze pytanie "pomocnicze": Za pomoca scp moge poslac do katalogu root plik 50MB bez problemow, ale juz do /tmp nie da rady (malo miejsca). Jak to obejsc? Mam extroota, pendrive 32GB.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

11

Odp: http/php manager plików

w /tmp masz zamontowany ram, czyli tylko 32 mega

12

Odp: http/php manager plików

patryk napisał/a:

w /tmp masz zamontowany ram, czyli tylko 32 mega

Chwila: Czyli w php.ini nie moze byc tymczasowy katalog w /tmp!

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

13

Odp: http/php manager plików

Zeby za duzo nie kombinowac: Czy da sie przeniesc RAM z /tmp gdzie indziej? Wprawdzie mam zrobionego swap-a (ponad 200MB), ale to nic nie daje.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

14

Odp: http/php manager plików

no jak chcesz zaladowac cos wiekszego niz ilosc wolnego ramu, to na pewninie wink

15

Odp: http/php manager plików

badziewiak napisał/a:

Zeby za duzo nie kombinowac: Czy da sie przeniesc RAM z /tmp gdzie indziej? Wprawdzie mam zrobionego swap-a (ponad 200MB), ale to nic nie daje.

no ale ej... po co?
da sie wszystko - nawet klocki hamulcowe robic z tektury. pytanie tylko czemu miało by to sluzyc  wink

16

Odp: http/php manager plików

patryk napisał/a:
badziewiak napisał/a:

Zeby za duzo nie kombinowac: Czy da sie przeniesc RAM z /tmp gdzie indziej? Wprawdzie mam zrobionego swap-a (ponad 200MB), ale to nic nie daje.

no ale ej... po co?
da sie wszystko - nawet klocki hamulcowe robic z tektury. pytanie tylko czemu miało by to sluzyc  wink

Bo myslalem, zeby uniknac modyfikowania plikow ini php, lighttpd i innych, ale to chyba taki sredni pomysl...

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

17 (edytowany przez badziewiak 2010-12-26 11:56:19)

Odp: http/php manager plików

Wiec tak: Utworzylem w root dwa katalogi: /tmpPhp i tmpLighttpd, po czym podmienilem sciezki w plikach konfiguracyjnych. Bledu nie wywala, ale nie widac go w katalogu docelowym. Mniejsze sa, ale 50MB juz nie widac. Oczywiscie sa tworzone ~1MB pliki w jednym z katalogow, ich laczna pojemnosc odpowiada wielkosci pliku upload-owanego. Chyba jednak gdzies jeszcze trzeba podmienic sciezki /tmp, ale nie mam pomyslu gdzie.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

18

Odp: http/php manager plików

hmmmm
nie mm pojecia dlczego tak sie dzieje.
w kazdym razie apache mi takich cyrkow nie robi,wiec to musi byc cos z lighttpd
jezeli nie jest ci potrzebny dostęp jako root, to przejscie na apache powinno zalatwic sprawe (oczywiscie nie bedziesz mogł wtedy zrobić nic na plikach, do ktorych prawa ma tylko root. reboota pewnie tez nie)

no chyba, ze cezary bedzie tak mily i przekompiluje apache...
jezeli nie to bedzie albo lighttpd działający jako root i pełna kontrola nad systemem, albo apache jako inny user i tylko podstawowe operacje
(albo jak jest jakis inny serwer z obslugą php potrafiący pracować jako root)

tak na marginesie: apache wywala coś takiego przy próbie uruchomienia jako root:

Error:
Apache has not been designed to serve pages while
running as root.  There are known race conditions that
will allow any local user to read any file on the system.
If you still desire to serve pages as root then
add -DBIG_SECURITY_HOLE to the CFLAGS env variable
and then rebuild the server.
It is strongly suggested that you instead modify the User
directive in your httpd.conf file to list a non-root user.

19

Odp: http/php manager plików

Jesli jest mozliwy upload/download/przenoszenie/kasowanie plikow oraz tworzenie/usuwanie/przesuwanie folderow w obrebie jednego udostepnionego folderu, to zupelnie wystarczy. Nie musze miec dostepu do plikow/folderow systemowych.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

20

Odp: http/php manager plików

no to w takim razie poczekaj az skoncze pisac ten skrypt.
w miedzyczasie mozesz sobie zainstalowac apache i skonfigurowac pod nim ssl i php - pewnie troche ci to zajmie ;>

21

Odp: http/php manager plików

Tak wiec apache+mySql+php5 hula, jeszcze ssl pozostal, ale to na koniec.

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)

22

Odp: http/php manager plików

@patryk: nazwij to jakoś i zrobimy pakiecik z tego.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

23

Odp: http/php manager plików

hehe. ok. jak mnie natchnie i skoncze pisać big_smile

24 (edytowany przez patryk 2010-12-28 05:30:31)

Odp: http/php manager plików

aktualny stan projektu
zmagam sie z błedami... busybox chyba nie byl zaprojektowany do wspolpracy z php big_smile
skurczybyk ma problemy z tworzeniem linkow. ale damy rade - znaczy jak sie połapie w tym, co ty wysmarowałem big_smile

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>PHP File Manager</title>

<style type="text/css">
<!--
a:link {
    color: #00F;
    text-decoration: none;
}
a:visited {
    color: #00F;
    text-decoration: none;
}
a:hover {
    color: #0C6;
    text-decoration: underline;
}
a:active {
    color: #F00;
    text-decoration: none;
}
.x {
    text-decoration: line-through;
    color: #00F;
}
-->
</style>
</head>
<body>

<?php
//klasy CSS:
// link_dir - link przejścia do katalogu (tylko tabela)
// link_opcje - 'przycisk' [opcje]

$auth = TRUE; //tylko do testów

//konfiguracja
$admin = TRUE;
$tabela_kolor1 = '#CCCCCC';
$tabela_kolor2 = '#FFFFFF';
$date_format = 'd-m-Y H:i:s';
$link_tag = ' **link**';
$www_link_dir = '/www/public/'; //katalog, dla "szybkich linków"
$www_link_prefix = 'http://twoja_domena.com/public/'; //adres, pod którym widać $www_link_dir
$no_access = 'zakaz_wjazdu'; //jeżeli taki plik istnieje i $admin = FALSE, katalog nie zostanie wylistowany
$no_access_admin = 'zakaz_wjazdu_admin'; //jeżeli istnieje, nikt nie zobaczy zawartości (to tak, zeby sobie samemu przez przypadek nie namieszać)
$forrbiden_commands = '|reboot|firstboot|whoami|'; //zakazane komendy (każda konemda musi być między dwoma znakami "|")

//koniec konfiguracji

// ini_set('display_errors', 0);

//ustalenie bierzącego katalogu
if(isset($_GET['dir'])) {
    $GLOBALS['katalog'] = $_GET['dir'];
}else{
    $GLOBALS['katalog'] = '/';
}
$dir = $GLOBALS['katalog'];
    
//tworzenie katalogu

if($auth) {
    if($admin) {
        if(isset($_POST['mkdir'])) {
            $new_folder = $dir . $_POST['mkdir'];
            mkdir($new_folder);
        }
    }
}

$command = 'ls -1a \'' . $dir . '\'';
$output0 = shell_exec($command);
$no_access = "\n" . $no_access . "\n";
$no_access_admin = "\n" . $no_access_admin . "\n";
//czy jest plik zakazu?
if($admin === FALSE) {
        if(strpos($output0, $no_access)) {
        unset($output0);
        }
}
if(strpos($output0, $no_access_admin)) {
    unset($output0);
}

if($auth) {
    if(isset($_GET['context'])) {
    if($admin) {
        if($_GET['context'] === 'file') {
            if(isset($_GET['object'])) {
                //menu pliku (....?context=file&object=...)
                if(isset($_GET['rm'])) {
                    if(unlink($_GET['object'])) {
                        echo '<pre>plik został usunięty</pre>';
                    }else{
                        echo '<pre>BŁĄD: PLIK NIE ZOSTAŁ USUNIĘTY</pre>';
                    }
                }else{
                    echo '<pre>Plik [ ' . $_GET['object'] . ' ]<hr />';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&rm=yes">[[usuń]]</a> '; // ok
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=cp">[[skopiuj]]</a> ';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=edit">[[edytuj]]</a> ';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=qlink">[[udostępnij]]</a> ';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=chmod" method="post">chmod <input name="value" type="text" size="3" maxlength="3" /><input name="submit" type="submit" value="zmień" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=file&object=' . $_GET['object'] . '&do=link" method="post"> link <input name="value" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>';
                    
                    if(isset($_GET['do'])) {
                        // tworzenie linku
                        if($_GET['do'] === 'link') {
                            $target = '/' . implode('/', explode('/', $_GET['object']));
                            if(link($target, $_POST['value'])) {
                                echo 'Utworzono link [ ' . $_POST['value'] . ' ]';
                            }else{
                                echo 'Tworzenie linku nie powiodło się.<br />';
                                echo 'Plik o takiej nazwie już istnieje,<br />';
                                echo 'Wprowadzono nie istniejący katalog,<br />';
                                echo 'Lub nie posiadasz odpowiednich uprawnień.<br />';
                            }
                        }
                        if($_GET['do'] === 'qlink') {
                            $nazwa = implode('[]', explode('/', $_GET['object']));
                            $nazwa = implode('_', explode(' ', $nazwa));
                            $target = $www_link_dir . $nazwa;
                            //echo $target;
                            if(link($_GET['object'], $target)) {
                                echo 'Został utworzony link:<br />';
                                echo '[ ' . $target . ' ]<br />';
                                echo 'plik jest dostępny pod adresem:<br />';
                                echo '[ <a href="' . $www_link_prefix . $nazwa . '">' . $www_link_prefix . $nazwa . '</a> ]<br />';
                            }else{
                                echo 'Nie usało się utworzuć linku<br />';
                                echo '[ ' . $target . ' ]<br />';
                                echo 'taki plik już istnieje, i/lub<br />';
                                echo 'ustawienia/uprawnienia nie są prawidłowe';
                            }
                        }
                    }
                    echo '</pre>';
                }
            }
        }
        if($_GET['context'] === 'dir') {
            if(isset($_GET['object'])) {
                // menu katalogu (....?context=dir&object=...)
                if(isset($_GET['rm'])) {
                    if(rmdir($_GET['object'])) {
                        echo 'Katalog [ ' . $_GET['object'] . ' ]<hr />';
                        echo '<pre>katalog został usunięty</pre>';
                    }else{
                        echo 'Katalog [ ' . $_GET['object'] . ' ]<hr />';
                        echo '<pre>BŁĄD: KATALOG NIE ZOSTAŁ USUNIĘTY<br />';
                        echo 'Prawdopodobnie nie jest pusty lub nie masz.<br />';
                        echo 'odpowiednich uprawnień';
                        echo 'Rekusywne usuwanie wiesza serwer...<br />';
                        echo 'Sprawdź swoje uprawnienia i/lub oprużnij katalog';
                    }
                }else{
                    echo '<pre>Katalog [ ' . $_GET['object'] . ' ]<hr />';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&rm=yes">[[usuń]]</a> '; //ok
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=cp">[[skopiuj]]</a> ';
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=qlink">[[udostępnij]]</a> ';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=chmod" method="post">chmod <input name="value" type="text" size="3" maxlength="3" /><input name="submit" type="submit" value="zmień" /></form>';
                    echo '<form action="'. $_SERVER['PHP_SELF'] . '?context=dir&object=' . $_GET['object'] . '&do=link" method="post"> link <input name="value" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>'; // ok
                    
                    if(isset($_GET['do'])) {
                        // tworzenie linku
                        if($_GET['do'] === 'link') {
                            $target = '/' . implode('/', explode('/', $_GET['object']));
                            if(link($target, $_POST['value'])) {
                                echo 'Utworzono link [ ' . $_POST['value'] . ' ]';
                            }else{
                                echo 'Tworzenie linku nie powiodło się.<br />';
                                echo 'Plik o takiej nazwie już istnieje,<br />';
                                echo 'Wprowadzono nie istniejący katalog,<br />';
                                echo 'Lub nie posiadasz odpowiednich uprawnień.<br />';
                            }
                        }
                        if($_GET['do'] === 'qlink') {
                            $nazwa = implode('[]', explode('/', $_GET['object']));
                            $nazwa = implode('_', explode(' ', $nazwa));
                            $target = $www_link_dir . $nazwa;
                            $komenda = 'ln -s ' . '"' .$_GET['object']. '" "' . $www_link_dir . $nazwa . '"';
                            echo $komenda;
                            if(shell_exec($komenda) === "\n") {
                                echo 'Został utworzony link:<br />';
                                echo '[ ' . $target . ' ]<br />';
                                echo 'plik jest dostępny pod adresem:<br />';
                                echo '[ <a href="' . $www_link_prefix . $nazwa . '">' . $www_link_prefix . $nazwa . '</a> ]<br />';
                            }else{
                                echo 'Nie usało się utworzuć linku<br />';
                                echo '[ ' . $target . ' ]<br />';
                                echo 'taki plik już istnieje, i/lub<br />';
                                echo 'ustawienia/uprawnienia nie są prawidłowe';
                            }
                        }
                    }
                    echo '</pre>';
                }
            }
        }
        if($_GET['context'] === 'konsola') {
            //konsola
            if(isset($_POST['command'])) {
                $test_com = explode(' ', $_POST['command']);
                $test_com2 = '|' . $test_com[0] . '|';
                if(strpos($forrbiden_commands, $test_com2)) {
                    echo 'komenda [ ' . $test_com[0] . ' ] została zablokowana<ha />';
                }else{
                    if(strpos($forrbiden_commands, $_POST['command'])) {
                        echo 'komenda [ ' . $test_com[0] . ' ] została zablokowana<ha />';
                    }else{
                        echo '<pre>wyjście z komendy ' . $_POST['command'] . '<hr />';
                        echo shell_exec($_POST['command']) . '</pre><hr />';
                    }
                }
            }
            echo '<pre><form action="' . $_SERVER['PHP_SELF'] . '?context=konsola" method="post">';
            echo 'komenda do wykonania<br />';
            echo '<input name="command" type="text" size="80" />';
            //echo '<input name="submit" type="submit" value="go" />';
            echo '</form></pre>';
            //koniec konsoli
        } //konsola
        if($_GET['context'] === 'upload') {
            echo '<pre>[upload] plik zostanie załadowany do:<br />';
            echo '[ ' . $_GET['target'] . ' ]<hr />';
            //upload
            if(isset($_FILES['plik']['name'])) {
                if(is_uploaded_file($_FILES['plik']['tmp_name'])) {
                    $zap_jako = $_GET['target'] . $_FILES['plik']['name'];
                    move_uploaded_file($_FILES['plik']['tmp_name'], $zap_jako);
                    echo 'Plik: ' . $_FILES['plik']['name'] . ' o rozmiarze ' . $_FILES['plik']['size'] . ' bajtów został załadowany';
                }
            }
            //formulaż
            echo '<form action="' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $_GET['target'] . '" enctype="multipart/form-data" method="post">'; 
            echo '<input name="plik" type="file" />';
            echo '<input type="submit" value="załaduj" />';
            echo '</form></pre>';
        }
    }
    if($_GET['context'] === 'logout') {
        //logout
        echo 'TU BĘDZIE PROCEDURA KOŃCZĄCA SESJĘ';
    } //logout
     // stopka wspólna dla wszystkich podstron z '?context'
}else{
    
    ///file explorer

//password parser
$data = explode("\n", file_get_contents('/etc/passwd'));
$i = 0;
while(isset($data[$i])) {
    $data1 = explode(':', $data[$i]);
    $GLOBALS['user'][$data1[2]] = $data1[0];
    $i++;
}
//górne menu


if($admin) {
    // konsola
    echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?context=konsola" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=konsola\',\'popup\',\'width=600,height=500,scrollbars=yes,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[konsola]]</a> '; 

// upload
    echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=upload" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=upload&target=' . $dir . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false">[[upload]]</a> ';
}else{
    echo '<pre><span class="x">[[konsola]]</span> <span class="x">[[upload]]</span> ';
}

//logout
echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=logout">[[logout]]</a></pre>';
//echo '<hr />';

//ścieżka z linkami
$dir_e = explode('/', $dir);
$i = 0;
$path = '/';
echo '<pre><a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">[root]</a>/';
while(isset($dir_e[$i])) {
    if($dir_e[$i] != '') {
        $path = $path . $dir_e[$i] . '/';
        echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $path . '">' . $dir_e[$i] . '</a>/';
    }
    $i++;
}
echo '</pre>' . "\n";

//tabela
$kolor = $tabela_kolor1;
$togle = TRUE;
$i = 0;
$output = explode("\n", $output0);
echo '<pre><table border="1" cellspacing="1" cellpadding="0">' . "\n";
while(isset($output[$i])) {
    if($output[$i] != '.') {
        if($output[$i] != '..') {
            if($output[$i] != '') {
                $file = $dir . $output[$i];
                
                $perms = fileperms($file);
                if (($perms & 0xC000) == 0xC000) {
                    // Socket
                    $info = 's';
                    $isdir = FALSE;
                } elseif (($perms & 0xA000) == 0xA000) {
                    // Symbolic Link
                    $info = 'l';
                    $isdir = FALSE;
                } elseif (($perms & 0x8000) == 0x8000) {
                    // Regular
                    $info = '-';
                    $isdir = FALSE;
                } elseif (($perms & 0x6000) == 0x6000) {
                    // Block special
                    $info = 'b';
                    $isdir = FALSE;
                } elseif (($perms & 0x4000) == 0x4000) {
                    // Directory
                    $info = 'd';
                    $isdir = TRUE;
                } elseif (($perms & 0x2000) == 0x2000) {
                    // Character special
                    $info = 'c';
                    $isdir = FALSE;
                } elseif (($perms & 0x1000) == 0x1000) {
                    // FIFO pipe
                    $info = 'p';
                    $isdir = FALSE;
                } else {
                    // Unknown
                    $info = 'u';
                    $isdir = FALSE;
                }

                // Owner
                $info .= (($perms & 0x0100) ? 'r' : '-');
                $info .= (($perms & 0x0080) ? 'w' : '-');
                $info .= (($perms & 0x0040) ?
                           (($perms & 0x0800) ? 's' : 'x' ) :
                           (($perms & 0x0800) ? 'S' : '-'));

                // Group
                $info .= (($perms & 0x0020) ? 'r' : '-');
                $info .= (($perms & 0x0010) ? 'w' : '-');
                $info .= (($perms & 0x0008) ?
                           (($perms & 0x0400) ? 's' : 'x' ) :
                           (($perms & 0x0400) ? 'S' : '-'));

                // World
                $info .= (($perms & 0x0004) ? 'r' : '-');
                $info .= (($perms & 0x0002) ? 'w' : '-');
                $info .= (($perms & 0x0001) ?
                           (($perms & 0x0200) ? 't' : 'x' ) :
                           (($perms & 0x0200) ? 'T' : '-'));

                echo '<tr bgcolor="' . $kolor . '" height="1">';
                echo '<td width="90">' . $info . '</td>';
                echo '<td align="right" width="60">' . $GLOBALS['user'][fileowner($file)] . '</td>';
                echo '<td width="50">' . filegroup($file) . '</td>';
                echo '<td align="right" width="70">' . filesize($file) . '</td>';
                echo '<td align="right" width="160">' . date($date_format, filemtime($file)) . '</td>';
                echo '<td width="220">';
                if($isdir) {
                    echo '<a href="' . $_SERVER['PHP_SELF'] . '?dir=' . $dir . $output[$i] . '/"  class="link_dir">' . $output[$i] . '/</a>';
                }else{
                    echo $output[$i];
                }
                if(is_link($file)) {
                    echo $link_tag;
                }
                echo '</td>';
                echo '<td width="60">';
                if($admin) {
                    if($isdir) {
                        if(is_link($file)) {
                            echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=slink&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                        }else{
                        echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=dir&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                        }
                    }else{
                        echo '<a href="' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '" onclick="window.open(\'' . $_SERVER['PHP_SELF'] . '?context=file&object=' . $file . '\',\'popup\',\'width=500,height=500,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0\'); return false" class="link_opcje">[opcje]</a>';
                    }    
                }else{
                    echo '<span class="x">[opcje]</span>';
                }
                echo '</td>';
                echo '</tr>' . "\n";
            }
        }
    }
    if($togle) {
        $togle = FALSE;
        $kolor = $tabela_kolor1;
    }else{
        $togle = TRUE;
        $kolor = $tabela_kolor2;
    }
    $i++;
}
echo '</table>' . "\n";
echo '<form action="' . $_SERVER['PHP_SELF'] . '?dir=' . $dir . '" method="post">Nowy folder <input name="mkdir" type="text" size="15" /><input name="submit" type="submit" value="utwórz" /></form>';
echo '</pre>';
}
}else{
    //moduł logowania
    echo 'sorry dude';
}
?>
</body>
</html>

ps. nie piszcie programow w nocy, jak juz ledwo widzicie na oczy - to sie konczy kupą czasu spędzaną na szukaniu tych brakujących przecinków apostrofów i innych pozornie nieistotnych rzeczy big_smile

25 (edytowany przez badziewiak 2010-12-28 13:34:09)

Odp: http/php manager plików

Powiem szczerze: Wspaniala robota!
Tak sie tylko zastanawiam: Mozna by tylko podmienic nazwe [[udostępnij]] na [[pobierz]]
Oczywiscie problem z serwerem pozostaje nadal, ale skrypt jest naprawde fajny!

Linksys WRT3200ACM (Gargoyle)
Linksys WRT1200AC (LEDE Luci)
Tp-link 1043NDv2 (oryginalne firmware)