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 grep
ve 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 foo
Sizin gibi basit bir şeyin spesifik durumunda, yalnızca command
Java'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.