PDA

View Full Version : تغییر permission پوشه ها با php



tehro0n
جمعه 15 دی 1391, 14:30 عصر
سلام،
من با دستور

chmod($file, 0755);
می تونم پرمیشن فایل ها رو تغییر بدم، اما ایجاد یک فایل جدید نیاز به پرمیشن 777 آن پوشه داره که خوب این کار رو نمی تونم با پوشه انجام بدم و دستی باید تغییر داد، با چه دستوری تو php پرمیشن پوشه 777 میشه؟

2undercover
جمعه 15 دی 1391, 17:38 عصر
با همین تابع chmod هم می تونید همین کار رو انجام بدید فقط دقت کنید که آخر آدرس یک "/" قرار بدید تا به عنوان پوشه شناخته بشه!

البته اینم رو هم اضافه کنم: و خداوند Search را آفرید: تغییر Permission پوشه (http://stackoverflow.com/questions/5125523/is-there-a-way-to-change-folder-permissions-from-php-without-using-ftp)

tehro0n
شنبه 16 دی 1391, 14:41 عصر
این نمونه رو دیدم اما چون کار نکرد گفتم شاید چیز دیگه ای هم باید اضافه کنم
با این حال پوشه من پرمیشنش تغییر نکرد، در این شاخه ای که فایل php قرار داره قراره پوشه beta پرمیشنش تغییر کنه و من اینجوری استفاده می کنم

chmod('/beta/', 0777);
اما خوب تغییر نمی کنه! فایل های txt تغییر می کنن!
اینجوری هم استفاده کردم نشد

chmod('beta/', 0777);

eshpilen
شنبه 16 دی 1391, 15:26 عصر
دو مورد وجود داره.
یکی اینکه به تابع مورد نظر شیرفهم کنید که میخواید پرمیشن خود دایرکتوری رو تغییر بدید، نه فایلهای داخلش.
در این مورد بنده نکته ای به یاد ندارم و باید عملا تست کنم ببینم این سینتاکس کار میکنه یا نه.
مورد دیگر اینکه باید ببینید Owner اون دایرکتوری که میخواید پرمیشنش رو تغییر بدید کیه. طبیعتا اگر Owner، کاربری که برنامهء PHP شما تحت اون اجرا میشه نباشه، نمیتونید پرمیشن اون دایرکتوری رو تغییر بدید. مثلا در پنل های وب هاستها که هست، مثلا سی پنل، دایرکتوری هایی که از قبل موجود بودن یا توسط کاربر ولی از طریق پنل مدیریت هاست ایجاد شدن، Owner خاص خودشون رو دارن.
یک تستی که میتونید بکنید اینه که یک دایرکتوری توسط خود PHP ایجاد کنید (با تابع mkdir) و بعد تست کنید ببینید میتونید پرمیشن اون رو هم با PHP عوض کنید یا نه.

نکته: توجه کنید که روی بعضی هاستها بعلت مسائل امنیتی ممکنه این دسته توابع رو بسته یا محدود کرده باشن.

tehro0n
شنبه 16 دی 1391, 20:52 عصر
نه این سروره و دست خودمه، من خیلی دلم می خواد بهش حالی کنم ولی حالیش نمیشه :)
یه موضوعی هم هست، اگه فایل های داخل پوشه ها رو هم خود برنامه بسازه ( که این مستلزم پرمیشن 777 هست) در این صورت پرمیشن فایل ها رو میشه تغییر داد، ولی اگر خودمان دستی از قبل فایلی رو ساخته باشیم اون رو هم با chmod نمیشه تغییر داد..
نمی دونم چرا..!

MMSHFE
شنبه 16 دی 1391, 21:48 عصر
ضمن تشکر از نکته ای که eshpilen گفت، ابتدا با این کد ببینید صاحب فایل کیه؟!


$stat = stat($path);
print_r(posix_getpwuid($stat['uid']));

بعد درصورت لزوم با chown صاحبش رو تغییر بدین. البته قبلش بینید کاربری که PHP شما تحت اون اجرا شده چیه. کلاً وقتی مالک فایل/پوشه نیستین، نمیتونید سطح دسترسیش رو تغییر بدین.

MMSHFE
شنبه 16 دی 1391, 22:33 عصر
راستی یه نکته هم یادم رفت، با دستور زیر اگه سرورتون لینوکس هست، میتونید ببینید PHP تحت چه کاربری اجرا شده و با chown صاحب پوشه یا فایل رو به اون کاربر تغییر بدین:

$user = exec('whoami');
موفق باشید.

tehro0n
یک شنبه 17 دی 1391, 11:31 صبح
Array ( [name] => arman [passwd] => x [uid] => 503 [gid] => 504 [gecos] => [dir] => /home/arman [shell] => /bin/bash )
نام این پوشه ای که در آن قرار است پوشه جدید درست شود هم درسته، این کار رو با همین دستوری که فرمودید انجام دادم


$stat = stat(dirname(__FILE__));
print_r(posix_getpwuid($stat['uid']));

خوب من چیزی که الان متوجه شدم اینه که این پوشه ای که هستیم 777 نبوده که نتونسته توش پوشه بسازه و وقتی 777 کردم پوشه رو ساخت و UID رو به apache تغییر داد اما پرمیشن ها رو انجام میده و فایل و پوشه را هم میسازه
حالا دو تا چیز برام مبهمه:
1- آیا این uid اگه apache باشه مشکلی ایجاد میکنه؟
2- پوشه قبلی رو چیکار کنم که از 777 در بیاد :لبخند: من به این دلیل دارم پرمیشن این پوشه رو عوض می کنم که چیزی توش ریخته نشه حالا اگه قبلی هم بخواد 777 بمونه که فایده نداره !

tehro0n
دوشنبه 18 دی 1391, 11:14 صبح
:متفکر: :متفکر:

tehro0n
سه شنبه 19 دی 1391, 10:27 صبح
به نظر میرسه که راه حلی برای این مورد نیست
خوب حالا بفرمایید در آخر php مقدار بافر داده شده به رم برای آرایه ها پاک میشن یا باید از unset برای آرایه های زیاد استفاده کنیم؟ دنبال این هستم که ببینم بار اضافی رم از چی هست

MMSHFE
سه شنبه 19 دی 1391, 19:52 عصر
بعد از اتمام کار هر اسکریپت، تمام حافظه اختصاص داده شده به اون آزاد میشه و در اجرای بعدی، دوباره متغیرها ساخته میشن. حتی سشنها در پایان اسکریپت از RAM حذف میشن و با اجرای مجدد، دوباره از فایل سشن، خونده میشن و توی RAM قرار میگیرن.