การกำหนดค่า Systemd Service เพื่อรันด้วยการเข้าถึงรูท


21

ฉันมีบริการในรูปแบบของแอปพลิเคชัน node.js ที่ติดตั้งกับ Systemd บน Raspbian Jessie และใช้บัญชีผู้ใช้ของตัวเอง อย่างไรก็ตามฉันพบว่าบริการไม่ทำงานอย่างถูกต้องเพราะไม่มีสิทธิ์ที่จำเป็น หนึ่งในโมดูลโหนดที่ฉันติดตั้งต้องการการเข้าถึงรูท ถ้าฉันเรียกใช้แอปด้วยตนเองโดย sudo ทุกอย่างทำงานได้ดี

มีวิธีบอก systemd ให้ใช้บริการด้วย sudo หรือไม่?


2
ไฟล์หน่วยของคุณมีลักษณะอย่างไรเพิ่มไปยังคำถามของคุณ? โดยปกติsystemdจะเรียกใช้ไฟล์หน่วยที่มีสิทธิ์รูท
โทมัส

คำตอบ:


31

บอกให้ systemd ใช้บริการด้วยsudo?

sudo ไม่มีอะไรจะไปกับมัน

โดยทั่วไปคุณสั่งให้ systemd เรียกใช้บริการในฐานะผู้ใช้ / กลุ่มที่มี a User=และGroup=directive ใน[Service]ส่วนของไฟล์ยูนิต

ตั้งค่าเหล่านั้นเป็นรูท (หรือลบออกขณะที่ทำงานเหมือนรูทเป็นค่าเริ่มต้น)


ฉันได้ตั้งค่าให้ใช้ผู้ใช้เฉพาะขณะที่ฉันใช้คำแนะนำเพื่อกำหนดค่า อย่างไรก็ตามในกรณีของฉันสิ่งนี้ไม่เหมาะสม ฉันลบสิ่งนี้เพื่อเรียกใช้เป็นรูทโดยค่าเริ่มต้นและตอนนี้ทุกอย่างทำงานได้!
ลุค

2
User=rootเล่นเป็นรากไม่มากเช่นเดียวกับการทำงานกับ ดูคำตอบของฉัน
Mark Stosberg

ไฟล์นี้สามารถแก้ไขได้ที่ไหน?
Matthew


15

เพื่อล้างsystemdระบบบริการทำงานเป็นรากโดยเริ่มต้น User=rootแต่ยังคงมีความแตกต่างระหว่างการทำงานเริ่มต้นและทำงานบริการระบบที่มี

ดังที่บันทึกไว้ในตัวแปรสภาพแวดล้อมในกระบวนการที่เกิดขึ้นมาตัวแปรเหล่านี้จะถูกตั้งค่าต่อเมื่อUser=ถูกตั้งค่า:

$USER, $LOGNAME, $HOME, $SHELL

ฉันทดสอบเพื่อยืนยันการค้นพบนี้ ดังนั้นหากคุณต้องการที่จะเรียกใช้บริการ systemd User=rootเป็นรากที่ต้องการเป็นหนึ่งในตัวแปรข้างต้นคุณต้องตั้ง


ขอขอบคุณ! นั่นเป็นสิ่งเดียวที่ทำงานให้ฉันกับแอปพลิเคชันที่ฉันมี
Pedro Torres

หมายเหตุถ้าคุณตั้งค่า User = root คุณควรตั้งกลุ่ม = root :) superuser.com/a/1452367/39364
rogerdpack

2

วิธีการแก้ปัญหาชั่วคราว แต่ให้มันทำงานได้อย่างรวดเร็ว:

/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'

สามารถทำงานกับผู้ใช้ที่มีสิทธิ์ sudo ในไฟล์ systemd unit ดังนี้:

[Unit]
Description=Rails Webserver
After=syslog.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/var/www/webserver
ExecStart=/usr/bin/sudo /bin/bash -lc 'bundle exec rails server -e demo -p 80'
Restart=always
KillSignal=SIGQUIT

[Install]
WantedBy=multi-user.target

ปัญหานี้มีหลายประเด็น: ประการแรกคำตอบสองข้อแรกอธิบายว่าทำไมการใช้ผู้ใช้และจากนั้น sudo ไม่จำเป็นและแสดงวิธีการที่ถูกต้อง ประการที่สองคุณไม่ควรใช้งานเว็บแอปเป็นรูทอยู่ดี ประการที่สามเว็บแอปของคุณควรอยู่หลังเว็บเซิร์ฟเวอร์ปกติเช่น nginx
Michael Hampton

ฉันจะไม่เห็นด้วยกับคุณในทุกจุดของคุณ แต่ถ้าใครบางคนเช่นตัวฉันอยากได้กระดูกที่เปลือยเปล่าเร็วที่สุดเท่าที่คุณจะทำได้เซิร์ฟเวอร์นี่คือตัวเลือกที่ทำงานได้
daino3

เกือบเร็วที่สุดเท่าที่จะทำได้ เห็นได้ชัดว่าการใช้sudoจะทำให้การเริ่มต้นทำงานช้าลงเล็กน้อย และมันไม่จำเป็น
Michael Hampton

@MichaelHampton ฉันพยายามเขียนลับๆดังนั้นฉันจึงพบคำตอบนี้มีประโยชน์!
P. Soutzikevich

1

เรียกใช้ในฐานะผู้ใช้ระบบในกรณีนี้โดยค่าเริ่มต้นบริการกำลังทำงานเป็น root

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