Làm cách nào để định cấu hình PHP CLI trên linux ubfox để chạy dưới dạng dữ liệu www?


12

Tôi có một ứng dụng symfony2 trên Ubuntu của tôi. Symfony có rất nhiều lệnh console hữu ích (như php app/console cache:clearhoặc php app/console assets:install web).

Vấn đề là nếu tôi chạy chúng với tư cách là rootngười dùng, các tệp mới được tạo sẽ có root:rootngười dùng / nhóm và nếu tôi truy cập trang web của mình thì tôi gặp lỗi (vì apache apache không thể đọc / sửa đổi các tệp này -> chúng nên có www-data:www-data).

Chạy chown www-data:www-datagiải quyết vấn đề, nhưng chạy nó mỗi khi tôi xóa bộ nhớ cache của tôi không phải là một giải pháp.

Làm cách nào tôi có thể định cấu hình PHP CLI để luôn chạy dưới dạng người dùng / nhóm dữ liệu www?

hoặc là

Làm thế nào tôi có thể chạy một lệnh như một người dùng khác nhau (là root, chạy nó dưới dạng dữ liệu www)?

Câu trả lời:


23

Chạy lệnh như một người dùng khác một lần:

sudo -u www-data php script.php

Điều này sẽ làm việc nếu bạn đang có root.

Đối với việc luôn chạy php như www-data, có một số khả năng. Bạn có thể tạo một shellscript đơn giản. Nếu /usr/bin/phpchỉ là một liên kết mềm đến /usr/bin/php5hoặc tương tự, điều đó làm cho nó đơn giản hơn. Chỉ cần thay thế liên kết mềm (KHÔNG phải tệp php5) bằng một tập lệnh như thế này:

#!/bin/sh

sudo -u www-data php5 $*

return $?

Điều đó không được thử nghiệm mặc dù. Cũng cần lưu ý rằng điều này LUÔN LUÔN cố gắng chạy php5như người dùng www-data, ngay cả khi người dùng có thể không rootvà có thể không được phép làm như vậy. Và nó cũng có thể không phải là những gì bạn thực sự muốn. Một số dịch vụ được cài đặt có thể gặp sự cố khi cố gắng thực thi php.

Một giải pháp (có thể tốt hơn) để chỉ áp dụng điều đó cho root có thể là để lại liên kết mềm /usr/bin/phpvà đặt tập lệnh vào /root/binthay thế. Sau đó, thêm thư mục đó vào PATH qua .bashrc, .profilehoặc tương đương. Nếu bạn có /etc/skel/.profile, điều đó có thể chỉ ra làm thế nào được thực hiện:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Một khi điều này là trong bạn .bashrc, .profilehoặc tương tự, mỗi vỏ mới, bạn mở sẽ cho phép bạn trực tiếp thực hiện bất kỳ tập tin thực thi (+ x) trong $HOME/bin( /root/binroot).

Gợi ý: Bạn có thể muốn đặt tên cho tập lệnh trình bao bọc giống như phpwwwvậy để bạn chỉ định rõ ràng php script.phphoặc phpwww script.phpquyết định xem bạn muốn php thường xuyên hoặc sudo'ed.

Một giải pháp khác là một bí danh đơn giản. Đặt cái này trong của bạn .bashrc, .profilehoặc tương tự:

alias phpwww='sudo -u www-data php'

Thật buồn cười, một nửa nghe đã trôi qua và tôi lại vấp phải câu hỏi của chính mình =) Có vẻ như tôi đã quên chấp nhận câu trả lời của bạn lần trước - Tôi chỉ sửa nó, cảm ơn bạn!
loostro

Phương pháp bí danh có ý nghĩa rất đẫm máu và nó đã giải quyết được vấn đề chính xác của tôi
RedactedProfile

1

Đã được trả lời bởi mwargh trên ## linux (IRC Freenode.net)


Để chạy các lệnh như một người dùng khác nhau -> chuyển sang người dùng đó sử dụng:

su www-data

Tôi vẫn quan tâm (nếu có thể) trong việc định cấu hình PHP để chạy:

root@mycomp php (php script creating a file)

là người dùng root

sẽ dẫn đến việc tạo một tệp có www-data: www / data user / group

(theo cách này tôi sẽ không phải chuyển từ root sang www-data để chạy các lệnh của mình)


1

Tôi sẽ thử tạo / usr / bin / php thuộc sở hữu của dữ liệu www và đặt quyền cho phép, điều này buộc lệnh phải được thực thi bởi chủ sở hữu tệp. Bạn sẽ làm điều này với:

chmod u+s /usr/bin/php

của bạn thích ký hiệu bát phân:

chmod 4755 /usr/bin/php

Mặc dù tôi phải nói rằng nó sẽ khiến mọi người khó chịu mỗi khi bạn biến dữ liệu www thành chủ sở hữu của bất cứ thứ gì, vì quan điểm của tài khoản dữ liệu www là sở hữu càng ít càng tốt.


Đó là lý do tại sao tôi sẽ đi với câu trả lời của
riha

1

nếu bạn có php-fpm (Trình quản lý quy trình FastCGI),
bạn có thể thiết lập nó trong tệp cấu hình có tại (atleast for centos): /etc/php-fpm.d/www.conf
tại dòng 39 bạn có thể đặt người dùng và 49 bạn đặt nhóm


Điều đó không áp dụng cho php-cli, phải không?
riha

1

tạo tập tin kịch bản:

touch /usr/bin/phpuid
chmod +x /usr/bin/phpuid

thêm nội dung:

#!/bin/bash

UIDX="#"`stat -c '%u' $1`
sudo -u $UIDX php5 $*

chạy tập lệnh của bạn từ root:

phpuid /path/to/script.php

hoặc sử dụng trình thông dịch trong tập lệnh của bạn

#!/usr/bin/phpuid
<?php
phpinfo();

lưu ý: đã thử nghiệm trên debian 7, bạn có thể yêu cầu cài đặt sudo

apt-get install sudo

tất cả các tệp được tạo bởi script.php sẽ có cùng uid của tập lệnh đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.