我正在编写一个我想在没有特权的情况下运行的脚本。我希望将脚本遇到的错误记录到某个日志文件中。我没有权限写一封信给/var/log
.我不想在我的主目录中有一个。
是否有用户空间脚本可以记录运行时信息的位置?在不产生任何潜在安全问题的情况下记录我的脚本信息的最佳做法是什么/var/log
?我犹豫是否要在脚本上设置 uid / gid 。
答案1
如果您作为普通用户决定运行一个程序,那么其日志的自然位置就是您的主目录。您的主目录用于存储所有文件,无论它们是您运行的程序的日志还是其他任何文件。
如果程序作为系统的一部分执行,并以典型的专用系统用户身份运行,那么其日志的自然位置是在/var/log
.创建一个子目录/var/log/myapp
并为其授予适当的权限,以便您的应用程序可以在其中写入。
如果相关并且您的操作系统允许,请将日志文件标记为仅附加。只有 root 可以执行此操作。这样做的优点是,如果您的应用程序受到损害,它将无法删除过去的日志,这对于对损害进行取证分析非常有用。您将需要 root 的干预来旋转日志:chown
以便应用程序不再可以打开日志文件,rename
日志文件,创建一个具有适当所有权的新的仅追加文件,然后通知应用程序打开新的空文件。
答案2
作为普通用户,您无法写入 /var/log,但如果您要求,syslog 守护进程会为您执行此操作。如果您想将消息记录到标准系统日志(例如),您的系统上可能可以使用/var/log/syslog
4.4BSD 实用程序。logger
它默认安装在 Debian 上,并且位于bsdutils
Debian 衍生版本的软件包中。
您将获得任何现有日志轮换、维护和监控工具的优势,但缺点是需要特权读系统日志,以及将脚本的消息与来自其他程序的消息混合在一起。
$ 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
。
答案3
通常,对于守护程序,日志文件会在创建root
后更改权限,以便非特权用户可以对其进行写入。logrotate
然后设置为在轮换期间保留权限。
如果它是命令,而不是守护程序,则登录/tmp
(最好使用)并通过日志的位置mktemp
通知用户。STDOUT
答案4
如果您的应用程序 (myapp) 使用 root 权限运行,则将日志存储在 /var/log/myapp
否则将日志文件存储在 $HOME/.local/myapp