2016-12-09 28 views
1

このquestionの仲間のユーザーとこのtutorialが説明しているように、私はsimples ssh接続をセットアップしてアプリケーションで1つのコマンドを実行しようとしています。どんな反応も待つ必要はありません。ここでアンドロイドでJSCH経由で基本的なSSH接続

はコードです:

主な活動: パッケージ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" /> 

すでに純粋なJavaでdiferentプログラムに取り組んでいますexecuteRemoteShutdown()これと同じ方法で、しかし、私はとのトラブルを抱えているものがあることたっとCOMANDです実行は決して起こらないようです。私は上記のリンク先の質問から、別のスレッドでsshメソッドを実行し、メソッドが終了してマニフェストファイルに対してインターネット許可を与える前に、ホスト上でコマンドが実行されるのを待つための遅延を追加しました。

答えて

1

[OK]を、ここで私たちは、あなたがボタンの右といくつかの小さな変更を実装する必要があり、それが動作します 、私はこれを修正しましょう。..あなたのコードは大丈夫ですが、いくつかの小さなエラーがでている 、行く:

MainActivity :これも遅れることなくうまく働いている私のプロジェクトであなたのlayout.xmlに「

をonclickの「:

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 =アンドロイド」を削除することができます。あなたはマニフェストファイルのインターネット許可が必要です。私はこの許可がアプリケーションの開始時にすぐに許可されると思います。
これは役に立ちます。時には小さなものが違いを生むことがあります。

種類は
chwzr

+0

おかげに関しては!私はこの問題のためにこのプロジェクトを休んだ。長い間、私はそれを復活させます。 –

+0

接続/開始コマンドの直後に切断することはできません。コマンドが完了するのを待つ必要があります。そうしないと、コマンドが完了しません。 [JSchで "exec"チャンネルを使用してコマンドを実行すると出力が返されない](https://stackoverflow.com/questions/36380274/running-command-using-exec-channel-with-jsch-does-not-return-任意の出力) –

関連する問題