emdinoiay wrote:
Em có thử một số hàm như sau nhưng không được :
shell_exec("service mysqld stop"
exec("service mysqld stop"
system("service mysqld stop"
Bạn thiếu `sudo` rồi. PHP chạy trên một web server nào đó. Web server này chạy dưới quyền của user apache, nginx, ... Đoạn code trên của bạn sẽ tương đương với:
Code:
su - apache -s /bin/bash -c '/sbin/service mysqld stop'
Thử chạy từ command line xem, nó sẽ ý kiến ngay.
Cách đơn giản là thêm `sudo` vào và nhớ sửa lại `/etc/sudoers` để cho phép apache user restart những dịch vụ đó:
Code:
apache ALL=(ALL:ALL) NOPASSWD:/etc/init.d/mysqld
emdinoiay wrote:
Theo em được biết các Web control cho linux chủ yếu dựa trên php, ví dụ như Kloxo, plesk, Webuzo (mới)...
Thế nên em muốn hỏi làm sao họ viết được control restart (php-fpm, nginx, apache...) bằng php và việc này hoàn toàn thao tác trên web mà không dùng quyền root trong terminal (php code.php).
Thú thật là mình chưa dùng mấy cái đó bao giờ. Hôm qua rảnh ngồi vọc Vagrant rồi cài Kloxo lên xem thử.
OK. Cài xong, chỉnh sang bridged network, start lên, ssh vào.
Đầu tiên, kiểm tra xem process đang listen trên port 7778 chạy dưới quyền của user nào:
Code:
# fuser -v 7778/tcp
USER PID ACCESS COMMAND
7778/tcp: lxlabs 14188 F.... kloxo.httpd
`lxlabs` user có trong `/etc/sudoers` hay thuộc `wheel` group không nhỉ:
Code:
# grep lxlabs /etc/sudoers
# groups lxlabs
lxlabs : lxlabs
Giờ `strace` thử theo PID này xem nó làm gì khi mình thao tác một lệnh trên web interface:
Code:
# strace -e trace=open,stat -p 14188
Sau đó, trên giao diện web, vào Server --> Command Center, gõ `id` rồi Execute bạn được Output là:
uid=0(root) gid=0(root)
Quay lại Terminal:
Code:
Process 14188 attached - interrupt to quit
stat("/usr/local/lxlabs/kloxo/httpdocs/display.php", {st_mode=S_IFREG|0644, st_size=464, ...}) = 0
open("/usr/local/lxlabs/kloxo/httpdocs/display.php", O_RDONLY) = 9
stat("/usr/local/lxlabs/kloxo/file/phpsuexec.sh", {st_mode=S_IFREG|0755, st_size=156, ...}) = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
Process 14188 detached
À, nó gọi đến `/usr/local/lxlabs/kloxo/file/phpsuexec.sh`. Mở file này ra xem có gì:
Code:
#!/bin/sh
export MUID=0
export GID=0
export TARGET=/usr/local/lxlabs/ext/php/bin/php_cgi
export NON_RESIDENT=1
exec /usr/local/lxlabs/kloxo/cexe/lxphpsu $*
Kiểm tra permission của `/usr/local/lxlabs/kloxo/cexe/lxphpsu` xem nào:
Code:
# ls -l /usr/local/lxlabs/kloxo/cexe/lxphpsu
-rwsr-sr-x 1 root root 8068 Mar 4 2012 /usr/local/lxlabs/kloxo/cexe/lxphpsu
2 chữ "s" ở đây có nghĩa gì nhỉ ?
emdinoiay wrote:
Anh nào giải thích hộ em hoặc có tài liệu nào liên quan thì gúp em nhé.
Google: Kloxo security model.
PS: không hiểu tại sao topic kia biến mất: /hvaonline/posts/list/44177.html