Forum Webscript.Ru
		Программирование => PHP => Тема начата: sergo_stavropol от 16 Декабря 2002, 03:07:25
		
			
			- 
				PHP не выполняет команды операционной среды (Linux) 
 
 в частности, сначала обнаружил, что не сработало архивирование зааплоаденного файла
 exec("gzip -c price.xls > price.gz");
 
 а потом начал пытаться выполнить любые другие команды - тот же результат.  В чем дело? что нужно настроить? у меня root-доступ к серверу.
- 
				а что говорит при этом? секрет? или поделишься?
			
- 
				А раньше выполнял?
			
- 
				rembo 
 да ничего не говорит, просто не делает ничего
 
 gad
 раньше я просто не пользовался ими
 
 Предвижу еще один вопрос:  из командной строки в самой ОС все выполняется, в скриптах - нет
- 
				может, попробовать прописать полный путь к каталогам, где лежат эти команды?
			
- 
				apache выпускает из домашней директории?
 типа вайлик почитать в другом месте  скажем /home/bin/?
- 
				А у тебя может safemode включен? Посмотри phpinfo();
			
- 
				круто
 одинаковые ответы в одинаковой последовательности
 http://phpclub.net/talk/showthread.php?s=&threadid=27851
- 
				safe_mode = off
 
 функция  posix_geteuid ();
 вернула мне "nobody"  - стало  ясно, что тут собака порылась.
 с другой стороны,  не совсем понял, что делает эта функция - выявляет того, кто выполнил скрипт или того кто его создал
 
 ls -l говорит, что создал его я, а не nobody
- 
				хотя я посмотерл phpinfo на других серверах - у всех USER/GROUP = nobody...
 
 и еще что я заметил: все что я пробовал раньше - это команды, которые записывают файлы на сервер. Сделал
 "exec ("ls"); - получилось.  Следовательно, нету прав...
 Права у скрипта, который содержит команды OS: -rwxr-xr-x ,
 на папку в котрой он лежит: drwxr-xr-x
 
 Мужики, если я во что-то туго втыкаюсь, то сорри - я совсем не знаю UNIX, но вот обстоятельства сложились так что нужно втыкаться. и как можно скорее.. так что если сморожу какую глупость или юуду тормозить - поймите правильно...
- 
				Я тоже в юниках не очень секу, но всё же: попробуй поставить права доступа 777.;)
			
- 
				не нада так ставить!
			
- 
				все, спасибо, со всем справился. 
 на папку в которой  я делал всякие exec("gzip.."), exec("cp..") сменил owner\'a
 chown Myusername.nobody /home/../folder - то есть дал группе nobody как владельцу php и запускателю Апача побольше прав на эту папку.
 
 Права на нее сделал drwxrwxrwx (ну а по-другому ведь никак)
 
 отсюда вытекает следующий вопрос:
 если все смогут в нее писать (так как последняя группа rwx), то это же наводит на соответствующие мысли...
 если бы туда писались неисполняемые файлы - это еще полбеды,  но они не могут быть неисполняемыми, так как в них эти пресловутые команды OC.
 
 то есть, юзер сможет залить туда php или cgi скрипт  с какой-нибудь гадостью и выполнить его...
 
 конечно, чтобы пользователь попал на страницу с формой для закачки файла,  ему нужно будет авторизоваться, но во-первых, бывают случаи, когда авторизацию обходят :), а во -вторых, теоритечески обладатели логинов и паролей для авторизации тоже могут оказаться любителями "повзламывать что-нибудь"  В этой связи я даю при закачке  файлу  принудительно имя price.xls, но вот недавно прочитал в хакере, что и это легко обходят: не помню о чем там шла речь, но в общем, проверку на расширение обошли кажется с помощью перлового символа "конец строки"
 
 может,  стоит тему  отдельную создать по  этому вопросу ?
- 
				а зачем на эту папку x?
 хотя РНР выполнится и без х.
 а у тебя что - эта папка под корнем веб-сервера?
 Не приходила мысль расположить ее повыше?
- 
				RomikChef 
 
 мне нужно чтобы после закачки файла он (файл) попадал в директорию, доступную через веб, так как он должен скачиваться пользователями
 
 если я положу его вне /htdocs,  то никто ведь его скачать не сможет
- 
				а что после сжатия файл можно скопировать - это тебе в голову не приходило?
			
- 
				в принципе, наверное можно сделать так: 
 
 upload в /tmp/
 потом
 
 if ($userfile_name == "price.xls") {
 exec ("cp  /home/htdocs/filesfolder/price.xls");
 }
 
 главное чтобы  "cp"  этот скрипт выполнил
- 
				RomikChef 
 
 это ты имел в виду?
 
 правда в моем случае не после сжатия его надо копировать, а после upload\'a, а потом уже когда в директорию /htdocs/filesfolder/ он лег, его gzip-нуть
 
 ок, сделали мы так... какие-то варианты взлома у тех  кто файл загружает остались? могут они под именем price.xls какую-то каку подсунуть?
- 
				[OFF]кстати, а почему интересно на форуме частенько таблица стилей слетает? я разными броузерами юзал - и во всех это бывало[/OFF]
			
- 
				я имел в в виду команду php - copy
 
 В твоем случае надо сначала скопировать в
 /arcfolder
 там сжать
 и потом скопировать в /htdocs/filesfolder/
 
 Хотя сейчас я думаю, что можно вообще обойтись одной командой.
 gzip -c $_FILES[\'userfile\'][\'tmp_name\'] > /htdocs/filesfolder/price.gz");
 
 и все.
- 
				если я положу его вне /htdocs, то никто ведь его скачать не сможет 
 Почему? Файл можно выдавать скриптом - иди в поиск по форуму.