Здравейте приятели!
Често в форума виждам нови потребители в линъкс идващи от света на уиндолс да задават въпроси от рода:
1. Защо copy или moving функциите не работят в php?
2. Защо влизам в определени директории, но не мога да едитвам определени файлове?
3. Защо през netbeans мога да пиша там, а през моят файлов менаджър номера не минава и т.н и т.н...
Целта на този кратък урок е да ви обясня основни положения в линъкс и правата в/у директориите, под-директориите и файловете в тях.
Няма да се спирам в детайли за правата в линъкс, има страшно много how to информация в мрежата.
1. Виждам много потребители от форума да съветват ами дай направо - chmod 755 /var/www -R и всичко ще проработи.
Да това е така, но системата по този начин почва да прилича на уиндолс, което на мен не ми харесва и затова ще ви покажа моят начин.
2. Допускам, че вече имате инсталиран линъкс стака LAMP ( Linux, Apache, MySQL, PHP )
3. Допускам, че имате основни познания какво е "terminal" и как се листват директориите и файловете през него.
Има и GUI инструменти, чрез които можете да правите всичко това, но тук ще го правим през терминала на системата.
4. Всичките команди се run-ват под CentOS, така че те са валидни за CentOS / Fedora / RedHat потребителите.
Може и да има известно разминаване з потребителите на Debian / Ubuntu и някои други дистрибуции на линъкс, ако има то няма да е голямо.
5. Ще работим с 3 различни потребителя имащи различни права в/у /var/www/html директорията.
6. След инсталиране на всяка една linux desktop дистрибуция, след рибуутването и,тя ви дава възможност да създадете desktop потребител. В моят случай той се нарича - "jazzman"
7. След инсталиране на LAMP стака, линъкс автоматично създава потребител с име "apache" при CentOS/Fedora/RedHat, чийто права са да може да пише, чете, изпълнява скриптове root директорията на сървъра, при мен е /var/www/html. За потребителите на Debian/Ubuntu този юзър мисля, че се нарича "www-web" или "www-data" не съм сигурен, както и това
че техният root server folder е /var/www защо е така не ме питайте, това също е едно голямо недомислие в линъкс, както и различните пакетни системи и техните инсталатори.
8. Ще създадем и трети потребител с име - dummy, но това в края на урока.
1. Първото нещо е да разберем кои са валидните имена на потребители в системата. За целта отварям терминала и run-вам следният скрипт:
[jazzman@localhost]$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3 }' /etc/passwd
username: root uid:0
username: bin uid:1
username: daemon uid:2
username: adm uid:3
username: lp uid:4
username: sync uid:5
username: shutdown uid:6
username: halt uid:7
username: mail uid:8
username: uucp uid:10
username: operator uid:11
username: games uid:12
username: gopher uid:13
username: ftp uid:14
username: nobody uid:99
username: dbus uid:81
username: usbmuxd uid:113
username: avahi-autoipd uid:170
username: vcsa uid:69
username: rpc uid:32
username: rtkit uid:499
username: abrt uid:498
username: nscd uid:28
username: haldaemon uid:68
username: apache uid:48
username: nslcd uid:65
username: saslauth uid:497
username: postfix uid:89
username: avahi uid:70
username: ntp uid:38
username: rpcuser uid:29
username: nfsnobody uid:65534
username: pulse uid:496
username: gdm uid:42
username: sshd uid:74
username: tcpdump uid:72
username: jazzman uid:500
username: mysql uid:27
username: dummy uid:501
В случая ни интересуват - "apache", "jazzman" и "dummy" (който е създаден последен).
2.Второто нещо след като имате всичко това на лице е да създадете новата директория където ще бъде вашият php проект, аз ще го нарека - permission.
Ако аз се опитам да създам този фолдър от мое име (jazzman), аз ще получа съобщение за отказани права, че нямам работа в server root folder - което е супер

Някой ще каже........абе влез като root и давай 777 с рекурсуя в края и нямаш проблем - това е много лоша практика, както писах по-горе.
Идеята е да се запази пермишъна в/у основната директория и да се дадат права само за тази под-директорията.
Какво правя аз:
Влизам като root и създавам директорията с име permission.
Командата е : mkdir /var/www/html/permission -p
Ако искаме да видим какви са правата в/у нея изпълняваме
ls -la /var/www/html/permission
Results:
drwxr-xr-x 2 root root 4096 Nov 24 15:06 .
drwxr-xr-x. 12 root root 4096 Nov 24 15:06 ..
Няма да се спирам в подробности какво означават всички тези букви, но ако се опитам от името на jazzman да създам нов файл в нея, вижте какво ще получа:
[jazzman@localhost ~]$ touch index.php /var/www/html/permission/
touch: setting times of `/var/www/html/permission/': Permission denied
touch: cannot touch `index.php`: Permission denied
С други думи, никой освен root или тези които са от групата на root могат да пишат вътре - ами супер, ами сега какво да правя ?
Трябва ли да влизам винаги като root за да пиша там? Отговора е не, просто трябва да се предоставят пълни права само на потребителя jazzman.
За да се дадат такива в/у тази директория и под-директории правим следното, променяме групата и собственика.
[root@localhost jazzman]# chgrp -Rhv jazzman /var/www/html/permission/
changed group of `/var/www/html/permission/' to jazzman
[root@localhost jazzman]# chown -R jazzman /var/www/html/permission/
changed ownership of `/var/www/html/permission/' to jazzman
Да видим сега какво получаме:
[jazzman@localhost ~]$ ls -la /var/www/html/permission/
drwxrwxr-x 2 jazzman jazzman 4096 Nov 24 15:47 .
drwxr-xr-x. 12 root root 4096 Nov 24 15:06 ..
Това означава, че правата в/у server root directory си е на root а новата permission отива при jazzman и само той (освен root) има права над нея.
Обаче какво става с юзъра "apache"? Под името на този потребител се изпълнява всичко свързано с php (понеже php е сървърен език).
Ако аз създам един php файл, който да копира текст от друг файл и да го записва в/у сървъра нека да видим какво ще се случи.
Първо създваме index.php файла в нашата permission директория (ползвам vim):
[jazzman@localhost ~]$ vim /var/www/html/permission/index.php
и в него пиша следният прост скрипт: (exampe.txt е създаден предварително от jazzman)
<?php
$file = 'example.txt';
$newfile = 'new.txt';
copy($file, $newfile);
Ако стартираме браузъра с url localhost/permission,изкача следното съобщение:
Warning: copy(example.txt) [<a href='function.copy'>function.copy</a>]: failed to open stream: No such file or directory in /var/www/html/permission/index.php on line 6
Това означава, че скрипта нещо се сгъбясва, защо? ами щото "apache" няма право да пише там, за да оправим този проблем добавяме user-a apache към групата на jazzman.
[root@localhost jazzman]# chgrp -Rvh apache /var/www/html/permission/
changed group of `/var/www/html/permission/index.php' to apache
changed group of `/var/www/html/permission/test.php' to apache
changed group of `/var/www/html/permission/' to apache
Даваме и пълни права на потребителите от групата на джазмените, без чалгаджиите ( в случая е само apache).
[jazzman@localhost ~]$ chmod -Rv 775 /var/www/html/permission/
mode of `/var/www/html/permission/' retained as 0775 (rwxrwxr-x)
mode of `/var/www/html/permission/index.php' changed to 0775 (rwxrwxr-x)
mode of `/var/www/html/permission/test.php' changed to 0775 (rwxrwxr-x)
5-та в края може я орежете на 3 или 2 ( това е пермишъна за всички останали които са извън групата).........
Отваряме и httpd.conf файла и променяме групата от apache на jazzman, понеже той е описан в config file на apache...
Сега ако изпълните в браузъра localhost/permission, всичко трябва да е както трябва.
Новият файл се създате от потребител с име apache принадлежащ към групата на jazzman чиито потребители имат пълни права.
Другото което бихте могли да направите е всичките php scripts да се изпълняват от името на jazzman принаадлежащ към групата на apache.
Може да обърнете логиката както си искате.
Последно ако създам потребител с име "dummy" той ще има права само да изпълнява и чете скриптовете, но не и да пише.....
Надявам се да ви бъде интересно и най-вече полезно в работата с линъкс...