首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Java调用日志Java

从Java调用日志Java
EN

Stack Overflow用户
提问于 2014-11-27 20:43:21
回答 2查看 2K关注 0票数 3

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

代码语言:javascript
运行
复制
journalctl --output=json-pretty UNIT=firewalld.service  

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

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

代码语言:javascript
运行
复制
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) {}  

编辑

当我添加以下内容时:

代码语言:javascript
运行
复制
BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = br2.readLine()) != null)
    System.out.println("error line: " + s);

生成以下输出:

代码语言:javascript
运行
复制
error line: No journal files were found.
error line: Failed to get realtime timestamp: Cannot assign requested address

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

是否有其他方法从Java调用journalctl,而不必将系统根密码保留在文件中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-27 21:53:11

虽然journalctl的手册页告诉您,向systemd-journal添加用户应该允许他们访问所有日志,但CentOS 7上不起作用。

代码语言:javascript
运行
复制
chmod +s /usr/bin/journalctl

,但这让每个人都可以访问日志,这可能不是你想要的,

正如@RealSkeptic所指出的,用于mansystemd-journald.service页面表明,可以赋予组更多的访问权限来阅读日志(并且声明向systemd-journal添加用户应该足够了)。结合你能做的那些信息

代码语言:javascript
运行
复制
sudo setfacl -Rnm g:systemd-journal:rx,d:g:systemd-journal:rx /run/log/journal/

在此之后,按照手册页将用户添加到systemd-journal组就足够允许访问日志了:

代码语言:javascript
运行
复制
sudo usermod -a -G systemd-journal your_user_name
票数 2
EN

Stack Overflow用户

发布于 2014-11-27 21:13:57

可以使用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中,这与授予它完整的根权限不一样。

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

代码语言:javascript
运行
复制
setfacl -Rnm g:wheel:rx,d:g:wheel:rx,g:adm:rx,d:g:adm:rx /var/log/journal/
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27178431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档