2016-04-03 20 views
1

çıktısını geri göndermiyor JSch ile Android üzerinden SSH kullanan bir Linux sunucusunda bir komut çalıştırmaya çalışıyorum.JSch ile "exec" kanalını kullanarak çalıştırma komutu

Bildiğim kadarıyla sunucuya bağlanıyorum, ancak komutun sonuçlarını almaya çalıştığımda hiçbir şey alamıyorum. Sunucuya

Bağlan:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final String TAG = "TESTING"; 

     new AsyncTask<Integer, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Integer... params) { 
       try { 
        Log.d(TAG, SSHCommand.executeRemoteCommand("username", "password", "192.168.0.1", 22)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }.execute(1); 
    } 
} 

Burada ne eksik:

public class SSHCommand { 

    public static String executeRemoteCommand(
      String username, 
      String password, 
      String hostname, 
      int port) throws Exception { 

     JSch jsch = new JSch(); 
     Session session = jsch.getSession(username, hostname, port); 
     session.setPassword(password); 

     // Avoid asking for key confirmation 
     Properties prop = new Properties(); 
     prop.put("StrictHostKeyChecking", "no"); 
     session.setConfig(prop); 

     session.connect(); 

     // SSH Channel 
     ChannelExec channelssh = (ChannelExec) 
       session.openChannel("exec"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     channelssh.setOutputStream(baos); 

     // Execute command 
     channelssh.setCommand("ls"); 
     channelssh.connect(); 
     channelssh.disconnect(); 

     return baos.toString(); 
    } 
} 

verileri al?

cevap

2

Herhangi bir çıkış döndürülmeden önce, komutu başlattıktan hemen sonra bağlantıyı kesersiniz.

"exec" kanalının kapanmasını beklemek zorundasınız (komut bittiğinde kapanır).

official JSch example for the "exec" channel'a bakın.

byte[] tmp=new byte[1024]; 
while(true){ 
    while(in.available()>0){ 
    int i=in.read(tmp, 0, 1024); 
    if(i<0)break; 
    System.out.print(new String(tmp, 0, i)); 
    } 
    if(channel.isClosed()){ 
    if(in.available()>0) continue; 
    System.out.println("exit-status: "+channel.getExitStatus()); 
    break; 
    } 
    try{Thread.sleep(1000);}catch(Exception ee){} 
} 
+0

Teşekkür ederiz! bu işe yaradı – Will

İlgili konular