7 Ekim 2013 Pazartesi

Java ile Linux Server'a SSH Kodu Gönderme, Sonuçları İzleme

Kullanıcıların artık yazılımlarla kullanıcı dostu arayüzler ile iletişime geçmek istediği bir dünyada yaşıyoruz. Bu konu sadece son kullanıcıların değil, artık biz geliştiricilerin de talepleri arasına girmiş durumda.

Bu bağlamda Linux Server'ı örnek olarak gösterebiliriz. Putty gibi çeşitli araçlarla bağlanabilen bu serverlar DOS gibi komutlarla çalışmaktadır ve hayli uğraştırıcıdır. İşin içine büyük script'ler girdiği zaman gereksiz bir efor sarfedildiğini iddia edersek yanılmış olmayız.

Java ile Linux Server'ları birbiri ile iletişim haline soktuğumuzda bu sorunu ortadan kaldırabiliriz. Daha önceden hazırladığımız SSH kodunu Java ile gönderirsek ve bu aksiyonları Java'nın desteklediği arayüzlere bağlayabilirsek, bu işi tamamen arayüzlerle halledebiliriz.

Java ile Linux Server'a SSH kodu göndermek Ganymed isimli bir kütüphanenin yardımıyla mümkün. Buraya tıklayarak Ganymed'in güncel JAR dosyasını indirip projenize import edin.

Şimdi aşağıda linux serverımıza bir ls kodu göndereceğiz ve sonuçları konsola yazdıracağız.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class Main {

 private static int exitStatus;
 
 public static void main(String[] args) {
  // ipAdress: IP adresi
  // userName: Linux serverınızdaki kullanıcı adı
  // password: Kullanıcının şifresi
  // dir: ls kodunun sorgulayacağı directory
  // Bu değerler yerine kendi değerlerinizi girmeyi unutmayın
  ArrayList result = lsViaSSH("ipAddress", "userName", "password", "dir");
  
  if(result != null && result.size() > 0) {
   System.out.println("Results are listing below... \n");   
   for(String item : result) {
    System.out.println(item);
   }
  }
  else {
   System.out.println("Result not found");
  }
  
  System.out.println("\nExitStatus: " + exitStatus);
  System.out.println("\nSSH done!");
 }
 
 public static ArrayList lsViaSSH(String hostname, String username, String password, String dir) {
     ArrayList ls = new ArrayList();

     try {
         Connection conn = new Connection(hostname);

         System.out.println("Trying to connect " + hostname);
         conn.connect();
         System.out.println("Connected!");

         System.out.println("Authenticating...");
         boolean isAuthenticated = conn.authenticateWithPassword(username, password);

         if (isAuthenticated == false) {
          System.out.println("Authentication failed!");
             return null;
         }
         else {
          System.out.println("Authenticated!");
         }

         Session sess = conn.openSession();
         System.out.println("Session opened");
         
         System.out.println("Executing command: ls -r " + dir);
         sess.execCommand("ls -r " + dir);

         InputStream stdout = new StreamGobbler(sess.getStdout());
         InputStream stderr = new StreamGobbler(sess.getStderr());

         BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
         BufferedReader br1 = new BufferedReader(new InputStreamReader(stderr));
         
         while (true) {
             String line = br.readLine();
             if (line == null) {
              break;              
             }
             ls.add(line);
         }
         
         while (true) {
             String line = br1.readLine();
             if (line == null) {
              break;              
             }
             ls.add(line);
         }

         sess.close();
         conn.close();
         exitStatus = sess.getExitStatus();
     }
     catch (IOException e) {
         return null;
     }

     if(ls.size() == 0) {
      return null;      
     }

     return ls;
 }

lsViaSSH metoduna gerekli parametreleri gönderdikten sonra Ganymed kütüphanesini kullanarak önce connect oluyoruz. Daha sonra servera kullanıcı adı ve şifre ile authenticate oluyoruz. Hata çıkmazsa bağlantımızdan kendimize bir session açıyoruz.

Bu işlemlerden sonra istediğimiz SSH komutunu server'a gönderebiliriz. execCommand metodu ile SSH kodunu gönderiyoruz. Sonuçlar session'ımızın Stdout objesine düşüyor. Bu objeyi inputstream'e atarak BufferedReader ile sonuçları satır satır okuyarak ls isminde bir ArrayList'e atıyoruz. Bu liste main metodumuza dönüyor ve listeyi konsola yazdırıyoruz.

Eğer SSH kodunda hata yoksa session'ın içindeki ExitStatus objesi 0'a setleniyor, hata varsa hata koduna setleniyor. SSH kodunda hata olması halinde lsViaSSH metodu ArrayList'e hatanın açıklamalarını koyuyor ve konsola sonuçlar yerine hata mesajı gönderiyor.

Böylece Java ile gönderilen SSH kodunun sonuçlarını Java'da görebiliyor ve istediğimiz şekilde kullanıyoruz. Eğer kullanıcı adı ve şifre ile authenticate olmak yerine bir Public Key'iniz varsa Ganymed kütüphanesi bu tür authentication'ları destekleyecek gerekli implementasyonu yapmış durumda.

Ganymed kütüphanesi Linux Server üzerinde yapılan çalışmaları otomatize etmek için iddialı bir araç olacağa benziyor.

Hiç yorum yok:

Yorum Gönder