เรียกใช้กระบวนการในฐานะผู้ใช้ / กลุ่มอื่น (ในสคริปต์ init.d)


10

ฉันกำลังแก้ไขสคริปต์ init.d สคริปต์ init.d จะเรียกใช้สคริปต์อรรถประโยชน์ซึ่งจะเรียกใช้กระบวนการ จากสคริปต์ทุบตีฉันจะทำให้กระบวนการหลักเป็นผู้ใช้และกลุ่มได้อย่างไร

คำตอบ:


12

วิธีที่ง่ายที่สุดคือการใช้คำสั่ง su (1) มันมีตัวเลือกที่ให้คุณเรียกใช้คำสั่งผ่านเชลล์ของผู้ใช้ตัวอย่าง:

su foo -c ls

สิ่งนี้จะสลับไปที่ผู้ใช้fooและเรียกใช้คำสั่ง ls หากผู้ใช้ที่คุณต้องการใช้ไม่มีเชลล์ที่ถูกต้อง (เช่นไม่มีอยู่ใน / etc / shells เช่น / bin / false หรือ / sbin / nologin) คุณจะต้องระบุเชลล์บนบรรทัดคำสั่ง ตัวอย่างที่มีเอาท์พุท:

# su nobody -s /bin/bash -c id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

su ดูเหมือนจะไม่ชอบที่ฉันให้ข้อโต้แย้งมากมาย ฉันได้รับUsage: su [options] [LOGIN]และsu: unrecognized option '--debug'

มันไม่ทำงานอย่างแน่นอน เมื่อฉันรันบรรทัดนี้เป็นรูทฉันได้รับข้อผิดพลาดsu www-data -c ${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &ถ้าฉันsu www-dataตั้งค่า vars ทั้งหมดและทำงาน${MONOSERVER} /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid &ได้ดี ฉันจะแก้ปัญหานี้อย่างไร

2
@ acidzombie24 suรับอาร์กิวเมนต์เดี่ยวซึ่งเป็นคำสั่งเชลล์ คุณจำเป็นต้องเขียนsu www-data -c '$MONOSERVER "/application=$WEBAPPS" "/socket=unix:/path/monoserve.pid"'และตรวจสอบให้แน่ใจว่าMONOSERVERและWEBAPPSจะถูกส่งออกโดยเปลือกแม่ (หมายเหตุ: อย่าทำsu … -c "$MONOSERVER …"เช่นนี้จะล้มเหลวหากตัวแปรใด ๆ มีอักขระพิเศษของเชลล์) และหากคุณมีตัวเรียกใช้ daemon โดยเฉพาะเช่นstart-stop-daemonใช้งาน
Gilles 'หยุดชั่วร้าย'

Gilles: เอาล่ะฉันไม่ได้แทนที่สคริปต์ init.d ด้วยนั่นคือฉัน ฉันสามารถใส่ตัวแปรทั้งหมดลงในสคริปต์ใหม่และเปิดใช้งานได้ง่ายและฉันไม่ต้องเรียนรู้อะไรเลย แต่พิเศษเกี่ยวกับ start-stop-daemon คืออะไร ฉันจะแสดงความคิดเห็นกับคำตอบนั้น

จะดีกว่าถ้าใช้ su หรือ su -login? ฉันอ่านคนซู แต่ฉันไม่สามารถเข้าใจได้ในกรณีเฉพาะนี้
Massimo

4

หากstart-stop-daemonมีอยู่ในระบบของคุณคุณอาจจะใช้มันและมีลักษณะที่ตัวเลือก (โดยเฉพาะอย่างยิ่ง-uและ-gในกรณีนี้)

(มิฉะนั้นคุณอาจใช้การรวมกันของsuและsg.)

อัปเดต:นี่คือตัวอย่างที่นำมาจาก/etc/init.d/mpdสคริปต์บางตัว(ซึ่งใช้start-stop-daemon):

  • คำสั่งเริ่มต้น:

    echo "Starting Music Player Daemon"
    start-stop-daemon --start --quiet --background --exec /usr/bin/mpd \
        --pidfile /var/run/mpd.pid --make-pidfile \
        -- --no-daemon /etc/mpd.conf 2>/dev/null
    

    ทุกอย่างที่ตามมา--คืออาร์กิวเมนต์ของ/usr/bin/mpdโปรแกรมเอง (โพรซีเดอร์ daemonization ถูกดูแลโดยสคริปต์ start-stop-daemon ดังนั้นจึงmpdถูกขอให้ไม่สนใจด้วย--nodaemon)

  • คำสั่งหยุด:

    echo "Stopping Music Player Daemon"
    start-stop-daemon --stop --exec /usr/bin/mpd --pidfile /var/run/mpd.pid
    

หากmpdไม่ได้รับสิทธิพิเศษในการลดลงด้วยตัวเองหนึ่งจะต้องเพิ่ม (ตัวอย่าง) -u mpd, -g mpdตัวเลือกให้กับstart-stop-daemonคำสั่ง


ฉันไม่ได้แทนที่สคริปต์ init.d ด้วย start-stop-daemon ฉันคืออะไร? มันจะง่ายกว่าถ้าจะใช้ su และไฟล์สคริปต์? หากฉันแทนที่ init.d ฉันจะติดตั้งให้ทำงานเมื่อเริ่มต้นได้อย่างไร ฉันกำลังผ่านอะไรไปยัง start-stop-daemon -edit- ฉันเป็นตัวอย่างของ googling ATM บางทีฉันอาจไม่ต้องการคำตอบ แต่ฉันรู้สึกว่ามันจะเป็นคำตอบที่ซับซ้อน

2
ไม่มีโชค. นี่คือสายของฉัน มันยังคงทำงานเหมือนรูท ฉันตรวจสอบ man pages และฉันยังไม่รู้ว่าจะทำอย่างไรกับเรื่องนี้ start-stop-daemon --start --quiet --background -u www-data -g www-data --exec ${MONOSERVER} --pidfile /path/monoserve.pid --make-pidfile -- /applications=${WEBAPPS} /socket=unix:/path/monoserve.pid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.