Розглянемо наступний код:
String commandf = "ls /etc | grep release";
try {
// Execute the command and wait for it to complete
Process child = Runtime.getRuntime().exec(commandf);
child.waitFor();
// Print the first 16 bytes of its output
InputStream i = child.getInputStream();
byte[] b = new byte[16];
i.read(b, 0, b.length);
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
Вихід програми:
/etc:
adduser.co
Коли я біжу від оболонки, звичайно, вона працює так, як очікувалося:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
Інтернети мені кажуть, що через те, що поведінка труб не є платформою, геніальні розуми, які працюють на фабриці Java, що виробляє Java, не можуть гарантувати, що труби працюють.
Як я можу це зробити?
Я не збираюся робити все мій розбір з використанням Java будує , а не grep
та sed
, тому що , якщо я хочу , щоб змінити мову, я буду змушений повторно написати свій синтаксичний аналіз код на цій мові, яка не є абсолютно-го.
Як я можу змусити Java робити протоколи та перенаправлення під час виклику команд оболонки?
command | grep foo
вам, набагато краще просто запустити command
та виконати фільтрацію на Яві. Це робить ваш код дещо складнішим, але ви також значно скорочуєте загальне споживання ресурсів та атакуючу поверхню.