2016-02-28 201 views
1

我想在java中创建代码,通过在Linux中成功测试的minicom包发送使用GSM调制解调器的SMS。如何通过Java中的JSch SSH会话使用需要交互式终端的命令行* nix命令?

我知道我在使用JSch库来SSH和使用minicom。我已经用普通的Linux命令成功地测试了这些代码。

import java.io.InputStream; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 


public class SSHCommandExecutor { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     String host="localhost"; 
     String user="root"; 
     String password="XXXXX"; 
     String command1="minicom"; 
     try{ 

      java.util.Properties config = new java.util.Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      JSch jsch = new JSch(); 
      Session session=jsch.getSession(user, host, 22); 
      session.setPassword(password); 
      session.setConfig(config); 
      session.connect(); 
      System.out.println("Connected"); 

      Channel channel=session.openChannel("exec"); 
      ((ChannelExec)channel).setCommand(command1); 
      channel.setInputStream(null); 
      ((ChannelExec)channel).setErrStream(System.err); 

      InputStream in=channel.getInputStream(); 
      channel.connect(); 
      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()){ 
       System.out.println("exit-status: "+channel.getExitStatus()); 
       break; 
       } 
       try{Thread.sleep(1000);}catch(Exception ee){} 
      } 
      channel.disconnect(); 
      session.disconnect(); 
      System.out.println("DONE"); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

    } 

} 

但问题是,我不能命令发送到小型机它会输出这样的:

没有光标的运动能力(厘米)

我相信这需要终端环境我不想在Java中使用终端模拟器。我只是想通过Java代码发送命令给minicom。

有什么办法可以做到这一点?

PS:我已经尝试过使用smslib解决这个问题的其他可能性,但是它在rxtx和其他解决方案的Linux原因中无法正常工作。现在只有minicom正常工作。

回答

1

如果问题确实是命令不是在非交互式终端上启动,但它并不真正需要任何交互性,您可以通过使用.setPty(true)调用简单地使“exec”通道“交互式”。

channel.setPty(true); 
channel.connect(); 
+0

感谢它在控制台中使用minicom获得午餐,但是有没有什么办法可以将AT命令发送到此代码中的minicom? –

+0

不客气。我相信我已经回答了你的问题。发送AT命令是一个新问题的主题。 –