从java调用journalctl

时间:2014-11-27 20:43:21

标签: java linux centos

当我在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终端运行journalctl --output=json-pretty UNIT=firewalld.service root时,我获得了57行输出。但是当我以普通用户身份运行journalctl --output=json-pretty UNIT=firewalld.service时,终端会告诉我没有找到任何文件。我不想把我的root密码放在java代码中。是否有其他方法可以从java调用journalctl而无需将系统root密码保留在文件中?

2 个答案:

答案 0 :(得分:2)

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

对于不同的操作系统设置,该组可能不同。如果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/

答案 1 :(得分:1)

尽管journalctl的手册页告诉您将用户添加到systemd-journal应该允许他们访问所有日记帐,但这在CentOS 7上不起作用。我最初通过这样做来解决这个问题:

chmod +s /usr/bin/journalctl

但是,这样每个人都可以访问期刊,这可能不是您想要的

由于@RealSkeptic指出man的{​​{1}}页面表明可以向群组提供额外的访问权限以阅读日记(并说明将用户添加到systemd-journald.service应该够了)。结合您可以做的信息

systemd-journal

之后,根据手册页将用户添加到sudo setfacl -Rnm g:systemd-journal:rx,d:g:systemd-journal:rx /run/log/journal/ 组,足以允许访问日记帐:

systemd-journal