除了null
以外,我无法返回任何内容。我必须在格式化String数组中的操作的方式中遗漏一些东西,请帮忙!另外,Java中的命令行工作是否有更好的sdk? 更新为了将来参考,这是一个EC2实例,并且执行InetAddress.getLocalHost()会返回null,因此我已经恢复到命令行(AWS SDK只是为了钻取关闭本地主机IP)。
//要运行的命令:/sbin/ifconfig | awk 'NR==2{print$2}' | sed 's/addr://g'
String[] command = new String[] {"/sbin/ifconfig", "awk 'NR==2{print$2}'", "sed 's/addr://g'" };
String ip = runCommand(command);
public static String runCommand(String[] command) {
String ls_str;
Process ls_proc = null;
try {
ls_proc = Runtime.getRuntime().exec(command);
} catch (IOException e1) {
e1.printStackTrace();
}
DataInputStream ls_in = new DataInputStream(ls_proc.getInputStream());
try {
while ((ls_str = ls_in.readLine()) != null) {
return ls_str;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
答案 0 :(得分:5)
Runtime.exec()
Runtime.exec()
won't。它总结了使用Runtime.exec()
(包括#2中提到的那个)时可能遇到的所有主要缺陷,并告诉您如何避免/解决它们。答案 1 :(得分:1)
StringBuilder result = new StringBuilder()
try {
while ((ls_str = ls_in.readLine()) != null) {
result.append(ls_str);
}
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
答案 2 :(得分:1)
如果将数组传递给exec(),它就好像第一个元素之后的所有元素都是第一个元素的参数。 “awk”不是ifconfig
的有效参数。
答案 3 :(得分:1)
采用Runtime.exec()
的{{1}}形式不会在管道中执行多个命令。而是它使用其他参数执行单个命令。我认为做你想做的最简单的方法是String[]
一个shell来做管道:
exec
答案 4 :(得分:0)
您可以使用java.net.NetworkInterface
。像这样:
public static List<String> getIPAdresses() {
List<String> ips = new ArrayList<String>();
try {
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while (e.hasMoreElements()) {
NetworkInterface ni = e.nextElement();
Enumeration<InetAddress> e2 = ni.getInetAddresses();
while (e2.hasMoreElements()) {
InetAddress ip = e2.nextElement();
if (!ip.isLoopbackAddress())
ips.add(ip.getHostAddress());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return ips;
}
Joachim Sauer已经发布了link to the documentation