ทำไมฉันถึงได้รับข้อผิดพลาด“ ไม่สามารถสร้างไฟล์ pid …สิทธิ์ที่ถูกปฏิเสธ” ข้อผิดพลาด?


11

หากโปรแกรมต้องได้รับอนุญาตในการเขียนฉันควรตั้งค่าด้วย chown ได้อย่างไร? โดยเฉพาะการอนุญาตโปรแกรมของ foo คือการแก้ไขข้อผิดพลาดนี้?

failed to create pid file '/var/run/bar.pid': Permission denied

คำตอบ:


7

หากคุณมีโปรแกรมfooที่พยายามสร้าง / เขียนไฟล์การอนุญาตของfooไบนารีนั้นไม่สำคัญ แต่ผู้ใช้ที่ทำงานอยู่นั้นสร้างความแตกต่าง

ในกรณีนี้fooก็พยายามที่จะเขียนไป/var/runซึ่งเป็นเจ้าของrootและเพียงเขียนได้โดยราก

ดังนั้นคุณจะต้องเรียกใช้โปรแกรมsudo fooเพื่อสร้างไฟล์ PID นั้น โปรดพิจารณาผลกระทบด้านความปลอดภัยของการอนุญาตให้โปรแกรมทำงานเป็นรูทก่อนที่คุณจะทำ ...


หากการอนุญาตบนไบนารีเป็นบางสิ่ง: rw-rr โปรแกรมจะสามารถทำงานได้หรือไม่หากฉันใช้โปรแกรมเป็น root เช่นอนุญาตให้สร้าง id กระบวนการภายใต้ / var / run?
Ankit

@Ankit: หากไบนารีไม่มีสิทธิ์ในการปฏิบัติการเลยมันจะไม่ "รัน"; แต่ทุกสิ่งที่คุณทำในฐานะรูทจะสามารถสร้าง pid ได้/var/run
ish

หรือเขียนไฟล์ pid ที่อื่น (แอพพลิเคชั่นมากมายให้คุณระบุพา ธ ไปยังไฟล์ pid)
msanford

1

วิธีการทั่วไป: กำหนดผู้ใช้และกลุ่มของกระบวนการที่พยายามเข้าถึงไฟล์ มักพบได้ในการกำหนดค่าซอฟต์แวร์ (เช่น webservers / mailservers / ... ) แต่หากซอฟต์แวร์กำลังใช้งานอยู่ให้ใช้สิ่งนี้:

ps aux 

ค้นหากระบวนการที่คุณต้องการกำหนดค่าสิทธิ์การเข้าถึง คอลัมน์แรกจะบอกคุณภายใต้ชื่อผู้ใช้ที่ทำงานอยู่

groups <username>

สิ่งนี้จะบอกคุณว่ากลุ่มใดที่ผู้ใช้อยู่

เปลี่ยนเจ้าของหรือกลุ่มของไฟล์เพื่อให้ตรงกับบริการ

หมายเหตุ 1: เนื่องจากคำถามชี้ให้เห็นว่าไฟล์อยู่ใน / var / run / ฉันสมมติว่ามีเพียงหนึ่งกระบวนการเท่านั้นที่ต้องการการเข้าถึงถ้าไม่เป็นจริงคุณไม่ควรเปลี่ยนเจ้าของหรือกลุ่ม แต่คุณอาจพิจารณาเพิ่มกระบวนการ 'ผู้ใช้ไปยังกลุ่มหรือสร้างกลุ่มใหม่สำหรับไฟล์ / โฟลเดอร์นี้

หมายเหตุ 2: สิ่งตลก ๆ สามารถเกิดขึ้นได้กับ apparmor ซึ่งเป็นระบบรักษาความปลอดภัย: มันสามารถป้องกันกระบวนการจากการเขียนไฟล์และโฟลเดอร์ที่พวกเขามี (ในระดับระบบไฟล์) สิทธิ์ที่จำเป็นทั้งหมด ด้วยaa-statusคุณสามารถดูว่ากฎเฉพาะสำหรับบริการของคุณทำงานอยู่หรือไม่


1

สิ่งที่ฉันทำคือเพียงเพิ่มการสร้างโฟลเดอร์ก่อนที่จะมีการเรียกใช้งาน 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 $?
}

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