Barra laterale

programmazione:android:applicazione_per_conn_ssh

Applicazione Android per connessione SSH

Autore: Fabio Di Matteo
Ultima revisione: 20/12/2017 - 09:38

In questo articolo vedremo come fare uso di una libreria esterna (Ssch) per la connessione ad un server ssh, come usare i thread e come manipolare i widget da un thread che non è quella della view .

Includere libreria esterna Jsch nel nostro progetto con Android Studio

  • Per prima cosa dobbiamo includere nel nostro progetto il file jar della libreria spostandolo nella cartella libs della nostra applicazione.
  • Click sul file jar in android studio e scegliere Aggiungi come libreria
  • Controllare che sia stata inclusa in build.gradle

Maggiori info: Adding external library in Android studio

Codice (versione bloccante della gui)

package com.test.fabio.sshtest;
 
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
 
//Per jsch
import com.jcraft.jsch.*;
import java.io.*;
import java.util.Properties;
 
//widget
import android.widget.TextView;
 
import static android.os.SystemClock.sleep;
 
 
class sshCon extends Thread{
 
    /**
     * JSch Example Tutorial
     * Java SSH Connection Program
     */
   public String status="";
   public String Err="";
 
 
    public void run() {
 
        /*Edit this*/
        String host="192.168.1.61";
        String user="user";
        String password="pass";
        String command1="echo 'Ciao Mondo' > /home/user/Desktop/hello_world.txt";
        int port=22;
 
 
        try{
            status="";
            Err="";
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            Session session=jsch.getSession(user, host, port);
            session.setPassword(password);
            session.setConfig(config);
            session.connect();
            System.out.println("Connected");
 
            Channel channel=session.openChannel("exec");
            ((ChannelExec)channel).setCommand(command1);
            channel.setInputStream(null);
            ((ChannelExec)channel).setErrStream(System.err);
 
            InputStream in=channel.getInputStream();
            channel.connect();
            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()){
                    System.out.println("exit-status: "+channel.getExitStatus());
                    break;
                }
                try{Thread.sleep(1000);}catch(Exception ee){}
            }
            channel.disconnect();
            session.disconnect();
            System.out.println("DONE");
            //Connessione avvenuta con successo
            status="OK";
        }catch(Exception e){
            e.printStackTrace();
            status="ERR";
            Err=e.toString();
        }
 
    }
 
}
 
public class MainActivity extends AppCompatActivity {
 
    TextView txtOut ;
 
    public void ssh0(View view)
    {
        //Avvio il thread per la connessione ssh
        sshCon con = new sshCon();
        Thread t = new Thread(con);
        t.start();
 
        //Aspetto che il thread termini
        while(t.isAlive())  sleep(500);
 
        //Stampo l'esito della connessione
        if (!con.Err.isEmpty())
        {
            txtOut.setText("Impossibile connettersi...! \n\n");
            txtOut.append(con.Err);
        }else{
            txtOut.setText("Connessione: "+con.status.toString()+"\n\n");
            txtOut.append("Connessione avvenuta con successo!");
        }
 
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txtOut = findViewById(R.id.txtOut);
    }
 
 
 
 
}//MainActivity

Interfaccia

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/myLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.test.fabio.sshtest.MainActivity">
 
    <Button
        android:id="@+id/button0"
        android:layout_width="137dp"
        android:layout_height="49dp"
        android:onClick="ssh0"
        android:text="Ssh0"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.502"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.198" />
 
    <TextView
        android:id="@+id/txtOut"
        android:layout_width="322dp"
        android:layout_height="267dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button0" />
</android.support.constraint.ConstraintLayout>

Codice versione non bloccante della Gui

In questa versione dell'app la gui non viene bloccata dal thread che esegue la connesione ssh. Notate l'utilizzo di runOnUiThread() per manippolare i widget della view da un altro thread. Adesso , inoltre, la classe SshCon risiede dentro la classe MainActivity .

package com.test.fabio.sshtest;
 
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
 
//Per jsch
import com.jcraft.jsch.*;
import java.io.*;
import java.util.Properties;
 
//widget
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
 
    TextView txtOut ;
 
    public void ssh0(View view)
    {
        txtOut.setText("Connessione in corso ... \n\n");
        //Avvio il thread per la connessione ssh
        sshCon con = new sshCon();
        Thread t = new Thread(con);
        t.start();
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txtOut = findViewById(R.id.txtOut);
    }
 
    class sshCon extends Thread{
 
        /**
         * JSch Example Tutorial
         * Java SSH Connection Program
         */
        private String Err="";
 
        public void run() {
 
        /*Edit this*/
            String host="192.168.1.186";
            String user="user";
            String password="pass";
            String command1="echo 'Ciao Mondo' > /home/user/Desktop/hello_world.txt";
            int port=22;
 
 
            try{
                Err="";
                java.util.Properties config = new java.util.Properties();
                config.put("StrictHostKeyChecking", "no");
                JSch jsch = new JSch();
                Session session=jsch.getSession(user, host, port);
                session.setPassword(password);
                session.setConfig(config);
                session.connect();
                System.out.println("Connected");
 
                Channel channel=session.openChannel("exec");
                ((ChannelExec)channel).setCommand(command1);
                channel.setInputStream(null);
                ((ChannelExec)channel).setErrStream(System.err);
 
                InputStream in=channel.getInputStream();
                channel.connect();
                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()){
                        System.out.println("exit-status: "+channel.getExitStatus());
                        break;
                    }
                    try{Thread.sleep(1000);}catch(Exception ee){}
                }
                channel.disconnect();
                session.disconnect();
                System.out.println("DONE");
                //Connessione avvenuta con successo
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        txtOut.setText("Connessione avvenuta con successo!");
                    }
                });
            }catch(Exception e){
                //Errore nella connessione
                e.printStackTrace();
                Err=e.toString();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        txtOut.setText("Connessione Fallita!\n\n");
                        txtOut.append(Err);
                    }
                });
            }
 
        }
 
 
 
    }
 
 
 
}//MainActivity

programmazione/android/applicazione_per_conn_ssh.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)