Aşağıdaki kodu göz önünde bulundurun:
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);
}
Programın çıktısı:
/etc:
adduser.co
Kabuktan koştuğumda tabii ki beklendiği gibi çalışıyor:
poundifdef@parker:~/rabbit_test$ ls /etc | grep release
lsb-release
İnternetler bana boru davranışının platformlar arası olmadığı için Java üreten Java fabrikasında çalışan zeki beyinlerin boruların çalışacağını garanti edemeyeceğini söylüyor.
Bunu nasıl yapabilirim?
Tüm ayrıştırmamı Java yapıları yerine Java yapılarını kullanarak yapmayacağım grepve sedçünkü eğer dili değiştirmek istersem, ayrıştırma kodumu o dilde yeniden yazmak zorunda kalacağım, ki bu kesinlikle yapılmaz.
Kabuk komutlarını çağırırken Java'nın borulama ve yeniden yönlendirme yapmasını nasıl sağlayabilirim?
command | grep fooSizin gibi basit bir şeyin spesifik durumunda, yalnızca commandJava'da yerel olarak filtrelemeyi çalıştırıp yapmak çok daha iyidir . Kodunuzu biraz daha karmaşık hale getirir, ancak aynı zamanda genel kaynak tüketimini ve saldırı yüzeyini önemli ölçüde azaltırsınız.