Create folder in www directory using PHP on UBUNTU - php

Im trying to create a folder (inside www directory) using php script. I did some configurations on UBUNTU, but still not working.
Ubuntu configuration: (user: admin - group: www-data)
sudo adduser admin www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www
PHP code:
function makeDir($dir)
{
$ret = #mkdir($dir, 0700);
return $ret === true || is_dir($dir);
}
Error: Don't create directory.
Reading some other posts, i found this UBUNTu configuration, but still not works:
sudo chmod 777 /var/www
sudo ls -l /var | grep www
sudo usermod -G www-data admin
sudo chmod 770 /var/www
sudo ls -l /var | grep www

Try this:
shell_exec("md $dir");

It usually depends on what user & group the httpd is running with, and if using cgi or apache mod method. The apache's user needs access to create the directory. My solution - usually - is to allow write access to the group. eg running with nobody (the last line sets file access rights)
chown -R :nobody *
chmod -R 770 *
find . -type f -print0 | xargs -0 chmod 640
After this you can simply create directories & files from within php, but you probably need/want to change their rights so you can 'manually' access them when needed via the hosting account.

Related

AWS - Changed Permission of All files to ec2-user and wordpress is not uploading or owning any files now

I was not able to upload any files in filezilla.. so i changed permission of all files under /var/www/html to ec2-user
I ran this command - chown -R ec2-user /var/app/current
After that Filezilla was working but it burnt the apache.
Now wordpress doesnt create any files in wordpress directory. It says it doesnt have any permission. I guess i killed permission of apache on those files. How can revert back the changes? or atleast how can i give the permissions back as it was?
Add ec2-user to apache group :
sudo usermod -a -G apache ec2-user
Logout and Re-login to instance
Change the group ownership of /var/www and its contents to the apache group.
sudo chown -R ec2-user:apache /var/www
To add group write permissions and to set the group ID on future subdirectories, change the directory permissions of /var/www and its subdirectories.
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
To add group write permissions, recursively change the file permissions of /var/www and its subdirectories:
find /var/www -type f -exec sudo chmod 0664 {} \;
Pleae Refer to this AWS Documentation

How do I set write permissions for a directory in AWS for ec2-user?

I have created an instance in AWS with Red Hat Enterprise Linux Server release 7.2 (Maipo) and also install PHP on this server.
I have given permission using this command
chown -R apache:ec2-user /var/www/html/ and also give this permission chmod -R 777 /var/www/html/image
but folder is not writable this directory /var/www/html/image
Please suggest how can I make the image folder writable.
First of all check the directory permission by running the following command on terminal:
stat -c '%A %a %n' *
It will give the directory permission like:
-rw-r--r-- 644 \
drwxrwxr-x 775 Code Backup
drwxr-xr-x 755 Desktop
drwxr-xr-x 755 Documents
And again try to change the permission by sudo like:
sudo chown -R apache:ec2-user /var/www/html/
sudo chmod -R 777 /var/www/html/image
Note: you must have the rights to change the permission, that's why I added sudo (Super User)
run this flowing command on terminal.
setenforce 0
nano /etc/sysconfig/selinux
SELINUX=disabled

How to fix Error: laravel.log could not be opened?

I'm pretty new at laravel, in fact and I'm trying to create my very first project. for some reason I keep getting this error (I haven't even started coding yet)
Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423
I've read this has something to do with permissions but chmod -R 775 storage didn't help at all.
Never set a directory to 777. you should change directory ownership. so set your current user that you are logged in with as owner and the webserver user (www-data, apache, ...) as the group.
You can try this:
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
then to set directory permission try this:
chmod -R 775 storage
chmod -R 775 bootstrap/cache
Update:
Webserver user and group depend on your webserver and your OS. to figure out what's your web server user and group use the following commands. for nginx use:
ps aux|grep nginx|grep -v grep
for apache use:
ps aux | egrep '(apache|httpd)'
Never use 777 for directories on your live server, but on your own machine, sometimes we need to do more than 775, because
chmod -R 775 storage
Means
7 - Owner can write
7 - Group can write
5 - Others cannot write!
If your webserver is not running as Vagrant, it will not be able to write to it, so you have 2 options:
chmod -R 777 storage
or change the group to your webserver user, supposing it's www-data:
chown -R vagrant:www-data storage
To fix this issue, you need to change the ownership of the directory to the unix user that the webserver uses.
Get out of the VM
Using the console, go to your synced folder (vagrant)
sudo chown -R $USER:www-data storage
chmod -R 775 storage
Even though I created the project within the VM using the VM user, the folder belonged to the user in the real computer; so, when trying to
Now it's working.
Thanks to all those that helped me figure this thing out
EDIT:
Actually, it still wasn't working, it still gave me a "permission denied" problem.
Here's what I did, I modified my Vagrantfile like this:
config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]
It also may be SELinux. (Centos, RedHat)
Determine status of SElinux on terminal:
$ sestatus
If status is enabled, write command to disable SElinux
$ setenforce Permissive
Or you may execute this command
$ sudo setenforce 0
You need to adjust the permissions of storage and bootstrap/cache.
cd into your Laravel project.
sudo chmod -R 755 storage
sudo chmod -R 755 bootstrap/cache
You can try 777 if 755 doesn't work. 777 is not secure though!
Depending on how your web server is setup, you may be able to be more specific with your permissions, and only grant them to your web server user. Google WEB SERVER NAME Laravel file permissions for more information.
At the time of writing, this is for Laravel 5.4
It might be late but may help someone, changing directory permissions worked for me.
Assuming that your Laravel project is in /var/www/html/ directory. Goto this directory.
cd /var/www/html/
Then change permissions of storage/ and bootstrap/cache/ directories.
sudo chmod -R 775 storage/
sudo chmod -R 775 bootstrap/cache/
If permission 775 does not work, try setting 777. (Warning! This is the most relaxed permission, use with care).
sudo chmod -R 777 storage/
sudo chmod -R 777 bootstrap/cache/
cPanel: If you are on cPanel and don't have terminal available you can change permission by right clicking on the mentioned directory and it's sub-directories.
Add to composer.json
"scripts": {
"post-install-cmd": [
"chgrp -R www-data storage bootstrap/cache",
"chmod -R ug+rwx storage bootstrap/cache"
]
}
After composer install
Run following commands and you can add sudo at starting of command depends on your system:
chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache
1- ‍The nginx user and php-fpm user and app owner-user must be the same:
run command sudo vi /etc/nginx/nginx.conf change like bellow:
user nginx nginx;
run command sudo vi /etc/php-fpm.d/www.conf change like bellow:
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
then restart nginx and php-fpm service
run below command
sudo chown nginx:nginx -R "your_project_path"
2- change file SELinux security context by run the following commands in the project path
chcon -R -t httpd_sys_content_t .
chcon -R -t httpd_sys_rw_content_t .
For all Centos 7 users on a Laravel context, there is no need to disable Selinux, just run these commands:
yum install policycoreutils-python -y # might not be necessary, try the below first
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache
restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules
Lastly, make sure your hosts, ips and virtual hosts are all correctly for remote accessing.
Selinux is intended to restrict access even to root users, so only the necessary stuff might be accessed, at least on a generalist overview, it's extra security, disabling it is not a good practise, there are many links to learn Selinux, but for this case it is not even required.
If you use cmd
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
If you use GUI
First go to the project and right click on the storage and check the properties and go to the Permissions tab
Change the permissions using below code
sudo chmod -R 777 storage
Then your file properties may be
Then check your settings and execute laravel command it will work :)
I stuck on this issue tried different commands but these will help to solve the problem
php artisan route:clear
php artisan config:clear
php artisan cache:clear
Hope it's helped others too.
Just run the following command from Project root Directory -
sudo chmod -R 775 storage
sudo chown -R $USER:www-data storage
In Laravel, you should set ACL on storage and cache directory so that web server user can read/write on the directory. Open a new terminal and run following:
HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1)
sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
References:
https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd
https://linux.die.net/man/1/setfacl
Maximum people's are suggesting to change file permission 777 or 775, which I believe not an appropriate approach to solve this problem. You just need to change the ownership of storage and bootstrap folder.
In below Image you can see all my files/folder are under the root user(except storage and bootstrap, because I changed the ownership ),but I logged in as a administrator(before changing ownership) that's why it always giving permission denied. So I need to change the ownership of this two folder to administrator
So how I did this,
go to your project directory and run below commands.
sudo chown -R yourusername:www-data storage,
sudo chmod -R ug+w storage,
sudo chown -R yourusername:www-data bootstrap,
sudo chmod -R ug+w bootstrap
try this
cd /var/www/html
setenforce 0
service httpd restart
This is what I do if I'm running Apache:
sudo chown -R $USER:www-data my_laravel_project/
sudo chmod -R 775 my_laravel_project/storage
sudo chmod -R 775 my_laravel_project/bootstrap/cache
cd my_laravel_project
php artisan optimize:clear
This solution is specific for laravel 5.5
You have to change permissions to a few folders:
chmod -R -777 storage/logs
chmod -R -777 storage/framework
for the above folders 775 or 765 did not work for my project
chmod -R 775 bootstrap/cache
Also the ownership of the project folder should be as follows (current user):(web server user)
I managed to fix it as I was only granting permission to via this command:
Copy Code
sudo chmod -R 775 storage
The fix was to add this:
Copy Code
sudo chmod -R ugo+rw storage
I wasn't too keen on changing my folder permissions to 777. Here's how I went about fixing this issue.
First, I changed the user who is running the web server on my local machine(I run nginx, but the principles apply everywhere):
$> sudo vim /etc/nginx/nginx.conf
user <my_user> #inside nginx.conf
service nginx reload
Afterwards, I created another index.php file under the public/ folder to find out who was running my php-fpm version and where I would go about changing that:
<?php
phpinfo();
?>
Reloading the page, I found out that www-data was the user(under the environment section). I also found out I was running php 7.1. I proceeded to change the user:
$> sudo vim /etc/php/7.0/fpm/pool.d/www.conf
#Look for www-data or the following variables: user, group, listen.user, listen.group.
Finally, I gave the following permissions to folders:
sudo chmod -R 775 ./storage/
Now, I made sure that I was the owner of the folders by using a simple:
ls -al
If you set the server and php-fpm users to yourself and the folders are owned by root for example, then you will keep encountering this issue. This can happen if you did a sudo laravel new <project> as root. In that case, make sure you use a recursive chown command on your project to change the user:group settings. In most default cases, www-data is the main setting for the server and php, in that case it's a matter of making sure the folder isn't out of www-data's reach.
My project is setup in my home directory. On Ubuntu 16.04 and Laravel 5.5.
In my particular case I had a config file generated and cached into the bootstrap/cache/ directory so my steps where:
Remove all generated cached files: rm bootstrap/cache/*.php
Create a new laravel.log file and apply the update of the permissions on the file using:
chmod -R 775 storage
Tried anything suggested here without success.
What worked for me was:
sudo chmod -R ugo+rw storage
sudo chmod -R ugo+rw storage/logs
In Linux
sudo chown -R www-data:root /var/www/name-project-Laravel
sudo chmod 755 /var/www/name-project-Laravel/storage
In Centos & Rockylinnux
chown root:nginx FOLDER_PROJECT -Rf
chmod 775 FOLDER_PROJECT -Rf
cd FOLDER_PROJECT
chmod 777 storage -Rf
setenforce 0
please rate :)
Mac OS solution
I fixed this problem simply by giving the necessary permission to my folders.
Right Click on the logs folder and click on Get Info
At the bottom, you will see Sharing & Permissions. Now give Read & Write access to the folder.
Follow the attachment.
Next step👇🏻
as you probably already know this issue is caused due to absence of write permission on the log folder which is a sub folder of storage.
To solve this problem walkedthrough these sequence of steps
Update composer
sudo composer self-update
Change storage folder write permission
sudo chmod -R ugo+rw storage
Now storage folder should have permission drwxrwxrwx
To check permissions run the following command from project root
ls -l
Also if you face the following error after the step above
ErrorException chdir(): No such file or directory (errno 2)
Just create a folder named public on the project root folder using
sudo mkdir public
ps. For more information about the chmod commands check this
below command would work for sure.
sudo chmod -R ugo+rw storage
Not write any command or not gives any permission simplest way to solved this issue
just restart your system and try it again
it's work for me

How to write commands in filezilla using ssh OR using it with putty

I need to write a command:
su -
and get root access, but I don't know where or how to write commands in filezilla program, is there anyway to write that command using PUTTY, and then using filezilla make file edit?
Connect with putty.
do su
then use vi/nano or any other editor to edit the file.
vi filename / nano filename
Try this to fix your uploaded file permissions:
Login to SSH
Add yourself to www-data group
sudo usermod -a -G www-data "$USER"
Then change the owner of the files to that user:
** Correct previously created files: **
sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;
Now when you upload you wont have issues. Dont use root to do your uploads, create a new user that is part of the www-data group.

Enabling write permissions Ubuntu Server in var/www/image directory

I'm trying to get my php test upload script to work and was wondering what the command would be to allow files to be uploaded in ubuntu server in the var/www/image directory
What username will be uploading the files? Usually on Ubuntu the Apache web server username is www-data. You can check for sure by finding the web server process in a process list command and seeing which username under which it is running.
ps aux | grep apache or ps aux | grep httpd should give you that answer.
Then you will usually want to make that Apache username the owner of the directory and all files and directories within it:
cd /var/www/image
# recursively (all subdirs & files) set owner to www-data for current directory
chown -R www-data .
Ordinarily, the above should be enough, but if for some reason the directory, files or subdirectories do not have write permission for the owner username, that's easily fixed by changing the permissions to add that write access, like this:
cd /var/www/image
# recursively add "w"rite permissions for the "u"ser (owner) to current directory
chmod -R u+w .
cd /var/www/image
For file like image you don't need execution permission :
sudo chmod 664 *
If you have directories inside image and you want to apply permission :
sudo find . -type d -exec chmod 755 "{}" \;
This will recursively search your directory and chmod 755 all directories only.
Similarly, the following will chmod all files only (and ignore the directories):
sudo find . -type f -exec chmod 644 "{}" \;
File name with space case (thanks to Nicklas B)
find . -type f -print0 | xargs -0 chmod 644
Change edit group to www-data
chown -R (owner):www-data (folder)
And folder permission to 775
cd /var/www
sudo chmod 775 image
You'll be prompted to enter the admin password - do so, and hit [return].
Change edit group may solve most of the problems of permissions.
Changing do www-data and set permission to 775.

Categories