วิธีกำหนดค่า PHP CLI บน linux ubuntu ให้ทำงานเป็น www-data ได้อย่างไร?


12

ฉันมีแอพพลิเคชั่น symfony2 บน Ubuntu ของฉัน Symfony มีคำสั่งคอนโซลที่มีประโยชน์มากมาย (เช่นphp app/console cache:clearหรือphp app/console assets:install web)

ปัญหาคือถ้าฉันเรียกใช้พวกเขาในฐานะrootผู้ใช้ไฟล์ที่สร้างขึ้นใหม่จะมีroot:rootผู้ใช้ / กลุ่มและถ้าฉัน acces เว็บไซต์ของฉันฉันได้รับข้อผิดพลาด (เพราะ apache apache ไม่สามารถอ่าน / แก้ไขไฟล์เหล่านี้ -> ควรมีwww-data:www-data)

การรันchown www-data:www-dataแก้ไขปัญหา แต่ใช้งานทุกครั้งที่ฉันล้างแคชไม่ใช่วิธีแก้ปัญหา

ฉันจะกำหนดค่า PHP CLI ให้ทำงานในฐานะผู้ใช้ / กลุ่ม www-data ได้อย่างไร?

หรือ

ฉันจะรันคำสั่งในฐานะผู้ใช้ที่แตกต่างกัน (เป็นรูทได้อย่างไรรันในรูปแบบ www-data)?

คำตอบ:


23

เรียกใช้คำสั่งในฐานะผู้ใช้อื่นครั้งเดียว:

sudo -u www-data php script.php

rootนี้จะทำงานถ้าคุณเป็น

สำหรับ php ที่ทำงานอยู่เสมอwww-dataมีความเป็นไปได้หลายอย่าง คุณสามารถสร้าง shellpper แบบเรียบง่าย หาก/usr/bin/phpเป็นเพียงลิงค์อ่อน/usr/bin/php5หรือที่คล้ายกันนั่นจะทำให้ง่ายขึ้น เพียงแทนที่ soft-link (ไม่ใช่ไฟล์php5) ด้วยสคริปต์เช่นนี้:

#!/bin/sh

sudo -u www-data php5 $*

return $?

ที่ไม่ได้ทดสอบว่า นอกจากนี้โปรดทราบว่าสิ่งนี้จะพยายามเรียกใช้php5ในฐานะผู้ใช้www-dataเสมอแม้ว่าผู้ใช้rootอาจไม่ได้รับอนุญาตและอาจไม่ได้รับอนุญาต และอาจไม่ใช่สิ่งที่คุณต้องการ บริการที่ติดตั้งบางอย่างอาจประสบปัญหาเมื่อพยายามเรียกใช้งาน php

โซลูชัน (น่าจะดีกว่า) ที่จะนำไปใช้เฉพาะกับรูทอาจเป็นการปล่อยซอฟต์ลิงค์ไว้/usr/bin/phpตามลำพังและวางสคริปต์ไว้/root/binแทน แล้วเพิ่มโฟลเดอร์นั้นไปยังเส้นทางผ่านทาง.bashrc, .profileหรือคล้ายกัน หากคุณมี/etc/skel/.profileนั่นอาจชี้ให้เห็นวิธีการทำ:

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

ครั้งนี้อยู่ในของคุณ.bashrc, .profileหรือคล้ายกันทุกเปลือกใหม่ที่คุณเปิดจะช่วยให้คุณสามารถดำเนินการใด ๆ โดยตรง executables (+ x) ใน$HOME/bin( /root/binราก)

คำแนะนำ: คุณอาจต้องการตั้งชื่อสคริปต์ของ wrapper phpwwwเพื่อให้คุณระบุphp script.phpหรือphpwww script.phpตัดสินใจอย่างชัดเจนว่าคุณต้องการ php ปกติหรือ sudo'ed

อีกวิธีคือนามแฝงง่ายๆ สถานที่แห่งนี้ในของคุณ.bashrc, .profileหรือคล้ายกัน:

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

ขำขำได้ยินมาครึ่งหนึ่งแล้วและฉันก็สะดุดกับคำถามของฉันอีกครั้ง =) ดูเหมือนว่าฉันลืมที่จะยอมรับคำตอบของคุณในครั้งที่แล้ว - ฉันเพิ่งแก้ไขไปขอขอบคุณ!
loostro

วิธีนามแฝงทำให้รู้สึกเลือดมากและจะแก้ปัญหาที่แน่นอนของฉัน
RedactedProfile

1

ตอบโดย mwargh ใน ## linux (IRC Freenode.net)


วิธีเรียกใช้คำสั่งในฐานะผู้ใช้ที่แตกต่าง -> สลับไปใช้ผู้ใช้นั้น:

su www-data

ฉันยังสนใจ (ถ้าเป็นไปได้) ในการกำหนดค่า PHP เพื่อให้ทำงานได้:

root@mycomp php (php script creating a file)

ในฐานะผู้ใช้รูท

จะส่งผลให้สร้างไฟล์ด้วยwww-data: www-data user / group

(วิธีนี้ฉันไม่ต้องเปลี่ยนจาก root เป็น www-data เพื่อเรียกใช้คำสั่งของฉัน)


1

ฉันจะลองสร้าง / usr / bin / php ที่เป็นเจ้าของโดย www-data และตั้งค่า suid permission ซึ่งบังคับให้คำสั่งถูกเรียกใช้งานโดยเจ้าของไฟล์ คุณทำสิ่งนี้กับ:

chmod u+s /usr/bin/php

ของคุณชอบสัญลักษณ์แปด:

chmod 4755 /usr/bin/php

แม้ว่าฉันจะต้องบอกว่ามันควรทำให้ใครคนหนึ่งรู้สึกไม่สบายใจทุกครั้งที่คุณสร้างข้อมูล www-data เป็นเจ้าของสิ่งใดก็ตามจุดของบัญชี www-data คือการเป็นเจ้าของตัวเองให้น้อยที่สุด


นี่คือเหตุผลที่ฉันจะตอบคำถามของ
riha

1

ถ้าคุณได้ php-fpm (FastCGI Process Manager)
คุณสามารถตั้งค่าในไฟล์ config ที่ (atleast สำหรับ centos): /etc/php-fpm.d/www.conf
ที่บรรทัด 39 คุณสามารถตั้งค่าผู้ใช้และ 49 คุณตั้งกลุ่ม


ไม่สามารถใช้ได้php-cliใช่ไหม
riha

1

สร้างไฟล์สคริปต์:

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

เพิ่มเนื้อหา:

#!/bin/bash

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

รันสคริปต์ของคุณจากรูท:

phpuid /path/to/script.php

หรือใช้ล่ามในสคริปต์ของคุณ

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

หมายเหตุ: ทดสอบกับ debian 7 คุณอาจต้องติดตั้ง sudo

apt-get install sudo

ไฟล์ทั้งหมดที่สร้างโดย script.php จะมี uid เหมือนกันของสคริปต์นั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.