title: Certain Unix commands fail with "... not found", when executed through Java using JSch
body: <p>I have a piece of code which connects to a Unix server and executes commands.</p>
  
  <p>I have been trying with simple commands and they work fine.</p>
  
  <p>I am able to login and get the output of the commands.</p>
  
  <p>I need to run an Ab-initio graph through Java.</p>
  
  <p>I am using the <code>air sandbox run graph</code> command for this.</p>
  
  <p>It runs fine, when I login using SSH client and run the command. I am able to run the graph. However, when I try to run the command through Java it gives me a <em>"air not found"</em> error.</p>
  
  <p>Is there any kind of limit on what kind of Unix commands JSch supports?</p>
  
  <p>Any idea why I'm not able to run the command through my Java code?</p>
  
  <p>Here's the code:</p>
  
  <pre><code>public static void connect(){
      try{
        JSch jsch=new JSch();  
  
        String host="*****";
        String user="*****";
        String config =
                  "Host foo\n"+
                  "  User "+user+"\n"+
                  "  Hostname "+host+"\n";
  
        ConfigRepository configRepository =
              com.jcraft.jsch.OpenSSHConfig.parse(config);
  
        jsch.setConfigRepository(configRepository);
        Session session=jsch.getSession("foo");
  
        String passwd ="*****";
        session.setPassword(passwd);
        UserInfo ui = new MyUserInfo(){
  
            public boolean promptYesNo(String message){
  
              int foo = 0;
              return foo==0;
            }
        };
        session.setUserInfo(ui);
        session.connect();
  
        String command="air sandbox run &lt;graph-path&gt;";
  
        Channel channel=session.openChannel("exec");
        ((ChannelExec)channel).setCommand(command);
  
        channel.setInputStream(null);
  
        ((ChannelExec)channel).setErrStream(System.err);
  
        InputStream in=channel.getInputStream();
  
        channel.connect();
  
        byte[] tmp=new byte[1024];
        while(true){
          while(in.available()&gt;0){
            int i=in.read(tmp, 0, 1024);
            if(i&lt;0)break;
            page_message=new String(tmp, 0, i);
            System.out.print(page_message);
          }
          if(channel.isClosed()){
            if(in.available()&gt;0) continue; 
            System.out.println("exit-status: "+channel.getExitStatus());
            break;
          }
          try{Thread.sleep(1000);}catch(Exception ee){}
        }
  
        channel.disconnect();
        session.disconnect();
      }
      catch(Exception e){
        System.out.println(e);
      }
  }
  
  public static void main(String arg[]){
      connect();
  }
  
  public String return_message(){
        String ret_message=page_message;
        return ret_message;
  }
  
  public static abstract class MyUserInfo
      implements UserInfo, UIKeyboardInteractive{
      public String getPassword(){ return null; }
      public boolean promptYesNo(String str){ return false; }
      public String getPassphrase(){ return null; }
      public boolean promptPassphrase(String message){ return false; }
      public boolean promptPassword(String message){ return false; }
      public void showMessage(String message){ }
      public String[] promptKeyboardInteractive(String destination,
                          String name,
                          String instruction,
                          String[] prompt,
                          boolean[] echo){
          return null;
      }
  }
  </code></pre>