gpt4 book ai didi

java - 从 Java 调用 journalctl

转载 作者:太空狗 更新时间:2023-10-29 12:03:12 27 4
gpt4 key购买 nike

当我在 Centos 7 Linux 终端中以 root 用户身份运行以下命令时,会产生 57 行输出:

journalctl --output=json-pretty UNIT=firewalld.service  

那么如何更改下面的代码以从 Java 成功调用它而不必将密码留在文件中?

这是我的尝试。当我执行下面的代码时,控制台只输出exit: 1:

String s;
Process p;
try {
p = Runtime.getRuntime().exec("journalctl --output=json-pretty UNIT=firewalld.service");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((s = br.readLine()) != null)
System.out.println("line: " + s);
p.waitFor();
System.out.println ("exit: " + p.exitValue());
p.destroy();
} catch (Exception e) {}

编辑

当我添加以下内容时:

BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = br2.readLine()) != null)
System.out.println("error line: " + s);

生成以下输出:

error line: No journal files were found.
error line: Failed to get realtime timestamp: Cannot assign requested address

问题是否与权限有关?当我从 Linux 终端以 root 身份运行 journalctl --output=json-pretty UNIT=firewalld.service 时,我得到了 57 行输出。但是当我以普通用户身份运行 journalctl --output=json-pretty UNIT=firewalld.service 时,终端告诉我没有找到文件。我不想将我的根密码放在 Java 代码中。

有没有其他方法可以从 Java 调用 journalctl 而不必将系统根密码留在文件中?

最佳答案

您可以将您的(普通)用户添加到组 systemd-journal使用 usermod -a -G systemd-journal <username> .注销并登录它以使更改生效。这使您的用户可以访问系统日志文件,而无需授予其完全的根权限。

对于不同的操作系统设置,组可能不同。您可以使用 ls -l /var/log/journal/ 简单地查看日志文件属于哪个组。或 ls -l /run/systemd/journal/如果/var/log/journal/不存在。

我已经在 Centos LiveCD 中试过了,文件所属的组是 root .所以你可以将用户添加到组 root ,这与授予它完整的 root 权限相同。

不过,我认为更好的方法是在日志文件上设置 ACL 以允许特定组访问它们,因为 root组可能访问得太多了。 systemd-journald.service的手册给出了这个示例 ACL 修改命令,将对日志的读取权限授予 wheeladm :

setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/

关于java - 从 Java 调用 journalctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178431/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com