Các chương trình không gian người dùng được yêu cầu lưu nhật ký của họ ở đâu?


23

Tôi đang viết một kịch bản mà tôi muốn chạy mà không có đặc quyền. Tôi muốn các lỗi mà tập lệnh gặp phải được ghi vào một số tệp nhật ký. Tôi không có đặc quyền để viết một /var/log. Và tôi không muốn có một cái trong thư mục nhà của tôi.

Có một vị trí nơi tập lệnh không gian người dùng có thể đăng nhập thông tin thời gian chạy? Cách thực hành tốt nhất để có thông tin nhật ký tập lệnh của tôi là gì /var/logmà không tạo ra bất kỳ vấn đề bảo mật tiềm ẩn nào? Tôi do dự khi đặt uid / gid trên kịch bản.

Câu trả lời:


8

Bạn không thể viết thư cho / var / log như một người dùng bình thường, nhưng trình nền syslog sẽ làm điều đó cho bạn nếu bạn yêu cầu. Nếu bạn muốn ghi nhật ký tin nhắn vào nhật ký hệ thống tiêu chuẩn (ví dụ /var/log/syslog), tiện ích 4.4BSD loggercó thể có sẵn trên hệ thống của bạn. Nó được cài đặt theo mặc định trên Debian và nằm trong bsdutilsgói trên các dẫn xuất Debian.

Bạn sẽ có được lợi thế của bất kỳ công cụ xoay vòng, bảo trì và giám sát nhật ký nào trước đó, với nhược điểm là cần đặc quyền để đọc nhật ký hệ thống và có các thông điệp của tập lệnh của bạn trộn lẫn với các tin nhắn từ các chương trình khác.

$ 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

Có một số tùy chọn cấu hình có sẵn; bạn có thể đọc thêm ở man logger.


Có ràng buộc ngôn ngữ cho tiện ích này? Thay vì không sinh ra các quy trình phụ cho từng dòng thiết bị xuất chuẩn trong ứng dụng.
ThorSummoner

@ThorSummoner: Như câu trả lời của Gilles, sysloglà một thói quen của thư viện C và C ++ có thể gọi bất kỳ C nào bằng cách sử dụng extern "C". Các ngôn ngữ khác thường cung cấp ràng buộc chung cho bất cứ điều gì C, hoặc ràng buộc với những điều cụ thể, nhưng nó phụ thuộc vào ngôn ngữ.
dave_thndry_085

12

Nếu bạn là một người dùng bình thường quyết định chạy một chương trình, vị trí tự nhiên cho nhật ký của nó nằm trong thư mục chính của bạn. Thư mục chính của bạn là để bạn lưu trữ tất cả các tệp của bạn, cho dù chúng là nhật ký của chương trình bạn chạy hay bất cứ thứ gì khác.

Nếu chương trình được thực thi như một phần của hệ thống, chạy như một người dùng hệ thống chuyên dụng thông thường, thì vị trí tự nhiên cho nhật ký của nó là trong đó /var/log. Tạo một thư mục con /var/log/myappvà cung cấp cho nó quyền thích hợp để ứng dụng của bạn có thể viết ở đó.

Nếu có liên quan và hệ điều hành của bạn cho phép, hãy đánh dấu tệp nhật ký là chỉ phụ lục. Chỉ root mới có thể làm điều này. Điều này có lợi thế là nếu ứng dụng của bạn bị xâm phạm, nó sẽ không thể xóa các bản ghi trong quá khứ, điều này rất hữu ích cho việc phân tích pháp y về sự thỏa hiệp. Bạn sẽ cần sự can thiệp của root để xoay nhật ký: chownđể tệp nhật ký không còn được mở bởi ứng dụng, renametệp nhật ký, tạo tệp chỉ phụ lục mới với quyền sở hữu phù hợp, sau đó thông báo cho ứng dụng để mở tệp trống mới .

Bạn có thể tạo bất kỳ nhật ký ứng dụng nào vào nhật ký hệ thống bằng cách gọi logger(1)hoặc syslog(3).


4

Nói chung đối với một daemon, tệp nhật ký được tạo bởi rootsau đó các quyền được thay đổi để người dùng không có đặc quyền có thể ghi vào nó. logrotatesau đó được thiết lập để bảo vệ quyền trong quá trình quay.

Nếu đó là một lệnh, không phải là daemon, sau đó đăng nhập /tmp(tốt nhất là sử dụng mktemp) và thông báo cho người dùng thông qua STDOUTnơi nhật ký đã đi.


Ý tưởng tốt. Tôi có một vài dòng trong ~ / .profile của mình để kiểm tra xem quỷ dropbox có chạy không và khởi động nó nếu không. Tôi đã xem xét thêm một &để tránh giữ lời nhắc, nhưng bắt đầu dropbox ghi vào bảng điều khiển. Tôi hiện đang chuyển hướng đầu ra của nó sang /dev/null, nhưng muốn có một số cách để gỡ lỗi nếu dropbox không khởi động được.
Chúa ơi.

1
Kiểm tra daemonize.
bahamat

Chỉ cần biết, "quyền được thay đổi để người dùng không có đặc quyền có thể viết thư cho nó." điều này được thực hiện bằng cách đơn giản là chmod 666? hoặc tôi phải thêm người dùng vào một nhóm hoặc một cái gì đó tương tự?
Chúa ơi.

Tốt hơn dưới / var / tmp, / tmp không được đảm bảo để tồn tại khi khởi động.
vonbrand

@LordLoh.: Vâng, với chmod. Thông thường 0644hoặc 0664và quyền sở hữu người dùng / nhóm cũng được thay đổi thành quyền của daemon dự kiến ​​sẽ được ghi vào nó.
bahamat

3

Tôi theo chương trình không gian người dùng ấn tượng được dự kiến ​​sẽ loại bỏ nhật ký theo mặc định. Tôi đã thấy các chương trình khác nhau ghi nhật ký bất cứ nơi nào họ cảm thấy thích và nó không bao giờ được chào đón đặc biệt trên các hệ thống của tôi; có xu hướng xây dựng ở một số vị trí không bao giờ được chú ý trừ khi / cho đến khi nó trở nên khổng lồ.

Tôi thích nếu có một nơi nhất định cho họ, tôi đang chơi xung quanh hệ thống của mình để cố gắng tìm một nơi ổn định cho họ.

Ý tưởng đầu tiên của tôi là sử dụng /var/run/user/$UID/log, nhưng thấy rằng trên hệ thống của tôi, đó là một gắn kết TMPFS, không đủ lớn hoặc thực sự tốt để sử dụng với các bản ghi.

Tạo một nơi cho họ

Vì tôi không hiểu / var / run / user đủ tốt để tích hợp với nó, tôi đã chọn mô phỏng nó bằng tay, cho người dùng 1000.

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

Tôi khuyên bạn nên sử dụng FHS / var / log spc cho cấu trúc trong thư mục này, nhưng dạng tự do thông số kỹ thuật để không có nhiều điều phải tuân thủ.

Cấu hình Logrotate

Không có vòng quay nhật ký hiện có trên thư mục này do hệ thống của bạn cung cấp, tôi khuyên bạn nên tạo một vòng quay cho hệ thống của mình:

# /etc/logrotate.d/userlogs

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

Dưới đây là bài đăng / var / run / user / 1000 / log trước đây của tôi, tôi không thể đề xuất nó trừ khi bạn thực sự biết bạn đang làm gì (Và nếu bạn làm thế, hãy cho tôi biết cách làm quá!)

có thể như sau, nhưng tôi chỉ làm điều này vì nó có ý nghĩa với tôi.

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

Tích hợp với / 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.