2016-04-03 267 views
1

我想执行一个命令在一个Linux服务器上使用Android与JSch的SSH。使用“执行”通道与JSch运行命令不会返回任何输出

据我所知我连接到服务器,但当我试图检索命令的结果时,我什么都没有。

连接到服务器:

public class SSHCommand { 

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

     JSch jsch = new JSch(); 
     Session session = jsch.getSession(username, hostname, port); 
     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("ls"); 
     channelssh.connect(); 
     channelssh.disconnect(); 

     return baos.toString(); 
    } 
} 

检索数据:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final String TAG = "TESTING"; 

     new AsyncTask<Integer, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Integer... params) { 
       try { 
        Log.d(TAG, SSHCommand.executeRemoteCommand("username", "password", "192.168.0.1", 22)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }.execute(1); 
    } 
} 

缺少什么我在这里?

回答

2

在任何返回输出之前,您在启动命令后立即断开连接。

您必须等待“exec”通道关闭(一旦命令结束,它将关闭)。

查看official JSch example for the "exec" channel

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()){ 
    if(in.available()>0) continue; 
    System.out.println("exit-status: "+channel.getExitStatus()); 
    break; 
    } 
    try{Thread.sleep(1000);}catch(Exception ee){} 
} 
+0

谢谢!这工作 – Will