หากโปรแกรมต้องได้รับอนุญาตในการเขียนฉันควรตั้งค่าด้วย chown ได้อย่างไร? โดยเฉพาะการอนุญาตโปรแกรมของ foo คือการแก้ไขข้อผิดพลาดนี้?
failed to create pid file '/var/run/bar.pid': Permission denied
หากโปรแกรมต้องได้รับอนุญาตในการเขียนฉันควรตั้งค่าด้วย chown ได้อย่างไร? โดยเฉพาะการอนุญาตโปรแกรมของ foo คือการแก้ไขข้อผิดพลาดนี้?
failed to create pid file '/var/run/bar.pid': Permission denied
คำตอบ:
หากคุณมีโปรแกรมfoo
ที่พยายามสร้าง / เขียนไฟล์การอนุญาตของfoo
ไบนารีนั้นไม่สำคัญ แต่ผู้ใช้ที่ทำงานอยู่นั้นสร้างความแตกต่าง
ในกรณีนี้foo
ก็พยายามที่จะเขียนไป/var/run
ซึ่งเป็นเจ้าของroot
และเพียงเขียนได้โดยราก
ดังนั้นคุณจะต้องเรียกใช้โปรแกรมsudo foo
เพื่อสร้างไฟล์ PID นั้น โปรดพิจารณาผลกระทบด้านความปลอดภัยของการอนุญาตให้โปรแกรมทำงานเป็นรูทก่อนที่คุณจะทำ ...
/var/run
วิธีการทั่วไป: กำหนดผู้ใช้และกลุ่มของกระบวนการที่พยายามเข้าถึงไฟล์ มักพบได้ในการกำหนดค่าซอฟต์แวร์ (เช่น webservers / mailservers / ... ) แต่หากซอฟต์แวร์กำลังใช้งานอยู่ให้ใช้สิ่งนี้:
ps aux
ค้นหากระบวนการที่คุณต้องการกำหนดค่าสิทธิ์การเข้าถึง คอลัมน์แรกจะบอกคุณภายใต้ชื่อผู้ใช้ที่ทำงานอยู่
groups <username>
สิ่งนี้จะบอกคุณว่ากลุ่มใดที่ผู้ใช้อยู่
เปลี่ยนเจ้าของหรือกลุ่มของไฟล์เพื่อให้ตรงกับบริการ
หมายเหตุ 1: เนื่องจากคำถามชี้ให้เห็นว่าไฟล์อยู่ใน / var / run / ฉันสมมติว่ามีเพียงหนึ่งกระบวนการเท่านั้นที่ต้องการการเข้าถึงถ้าไม่เป็นจริงคุณไม่ควรเปลี่ยนเจ้าของหรือกลุ่ม แต่คุณอาจพิจารณาเพิ่มกระบวนการ 'ผู้ใช้ไปยังกลุ่มหรือสร้างกลุ่มใหม่สำหรับไฟล์ / โฟลเดอร์นี้
หมายเหตุ 2: สิ่งตลก ๆ สามารถเกิดขึ้นได้กับ apparmor ซึ่งเป็นระบบรักษาความปลอดภัย: มันสามารถป้องกันกระบวนการจากการเขียนไฟล์และโฟลเดอร์ที่พวกเขามี (ในระดับระบบไฟล์) สิทธิ์ที่จำเป็นทั้งหมด ด้วยaa-status
คุณสามารถดูว่ากฎเฉพาะสำหรับบริการของคุณทำงานอยู่หรือไม่
สิ่งที่ฉันทำคือเพียงเพิ่มการสร้างโฟลเดอร์ก่อนที่จะมีการเรียกใช้งาน start-stop-deamon สิ่งนี้ได้ผลเนื่องจากสคริปต์ถูกเรียกใช้งานเป็นรูทระหว่างการเริ่มต้น มันเพิ่งสร้างโฟลเดอร์ใน / var / run และเปลี่ยนเจ้าของทันทีดังนั้นจึงสามารถเขียน PID ได้
ในตัวอย่างด้านล่างฉันตรวจสอบการมีอยู่ของโฟลเดอร์ย่อย / var / run ที่ฉันใส่ PIDs เป็นผู้ใช้ปัจจุบันในกรณีนี้ผู้ใช้ 'pi' (ตั้งแต่ฉันอยู่ในราสเบอร์รี่)
ตรวจสอบลิงค์นี้ด้วยเพราะมันเป็นการศึกษาที่ดีสำหรับฉัน: สคริปต์ Python ทำงานเป็นบริการอย่างไรก็ตามไม่ครอบคลุมปัญหาที่กล่าวถึงที่นี่
ตัวอย่างส่วนหนึ่งของสคริปต์เชลล์ของฉัน:
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
if [ ! -d /var/run/power ]; then
mkdir /var/run/power/
chown pi:pi /var/run/power/
fi
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
log_end_msg $?
}