无 root 权限时如何在/var/log 下写入日志

2022-04-19 17:05:56 +08:00
 zedpass

我有一个 python 告警脚本部署在多台服务器,现在需要让这个脚本的运行日志写入到 /var/log/zabbix 目录下,但是没有服务器的 root 权限,无法直接在 /var/log/zabbix 下创建日志文件,尝试使用 syslog ,可以无 root 权限写入日志到 /var/log/syslog ,google 了一圈没找到怎么写入到 /var/log 下的指定目录,求解

3173 次点击
所在节点    Linux
12 条回复
cpstar
2022-04-19 17:28:17 +08:00
先 root 创建一个 /var/log/zabbix 然后 chown 给相应用户?
aaa5838769
2022-04-19 17:31:23 +08:00
目录权限修改一下吧。
adoal
2022-04-19 18:21:05 +08:00
你的脚本又不是 zabbix 的一部分,为什么要往 /var/log/zabbix 下写东西?
dndx
2022-04-19 18:32:46 +08:00
syslog
k9982874
2022-04-19 18:48:44 +08:00
把你的用户加入 zabbix 组,设置目录对 zabbix 组可写
documentzhangx66
2022-04-19 19:16:18 +08:00
1 楼正解,就拿装 Oracle 的过程来分析一下:

以 root 用户登录 shell:

1.添加用户 oracle:
useradd oracle

2.添加用户组 oinstall
/usr/sbin/groupadd oinstall

3.把 oracle 用户拉到 oinstall 用户组里
/usr/sbin/usermod -g oinstall -G dba oracle

4.创建目录,因为当前用户是 root ,所以创建的目录,权限属于 root:
mkdir -p /opt/oracle/

5.把目录 /opt/oracle 的所有权限赋值给用户 oracle 与用户组 oinstall
chown -R oracle.oinstall /opt/oracle
zedpass
2022-04-19 21:19:38 +08:00
@adoal 因为是 zabbix 的告警脚本,所以想统一放到 zabbix 目录下
zedpass
2022-04-19 21:20:42 +08:00
@dndx syslog 好像只能写入到 /var/log/syslog 下面?没找到自定义路径的方法
adoal
2022-04-19 23:01:56 +08:00
@zedpass “zabbix 的告警脚本”是什么意思?是你从 zabbix 外部独立运行这个脚本,还是会在 zabbix 运行时触发?
前者的话跟 zabbix 没有任何关系,只是你从心理上觉得适合“统一放到 zabbix 目录下”而已。如果是后者,(我不懂 zabbix ,按一般情况推理)那运行时是以 zabbix 身份启动的,那一般不是很建议自己搞日志,应该通过 zabbix 提供的机制……如果没有的话,真是个人畜无害的小白花纯脚本,需要自己来搞日志,那也不应该放到 /var/log/zabbix 下。

另外,你这个话题提供的 context 不太足,让人没办法判断。你在这个工作里是什么角色?服务器拿不到 root ,那我按一般情况推理来假设,你应该不是这个服务器的“法定”运维管理人……那应该去找对应的人协商应该怎么办。是给你权限,还是由对方部署,还是按对方的要求把日志文件写到指定的地方……总之靠你在 v2 就这么没有 context 地莫名其妙发一帖,别人又不知道你的实际情况,没法给出准确的建议。

一般来说,“我没有服务器 root 权限”这事不是个纯粹的技术问题。它的本质是“我并不是所在的组织机构里认可的能合规管理这台服务器的人”,是人的职权问题。操作系统里帐号、文件系统的权限,只不过是管理策略落实到技术上的投影。你首要该做的是把职权的障碍打通。
adoal
2022-04-19 23:03:31 +08:00
@zedpass syslog 可以通过 /etc/syslog.conf (或者 rsyslog.conf )来配置,但……这是系统全局配置,肯定又要 root 的。
raysonx
2022-04-20 07:39:40 +08:00
可以按 1 楼的方法先为你的脚本创建一个用户,比如 myapp ,然后创建于一个子目录 /var/log/myapp ,用 chown myapp: -R /var/log/myapp 修改目录权限。
然而现在更优雅的办法是直接把日志输出到 stderr ,然后用 systemd 等工具启动服务自动管理日志。
HeyEvan
2022-04-20 12:57:41 +08:00
programName="Your Program"

tee /etc/rsyslog.d/${programName:?'-'}.conf << EOF
\$template CleanMsgFormat, "%msg%\n"
\$template ${programName:?'-'}LogPath, "/var/log/zabbix/%programname%-%\$YEAR%-%\$MONTH%-%\$DAY%.log"
if \$programname == '${programName:?'-'}' then ?${programName:?'-'}LogPath; CleanMsgFormat
& stop
EOF

重启就好了
systemctl restart rsyslog

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847933

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX