0

I recently made an app that executes a small ssh command on my pc when a button is pressed , however when I run it nothing seems to happen. Im kinda new to android development - so I'm not too sure If i Used jsh properly.

My main activity is as follows:

package com.amex.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.io.ByteArrayOutputStream;
import java.util.Properties;

public class MainActivity extends AppCompatActivity {


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

    JSch jsch = new JSch();
    Session session = jsch.getSession("exiatron00", "192.168.0.10", 22);
    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("touch /home/exiatron00/Desktop/sshtest.txt");
    channelssh.connect();
    channelssh.disconnect();

    return baos.toString();


}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}

public void Button(View view) {
    try {
        executeRemoteCommand("exiatron00", "NvidiaGtx1!", "192.168.1.10", 22);
    } catch (Exception e) {
        e.printStackTrace();
    }



 }
}

and my manifest is :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.amex.myapplication">
  <uses-permission android:name="android.permission.INTERNET"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
     </activity>
  </application>
</manifest>

But nothing happens when I press the button , the logcat is returns this:

2020-07-20 12:12:10.342 3461-3461/com.amex.myapplication V/AudioManager:    querySoundEffectsEnabled...
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:  com.jcraft.jsch.JSchException: android.os.NetworkOnMainThreadException
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at com.jcraft.jsch.Util.createSocket(Util.java:258)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at com.jcraft.jsch.Session.connect(Session.java:186)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at com.jcraft.jsch.Session.connect(Session.java:145)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at com.amex.myapplication.MainActivity.executeRemoteCommand(MainActivity.java:29)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at com.amex.myapplication.MainActivity.Button(MainActivity.java:56)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflat  er.java:397)
2020-07-20 12:12:10.346 3461-3461/com.amex.myapplication W/System.err:     at  android.view.View.performClick(View.java:7213)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.view.View.performClickInternal(View.java:7187)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.view.View.access$3500(View.java:828)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.view.View$PerformClick.run(View.java:27675)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.os.Handler.handleCallback(Handler.java:900)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:103)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.os.Looper.loop(Looper.java:219)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:8347)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err: Caused by: android.os.NetworkOnMainThreadException
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
2020-07-20 12:12:10.347 3461-3461/com.amex.myapplication W/System.err:     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:389)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.Socket.connect(Socket.java:621)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.Socket.connect(Socket.java:570)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.Socket.<init>(Socket.java:450)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at java.net.Socket.<init>(Socket.java:218)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:     at com.jcraft.jsch.Util.createSocket(Util.java:252)
2020-07-20 12:12:10.348 3461-3461/com.amex.myapplication W/System.err:  ... 17 more

1 Answers1

0

The problem: you are trying to run network operation on main/UI thread, which is forbidden by JSch.

The reason: Main (UI) thread is responsible for displaying user interface and handling user's interactions with application's visual elements. Network operation, or any other work that can take long time period to execute, can freeze UI thread and lead to ANR (Android Not Responding crash, which is fired when UI freezes for some time). So JSch prevents it by checking its execution thread. You should perform your operation on another thread.

You can use handler for that

private Handler mHandler;

private HandlerThread mHandlerThread;

public void startHandlerThread(){
    mHandlerThread = new HandlerThread("HandlerThread");
    mHandlerThread.start();
    mHandler = new Handler(mHandlerThread.getLooper());
}

// Then in your button method
mHandler.postDelayed(
    new Runnable() { 
        public void run() {
            executeRemoteCommand(yourParameters); 
        }
    }
);

OR You can try to run it on another thread using oldschool Java Thread

Thread worker = new Thread(
    new Runnable() { 
        public void run() {
            executeRemoteCommand(yourParameters); 
        }
    }
);
worker.start();
Steyrix
  • 2,796
  • 1
  • 9
  • 23
  • Sill no luck , With your first Solution I get: 2020-07-20 15:03:02.191 20179-20179/com.amex.myapplication W/System.err: com.jcraft.jsch.JSchException: android.os.NetworkOnMainThreadException i.e essentially the same as before. – Bilal Ahmed Jul 20 '20 at 14:04
  • With your second solution I get : "2020-07-20 15:09:47.987 20882-20962/com.amex.myapplication W/System.err: com.jcraft.jsch.JSchException: Algorithm negotiation fail " – Bilal Ahmed Jul 20 '20 at 14:12
  • @BilalAhmed yeah, I made a mistake with first solution - handler should be associated with another thread. I edited my answer. However your problem still will be Algorithm negotiation fail. But this is another question, which was already discussed here https://stackoverflow.com/questions/6263630/jschexception-algorithm-negotiation-fail – Steyrix Jul 21 '20 at 10:33