当我在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密码保留在文件中?
答案 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修改命令,该命令允许将日记的读取权限授予wheel
和adm
:
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