Java ile harici sistem kodu || programı çalıştırma
Java programlama dilinde, herhangi bir işletim sistemi üzerinde, sistem komutu yada harici herhangi bir executable koşturmak elbet mümkün, fakat bu işlemleri kolaylaştıracak bir API , JDK içinde şu anda bulunmuyor. (ör: Herhangi bir işletim sistemi üzerinde kullanıcı hesabı oluşturmak veya bir kullanıcı hesabının resmini değiştirmek gibi ) . Bu gibi işlemler için mevcut işletim sisteminin Command Line Interface ( CLI ) ‘sini yani Komut Satırı Arayüzünü kullanmak durumundayız. Bu arayüzleri kullanabilmek içinse, hangi işlemi yapmak istiyorsak o işlemi icra edecek komut yada sistem programlarını ve kullanılış biçimlerini bilmek durumundayız. ( ör: Windows üzerinde komut satırında bir dizine ait tüm dosyaları ve dizinleri listelemek istiyorsak; “dir“ komutunu işletmeliyiz ) . Dikkat edeceğimiz husus “dir” bir komuttur bir sistem programı değil. Yani “C:Windowssystem32” dizininde “dir.exe” diye bir program bulunması söz konusu değildir. Söz konusu işletim sistemi Linux türevi ise bu komut “ls“ olacaktır. İsterseniz söz konusu bilgileri güzel bir örnek ile taçlandıralım. Örneğimizde, Windows ve Linux türevi bir işletim sistemi üzerinde bir kullanıcı hesabı oluşturalım. Programımızı Swing çatısı üzerine kuracağımız için, kod kalabalığını tek tek anlatmak yerine işimize yarayan asıl kod bölümlerini açıklayalım. Zaten kod kaynağında satır satır açıklamaları bulabileceksiniz.
1) Bize mevcut işletim sisteminin Windows tabanlı mı? Linux tabanlı mı? Olduğu bilgisi gerekiyor, bunu ayrıştırmak için ise System sınıfının getProperty metodundan faydalanıyoruz.
- String osName = System.getProperty(“os.name”);
2) Dönen ifadeyi contains metoduna tabi tutarak işimize yarayacak dallanmayı yapıyoruz.
- osName.contains(“Windows”) || osName.contains(“Linux”)
3) Harici komut veya program koşturmak için Java’ da Runtime , ProcessBuilder ve Process sınıflarından faydalanacağız. Aslında ikiside aynı işi görmekte fakat Runtime sınıfının kontrol edilebilirliği daha güç. Windows üzerinde user oluşturmak çok kolay, her iki sınıfında kullanımını göstermek adına Windows üzerinde Runtime sınıfını kullanalım.
Windows için ;
Aşağıdaki betiği koşturmak yeterli.
Runtime sınıfının getRuntime metodu ile bir boş process çağırıyoruz.
exec metodu ile process oluşturulup koşturuluyor ve bizim tanımladığımız getMessage metodu ile standart uyarı, bilgi ve hata mesajları ekrana bastırılıyor.
- Runtime rt = Runtime.getRuntime();
- String win32=”net user /add “+user.getText()+” “+pass.getText();
- getMessage(rt.exec(win32));
Linux için;
- usta@ubuntu:~$ sudo useradd UserName -g GroupName -b /home -m
- usta@ubuntu:~$ passwd UserPass
İlk satırın icrası ardından Linux kabuğu bizden yönetici şifresi isteyecektir. İkinci aşamada ise oluşturduğumuz hesabın parolasını belirteceğiz. Şu varki, klavye haricinde bir programlama dilinden şifre bilgisi girmek istiyorsak, kod satırımıza –S parametresi eklemeliyiz.
- ProcessBuilder pb = new ProcessBuilder(commands);
- Process process = pb.start();
ProcessBuilder sınıfının kurucu metoduna, ArrayList türündeki komutlarımızı gönderiyoruz. Ardından start vererek işlemi başlatıyoruz. Kabuktaki ilk satırı işlettikten sonra, yönetici parolası istenecek şimdi onu girelim..
- stdin= new PrintWriter( process.getOutputStream());
- stdin.println(pwdSudo.getText());
- stdin.flush();
-S parametresi burada PrintWriter sınıfı aracılığı ile ekrana yönetici şifresi basmaya yarıyor. getOutputStream metodu ile, konsola bir giriş yapılacağını belirtiyoruz. flush metodu ise, buffer’ da veri bulunuyorsa bunları tamamen aktarmaya yarıyor. Konsoldaki ikinci satırda ise, aynı şekilde oluşturduğumuz kullanıcının şifresini giriyoruz. Şimdi her şey güzel fakat. İşlem başarılı mı? Hatalı mı? Bunları bilmek hakkımız. Bunun için mevcut process’ imizin getInputStream() ve getErrorStream() metodlarından faydalanıyoruz ve satır satır komut arayüzünün bize sunduğu bilgileri çekiyoruz ve istediğimiz gibi ekranda gösteriyoruz. Bu şekilde Java ile çalışan, bir komut dizini programı yapılabilir, yada aynı şekilde başka başka executable’ lar çalıştırılabilir..
1 Comment
Çok faydalı oldu teşekkürler.