โปรแกรม userspace อยู่ที่ไหนควรบันทึกบันทึกของพวกเขา?


23

ฉันกำลังเขียนสคริปต์ที่ฉันต้องการเรียกใช้โดยไม่มีสิทธิ์พิเศษ ฉันต้องการข้อผิดพลาดที่สคริปต์พบเพื่อเข้าสู่ระบบไฟล์บันทึก /var/logผมไม่ได้มีสิทธิพิเศษในการเขียนที่หนึ่งไปยัง และฉันไม่ต้องการที่จะมีหนึ่งในไดเรกทอรีบ้านของฉัน

มีตำแหน่งที่สคริปต์ userspace อาจบันทึกข้อมูลรันไทม์หรือไม่ แนวปฏิบัติที่ดีที่สุดในการให้ข้อมูลบันทึกสคริปต์ของฉันคืออะไร/var/logโดยไม่สร้างปัญหาด้านความปลอดภัยที่อาจเกิดขึ้น ฉันลังเลที่จะตั้ง uid / gid ในสคริปต์

คำตอบ:


8

คุณไม่สามารถเขียนไปยัง / var / log ในฐานะผู้ใช้ปกติ แต่ syslog daemon จะทำเพื่อคุณถ้าคุณถาม หากคุณต้องการบันทึกข้อความลงในบันทึกระบบมาตรฐาน (เช่น/var/log/syslog) ยูทิลิตี้ 4.4BSD loggerอาจพร้อมใช้งานในระบบของคุณ มันติดตั้งโดยค่าเริ่มต้นใน Debian และอยู่ในbsdutilsแพ็คเกจบน Debian Derivatives

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

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

มีตัวเลือกการกำหนดค่าหลายตัว คุณสามารถอ่านเพิ่มเติมman loggerได้ที่


มีการเชื่อมภาษาสำหรับยูทิลิตี้นี้หรือไม่ จะไม่วางไข่กระบวนการย่อยสำหรับ stdout ในแอปแต่ละบรรทัด
ThorSummoner

@ThorSummoner: ตามที่คำตอบของ Gilles บอกว่าsyslogเป็นรูทีนไลบรารี C และ C ++ สามารถเรียกใช้ C ใด ๆextern "C"ได้ ภาษาอื่นมักจะให้ความผูกพันทั่วไปกับสิ่งใด C หรือผูกกับสิ่งที่เฉพาะเจาะจง แต่มันขึ้นอยู่กับภาษา
dave_thompson_085

12

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

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

หากเกี่ยวข้องและระบบปฏิบัติการของคุณอนุญาตให้ทำเครื่องหมายไฟล์บันทึกเป็นแบบผนวกเท่านั้น เฉพาะ root เท่านั้นที่ทำได้ นี่เป็นข้อได้เปรียบที่หากแอปพลิเคชันของคุณถูกบุกรุกมันจะไม่สามารถลบบันทึกที่ผ่านมาซึ่งจะมีประโยชน์มากสำหรับการวิเคราะห์ทางนิติเวชของการประนีประนอม คุณจะต้องมีการแทรกแซงของรูทในการหมุนล็อก: chownเพื่อที่ว่าล็อกไฟล์จะไม่สามารถเปิดได้โดยแอปพลิเคชัน, renameไฟล์บันทึก, สร้างไฟล์ผนวกเฉพาะใหม่ที่มีความเหมาะสมในการเป็นเจ้าของแล้วแจ้งให้แอปพลิเคชันทราบ .

คุณสามารถทำให้การบันทึกของโปรแกรมประยุกต์ใด ๆ ที่จะบันทึกของระบบโดยการเรียกหรือlogger(1)syslog(3)


4

โดยทั่วไปแล้วสำหรับ daemon ไฟล์บันทึกจะถูกสร้างขึ้นrootดังนั้นจึงมีการเปลี่ยนแปลงการอนุญาตเพื่อให้ผู้ใช้ที่ไม่มีสิทธิ์สามารถเขียนได้ logrotateถูกตั้งค่าเพื่อรักษาสิทธิ์ในระหว่างการหมุน

หากเป็นคำสั่งไม่ใช่ daemon ให้เข้าสู่ระบบ/tmp(ควรใช้mktemp) และแจ้งให้ผู้ใช้ทราบผ่านทางSTDOUTบันทึก


ความคิดที่ดี. ฉันมีสองสามบรรทัดใน ~ / .profile ของฉันที่ตรวจสอบเพื่อดูว่า dropbox อสูรทำงานอยู่หรือไม่และเริ่มถ้าไม่ได้ ฉันกำลังพิจารณาเพิ่ม&เพื่อหลีกเลี่ยงการพร้อมท์ แต่การเริ่มต้นดรอปบ็อกซ์เขียนไปยังคอนโซล ขณะนี้ฉันกำลังเปลี่ยนเส้นทางไปยังเอาต์พุต/dev/nullแต่ต้องการมีวิธีการแก้ไขปัญหาบางอย่างหากดรอปบ็อกซ์ไม่สามารถเริ่มต้นได้
ลอร์ดโลห์

1
daemonizeตรวจสอบ
bahamat

เพียงแค่รู้ว่า "สิทธิ์ถูกเปลี่ยนแปลงเพื่อให้ผู้ใช้ที่ไม่มีสิทธิ์สามารถเขียนได้" ทำได้โดยเพียง chmod 666? หรือฉันต้องเพิ่มผู้ใช้ในกลุ่มหรืออะไรแบบนั้น?
ลอร์ดโลห์

ภายใต้ / var / tmp ดีกว่าไม่รับประกันว่าจะรอดชีวิตจากการบู๊ต
vonbrand

@LordLoh .: chmodใช่ด้วย โดยปกติ0644หรือ0664และความเป็นเจ้าของผู้ใช้ / กลุ่มก็จะเปลี่ยนเป็น daemon ที่คาดว่าจะเขียน
bahamat

3

ฉันอยู่ภายใต้โปรแกรมแสดงผล userspace ที่คาดว่าจะทิ้งบันทึกตามค่าเริ่มต้น ฉันเคยเห็นโปรแกรมบันทึกการถ่ายโอนข้อมูลต่างๆที่ใดก็ตามที่พวกเขารู้สึกและมันไม่เคยยินดีอย่างยิ่งในระบบของฉัน; มีแนวโน้มที่จะสร้างขึ้นในบางตำแหน่งที่ไม่เคยสังเกตเห็นเว้นแต่ / จนกว่าจะมีขนาดใหญ่

ฉันต้องการถ้ามีสถานที่แน่นอนสำหรับพวกเขาฉันเล่นรอบ ๆ ในระบบของฉันพยายามหาสถานที่ที่มั่นคงสำหรับพวกเขา

ความคิดแรกของฉันคือใช้/var/run/user/$UID/logแต่พบว่าในระบบของฉันนั่นคือเมานต์ TMPFS ไม่ใหญ่พอหรือดีจริงๆสำหรับใช้กับบันทึก

สร้างสถานที่สำหรับพวกเขา

เนื่องจากฉันไม่เข้าใจ / var / run / user ดีพอที่จะรวมเข้ากับมันฉันจึงเลือกจำลองด้วยมือสำหรับผู้ใช้ 1,000 คน

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

ฉันอยากจะแนะนำให้ติดกับFHS / var / log spcสำหรับโครงสร้างภายในโฟลเดอร์นี้ แต่ข้อมูลจำเพาะแบบฟรีจึงมีไม่มากที่จะปฏิบัติตาม

กำหนดค่า Logrotate

ไม่มีการหมุนเวียนบันทึกในไดเรกทอรีนี้ที่ระบบของคุณให้ฉันขอแนะนำให้สร้างหนึ่งสำหรับระบบของคุณ:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

ด้านล่างคือโพสต์ก่อนหน้า / var / run / user / 1000 / log ของฉันฉันไม่สามารถแนะนำได้เว้นแต่คุณจะรู้ว่าสิ่งที่คุณทำ (และถ้าคุณบอกให้ฉันรู้ด้วย)

อาจจะเป็นดังต่อไปนี้ แต่ฉันเพิ่งทำขึ้นเพราะมันทำให้รู้สึกถึงฉัน

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

ผสานรวมกับ / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

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