Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] system a cd
Forum PHP.pl > Forum > Przedszkole
marekge
Hej,

Próbowałem w prosty sposób powrócić do głównego katalogu FTP za pomocą funkcji system.
Niestety poniższy kod:
  1. <?php
  2. system("cd \\");
  3. system("ls");
  4. ?>

Listuje katalogi z /public_html/ a nie z /
Próbowałem również różnych kombinacji z odwrotnymi slashami i również nie przynosi to rezultatu...
W czym popełniam błąd?
Fifi209
Jeżeli chcesz otworzyć katalog wyższy niż ten w którym aktualnie jesteś to raczej .. a nie \\
marekge
Chcę się dostać do najbardziej nadrzędnego katalogu do jakiego mogę ale siłą rzeczy jest to o jeden wyżej niż public_html.
Próbowałem wcześniej podanego przez Ciebie rozwiązania i też listuje pliki z public_html
zegarek84
na linuxie mi działa wyświetlanie plików ze wskazanego katalogu w konsoli...
z katalogu wyżej:
Kod
ls ..

z głównego
Kod
ls /
darko
Jaki system? Jeśli linux to spróbuj
cd ~
przeniesie do folderu domowego bieżącego użytkownika, natomiast
cd /
to tak, jakbyś na windowsie kliknął w mój komputer smile.gif tylko nie nazywałbym tego głównym katalogiem ftp.
abort
Pod Linuksem wystarczy samo "cd", bez parametrów.
Dotyczy to zarówno połączenia via ftp, jak i shella.
marekge
Panowie niestety przed napisaniem tego tematu sprawdziłem wszystkie z proponowanych przez was rozwiązań i żadne nie działało.
Co więcej sprawdziłem to na kilku linuksowych serwerach i cd nigdy nie działa. Co ciekawe takiej polecenia jak tar, uptime, ls czy whoami działają wszędzie bez problemu.
Obawiam się więc że to nie wina składni, a samej funkcji system? może system() nie pozwala na korzystanie z dobrodziejstw CD ?
Crozin
Zapewne Twój użytkownik działa w środowisku jakiejś ograniczonej powłoki (np. rbash).
abort
Mać... alem ślepy.
Krótka odpowiedź: nie, nie tędy droga. Tędy się nie da smile.gif

Po pierwsze, należy wytłumaczyć, na czym polega wywołanie z PHP polecenia system($command), a także na czym polega wywołanie polecenia w Luniksie (i uniksach w ogólności). Załóżmy, że z procesu A chcemy wywołać nowy proces B (u Ciebie jako A występuje Apache+PHP, a jako B to co masz w $command, czyli w tym konkretnym przypadku "cd"). Otóż: wywołanie polecenia potomnego polega (w dużym uproszczeniu, ale na nasze potrzeby wystarczy) na:
1. stworzeniu kopii wszystkich zmiennych w systemie. Pisząc "w systemie" mam na myśli te zmienne, które "zna" proces A. Oczywiście piszę o zmiennych systemowych Linuksa, czyli np. łapie się zmienna $PATH (domyślna ścieżka poszukiwań binarek). Niekoniecznie muszą zostać przekazane zmienne $_SERVER i podobne (choć zapewne gdzieś to można ustawiać - nie wiem, nie testowałem).
2. Jeśli polecenie zaczyna się od "/", to oznacza podanie pełnej ścieżki do pliku - Apache przez polecenie system() to wykona.
3. Jeśli polecenie nie zaczyna się od "/", to zaczyna się próba jego lokalizacji w każdym katalogu wyszczególnionym w zmiennej $PATH i możliwe, że jest to robione via shell - czyli Apache uruchamia shella (np. bash), a ten dopiero sam wykonuje czarną robotę
4. Polecenie B może próbować zmieniać wartość SWOICH zmiennych - ale nie będzie nigdy w stanie zmodyfikować zmiennyh procesu A. Tak się nie da smile.gif Czyli: nawet gdyby cd się wykonało, to i tak nie ma to wpływu na to, co widzi Apache+PHP. Oczywiście z plikami (tworzeniem/kasowaniem) jest inaczej - zarówno A i B mają dostęp do systemu plików i tylko kwestia ścieżek i/lub praw dostępu mogą spowodować brak dostępu do pliku, bo domyślnie pliki tworzy system plików, i procesy mają (bo muszą) mieć dostęp do funkcji systemowych. No chyba że operujemy na systemie zamontowanym read-only, wtedy wiadomo, że się nie da.

Możesz sprawdzić, czy polecenie się wykonało pozytywnie, czy nie - możesz użyć
Kod
string system ( string $command [, int &$return_var ] )

w $return_var będziesz miał jakąś wartość zwrotną - porównaj tę wartość po wykonaniu obu poleceń.

Poza tym, to osobiście wątpię, by polecenie system ("cd /") się wykonało. Z tej prostej przyczyny, że... cd nie jest poleceniem systemu, tylko POWŁOKI (shella).
Kod
[user@host ~] $ which cd
[user@host ~] $ which ls
/bin/ls
[user@host ~] $ which tar
/bin/tar
[user@host ~] $ which whoami
/usr/bin/whoami


A co do tego, że "ls /" jest u Ciebie równoważne "ls /public_html"... no cóż. Być może Apache jest uwięziony w chroot'cie (poczytaj o tym, warto) i po prostu tego się nie da zrobić. Ale teraz to naprawdę gdybam - nie wiem, czy da się tak chrootować Apacha, by dało się serwować strony użytkowników i by te strony też były "uwięzione" w katalogu użytkownika - tu musiałaby być jakaś silna interakcja chroota z mod_userdir...

Ech, rozpisałem się, ale mam nadzieję, że czytelnie.
zegarek84
wydaje mi się (nie będę dziś pisał. że na 100% gdyż ostatnio nawet z wyrażeniami regularnymi jakoś się pomyliłem), że jednak nie wszystko było próbowane to co tu napisane... a przez polecenie system() wywoływana jest od nowa powłoka shel'a/bash'a więc nic dziwnego, że przy kolejnym wywołaniu nie widzisz efektu cd .. - musiałbyś odpalić skrypt .sh lub inny skrypt konsolowy choćby php gdyż to nie wieli problem w cli...
marekge
@abort
Dzięki za świetne wytłumaczenie tematu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.