1

Below is the program that I am using to ssh to one of the remote servers and its working fine.

My question is- Is there any way I can execute the shell scripts that I have on my windows machine on the remote server?

If Yes? then how I can modify my below code to execute the shell scripts on the remote server that I am trying to connect.

public class SampleTest{
  public static void main(String[] arg){

    try{
      JSch jsch=new JSch();

      String host=null;
      if(arg.length>0){
        host=arg[0];
      }
      else{
        host=JOptionPane.showInputDialog("Enter username@hostname",
                                         System.getProperty("user.name")+
                                         "@lvsaishdc3in0001.lvs.host.com"); 
      }
      String user=host.substring(0, host.indexOf('@'));
      host=host.substring(host.indexOf('@')+1);

      Session session=jsch.getSession(user, host, 22);

      String passwd = JOptionPane.showInputDialog("Enter password");
      session.setPassword(passwd);

      UserInfo ui = new MyUserInfo(){
        public void showMessage(String message){
          JOptionPane.showMessageDialog(null, message);
        }
        public boolean promptYesNo(String message){
          Object[] options={ "yes", "no" };
          int foo=JOptionPane.showOptionDialog(null, 
                                               message,
                                               "Warning", 
                                               JOptionPane.DEFAULT_OPTION, 
                                               JOptionPane.WARNING_MESSAGE,
                                               null, options, options[0]);
          return foo==0;
        }

      };

      session.setUserInfo(ui);

      //session.connect();
      session.connect(30000);   // making a connection with timeout.

      Channel channel=session.openChannel("shell");

      // Enable agent-forwarding.
      //((ChannelShell)channel).setAgentForwarding(true);

      channel.setInputStream(System.in);
      /*
      // a hack for MS-DOS prompt on Windows.
      channel.setInputStream(new FilterInputStream(System.in){
          public int read(byte[] b, int off, int len)throws IOException{
            return in.read(b, off, (len>1024?1024:len));
          }
        });
       */

      channel.setOutputStream(System.out);

      /*
      // Choose the pty-type "vt102".
      ((ChannelShell)channel).setPtyType("vt102");
      */

      /*
      // Set environment variable "LANG" as "ja_JP.eucJP".
      ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
      */

      //channel.connect();
      channel.connect(3*1000);
    }
    catch(Exception e){
      System.out.println(e);
    }
  }

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

2 Answers 2

2

You can execute the scripts without even copying them to remote server. Invoke a bash shell and pipe the commands from shell script to the remote process ( bash in this case ).

So, here is a simple script echo "Hi there!"; env. Now we can run this script like this:

$ echo 'echo "Hi there!"; env' | ssh localhost bash
tuxdna@localhost's password: 
Hi there!
XDG_SESSION_ID=10
SHELL=/bin/bash
SSH_CLIENT=127.0.0.1 43064 22
USER=tuxdna
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
MAIL=/var/mail/tuxdna
PWD=/home/tuxdna
LANG=en_IN
HOME=/home/tuxdna
SHLVL=2
LANGUAGE=en_IN:en
LOGNAME=tuxdna
SSH_CONNECTION=127.0.0.1 43064 127.0.0.1 22
XDG_RUNTIME_DIR=/run/user/1000
_=/usr/bin/env

Essentially you have to write the shell script to STDIN of the remote process.

Sign up to request clarification or add additional context in comments.

Comments

0

Yes, but probably not in the way you are thinking.

You need to copy the script over to the remote system.

Check out http://seancode.blogspot.com.au/2008/02/jsch-scp-file-in-java.html who's written a FileSender wrapper that might help

You could also check out Copying a file in sftp with jsch library just out of interest

You could also check out the included examples http://www.jcraft.com/jsch/examples/ (knew they were there somewhere)

5 Comments

Ok. So that means, the script need to be on remote server to be able to run? Right? if Yes, then I can copy my script to remote server, then is it possible to run that shell script that is there on the remote server?
Yes and yes. Copy script to remote, execute script on remote.
How I can do that using the above program that I have? It will be of great help if you can help me out here with an example related to my code.
I'd imagine, before you call Channel channel=session.openChannel("shell"); you'll want to copy the file. Take a look at some of the links. The examples that come with jsh are excellent, that's how I worked it out
Take a look at jcraft.com/jsch/examples/ScpTo.java.html which is the secure copy to implementation

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.