2

I want to run the follow commands: ssh sudouser@host1 sudo mkdir aaa

sudoUser can run sudo command without input password. I referred to the following links : here, here, and here. I made my scripts. But after I run code below, it always hangs there.

So how can I handle the scenario of sudo without password?

import com.jcraft.jsch.*;
import java.io.*;

public class sudo{
  public static void main(String[] arg){
    try{
      JSch jsch=new JSch();

      String host="hostip";




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

       session.setPassword("pass");
       java.util.Properties config = new java.util.Properties();
       config.put("StrictHostKeyChecking", "no");
       session.setConfig(config);

      session.connect();


      String command="mkdir try";
      String sudo_pass=null;

      sudo_pass="";


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

     // man sudo
     // -S The -S (stdin) option causes sudo to read the password from the
     // standard input instead of the terminal device.
     // -p The -p (prompt) option allows you to override the default
     // password prompt and use a custom one.
     ((ChannelExec)channel).setCommand("sudo -S -p '' "+command);

     ((ChannelExec) channel).setPty(true);

     InputStream in=channel.getInputStream();
      OutputStream out=channel.getOutputStream();
     ((ChannelExec)channel).setErrStream(System.err);

     channel.connect();


     out.write((sudo_pass+"\n").getBytes());
     out.flush();

     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();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }
}
Community
  • 1
  • 1
Linda
  • 21
  • 5

2 Answers2

0

In this line

((ChannelExec)channel).setCommand("sudo -S -p '' "+command);

you're setting the -S and -p options which are probably causing it to hang because it's now waiting for password input.

bmcculley
  • 2,048
  • 1
  • 14
  • 17
  • If I just input ((ChannelExec)channel).setCommand("sudo "+command), It will have a "password" prompt. – Linda May 29 '16 at 11:04
0

My issue is solved. Below is my findings.

  1. In /etc/sudoers, if Defaults requiretty is commented, we cannot use ((ChannelExec) channel).setPty(true); or it will just hang there. If requiretty is enabled, we need to setPty to true.
  2. If your sudoer does not need password to switch to root, you still need to give sudoer password to run ((ChannelExec)channel).setCommand("sudo -S -p '' "+command);.

3.If you changed /etc/sudoers file for several times and it's better for you to reboot your host, it seems the host might be confused after you change the file too many times.

Linda
  • 21
  • 5