2016-12-09 10 views
1

Как парень из этого question и этот tutorial объясните, я пытаюсь настроить простое ssh-соединение для выполнения одной команды в приложении. Не нужно даже ждать ответа.Базовый SSH-соединение через АОH на android

Вот код:

Основная деятельность: пакет 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){} 
    } 
} 

Кнопка, которая выполняет действие:

<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" /> 

Этот же метод executeRemoteShutdown() уже работает по программе Diferent в чистом Java, однако, что у меня возникают проблемы с является то, что Conection и COMAND исполнение, похоже, никогда не произойдет. Я следовал рекомендациям из вопроса, который я связал выше, чтобы запустить метод ssh в другом потоке, добавить задержку для ожидания выполнения команды на узле до того, как метод завершится, и предоставил интернет-разрешение на файл манифеста.

ответ

1

Хорошо здесь мы идем, ваш код хорошо, но некоторые небольшие ошибки в .. позвольте мне это исправить, вы должны реализовать правой кнопкой и некоторые небольшие изменения, и он будет работать:

MainActivity :

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); 


    Button btn = (Button) view.findViewById(R.id.button); 
      btn.setOnClickListener(new View.OnClickListener() { 
       //start execution of ssh commands 
       @Override 
       public void onClick(View v){ 
        new AsyncTask<Integer, Void, Void>(){ 
         @Override 
         protected Void doInBackground(Integer... params) { 
          try { 
           executeSSHcommand(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
          return null; 
         } 
        }.execute(1);      
       } 
      }); 
} 

    public void executeSSHcommand(){ 
     String user = "xxx"; 
     String password = "xxx"; 
     String host = "192.168.xxx.xxx"; 
     int port=22; 
     try{ 

      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, port); 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setTimeout(10000); 
      session.connect(); 
      ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
      channel.setCommand("your ssh command here"); 
      channel.connect(); 
      channel.disconnect(); 
      // show success in UI with a snackbar alternatively use a toast 
      Snackbar.make(getActivity().findViewById(android.R.id.content), 
        "Success!", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
     catch(JSchException e){ 
      // show the error in the UI 
      Snackbar.make(getActivity().findViewById(android.R.id.content), 
        "Check WIFI or Server! Error : "+e.getMessage(), 
        Snackbar.LENGTH_LONG) 
        .setDuration(20000).setAction("Action", null).show(); 
     } 
    } 
} 

Дополнительно вы можете удалить строку «андроид: OnClick =» OnClick»" в вашем layout.xml

в моем проекте это работает просто отлично, даже без задержки. проклятия вам нужно разрешение интернета в файле манифеста. но я думаю, что это разрешение предоставит сразу же после запуска приложения.
надеюсь, что это поможет, иногда мелочи имеют значение.

вид касается
chwzr

+0

Спасибо! Из-за этой проблемы я поставил этот проект на отдых. После столь долгого времени я воскрешу его хахаха. –

+0

Вы не можете отключиться сразу после команды подключения/запуска. Вы хотите дождаться завершения команды, иначе она не будет завершена. См. [Выполнение команды с использованием канала «exec» с JSch не возвращает никакого вывода] (https://stackoverflow.com/questions/36380274/running-command-using-exec-channel-with-jsch-does-not-return- любой-выход) –

Смежные вопросы