Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] system a cd
marekge
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 8
Dołączył: 3.05.2011

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Jeżeli chcesz otworzyć katalog wyższy niż ten w którym aktualnie jesteś to raczej .. a nie \\
Go to the top of the page
+Quote Post
marekge
post
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 8
Dołączył: 3.05.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
zegarek84
post
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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 /
Go to the top of the page
+Quote Post
darko
post
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) tylko nie nazywałbym tego głównym katalogiem ftp.
Go to the top of the page
+Quote Post
abort
post
Post #6





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Pod Linuksem wystarczy samo "cd", bez parametrów.
Dotyczy to zarówno połączenia via ftp, jak i shella.
Go to the top of the page
+Quote Post
marekge
post
Post #7





Grupa: Zarejestrowani
Postów: 70
Pomógł: 8
Dołączył: 3.05.2011

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Zapewne Twój użytkownik działa w środowisku jakiejś ograniczonej powłoki (np. rbash).
Go to the top of the page
+Quote Post
abort
post
Post #9





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Mać... alem ślepy.
Krótka odpowiedź: nie, nie tędy droga. Tędy się nie da (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.

Ten post edytował abort 23.11.2011, 23:27:41
Go to the top of the page
+Quote Post
zegarek84
post
Post #10





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
marekge
post
Post #11





Grupa: Zarejestrowani
Postów: 70
Pomógł: 8
Dołączył: 3.05.2011

Ostrzeżenie: (0%)
-----


@abort
Dzięki za świetne wytłumaczenie tematu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 06:14