programmazione:android:applicazione_per_conn_ssh
−Indice
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: 08/05/2025 10:02 da 127.0.0.1