【发布时间】:2014-11-27 20:43:21
【问题描述】:
当我在 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 时,终端告诉我没有找到文件。我不想将我的 root 密码放在 java 代码中。有没有其他方法可以从java调用journalctl而不必将系统root密码留在文件中?
【问题讨论】:
-
退出状态为
1表示错误。您应该阅读错误流 (p.getErrorStream()),它可能包含错误消息。如果你分享它会很有帮助。你是从命令行运行java程序吗? -
您刚刚打印了 Stream 对象。我的意思是你必须阅读它 - 这是一个
InputStream,你需要打开一个BufferedReader并将每一行打印到System.out或其他东西。 -
在 CentOS 将他们的文档与现实保持一致之前,您最好的选择是执行
sudo chmod og+s /usr/bin/journalctl以允许普通用户使用 journalctl。既不能添加到 systemd-journal(根据手册页),也不能根据 pid-eins 添加到adm在 CentOS 7 上工作 -
grep应该与此更改一起工作是不是不足以获取写入日志的单位列表? -
我还用 RealSkeptic 的见解更新了我的答案,现在我可以像普通人一样使用 journalctl,这只是 systemd-journal 的成员