Wie der Mitbenutzer von diesem question und diesem tutorial erklären, versuche ich eine SimpleSsh-Verbindung einzurichten, um einen einzigen Befehl für eine App auszuführen. Es muss nicht einmal auf eine Antwort warten. HierBasic SSH-Verbindung über JSCH auf Android
ist der Code:
Hauptaktivität: Paket com.example.lucas.shutdown;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCLick(View v){
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer... params) {
try {
executeRemoteShutdown();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
}
public void executeRemoteShutdown(){
String user = "ssh";
String password = "123";
String host = "192.168.1.4";
int port=22;
try{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
Channel channel = (ChannelExec) session.openChannel("exec");
((ChannelExec) channel).setCommand("shutdown /s");
channel.connect();
try{
Thread.sleep(1000);
}catch(Exception ee){}
channel.disconnect();
session.disconnect();
}
catch(Exception e){}
}
}
Der Knopf, der die Aktion ausführt:
<Button
android:text="Shutdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/button"
android:onClick="onCLick" />
Das gleiche Verfahren executeRemoteShutdown()
bereits auf einem diferent Programm in Java funktioniert, aber das, was ich mit Mühe habe, ist, dass die conection und comand die Ausführung scheint nie zu geschehen. Ich folgte den Empfehlungen aus der Frage, die ich oben verlinkt habe, um die ssh-Methode auf einem anderen Thread auszuführen, eine Verzögerung hinzuzufügen, um auf den auf dem Host ausgeführten Befehl zu warten, bevor die Methode beendet wurde, und Internet-Erlaubnis für die Manifest-Datei zu geben.
Dank! Ich habe dieses Projekt aufgrund dieses Problems zur Ruhe gebracht. Nach so langer Zeit werde ich es wieder aufleben lassen, hahaha. –
Sie können die Verbindung nicht unmittelbar nach dem Verbinden/Starten des Befehls trennen. Sie möchten auf den Abschluss des Befehls warten, da er sonst nicht abgeschlossen wird. Siehe [Laufender Befehl über den Kanal "exec" mit JSch gibt keine Ausgabe zurück] (https://stackoverflow.com/questions/36380274/running-command-using-exec-channel-with-jsch-does-not-return- Any-Ausgabe) –