Verwenden JSch sudo Beispiel und Kanal.setPty für die Ausführung von sudo-Befehl auf remote-host

Habe ich verwendet JSch Sudo Beispiel unter folgendem link:

http://www.jcraft.com/jsch/examples/Sudo.java.html

Und verändert es ein bisschen und loszuwerden, alle die Dialoge, wie ich es für EC2-Instanzen mit PuTTY.

Nun mein code sieht wie folgt aus:

import com.jcraft.jsch.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;

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

      String host=null;
      if(arg.length>0){
        host=arg[0];
      }

      String privateKey = "my private key.pem";

      jsch.addIdentity(privateKey, "");
      Session session=jsch.getSession("ec2-user", "xx.xx.xx.xx", 22);

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

      session.connect();

      String command="sudo mkdir /data";
      String 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);

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

Aber ich bin immer der Fehler

sorry Sie müssen ein tty to run sudo

Ich habe auch versucht zu verwenden ((ChannelExec) channel).setPty(true) aber ich kann das Programm ausführen, sobald aber das nächste mal, für den selben EC2-Instanz bekomme ich folgende Fehlermeldung aber für eine neue Instanz, funktioniert es zum ersten mal wieder.

com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read
sudo mkdir /data
Exception in thread "main" com.jcraft.jsch.JSchException: session is down
        at com.jcraft.jsch.Session.openChannel(Session.java:791)

Dann auch ich konnte nicht ssh der remote-host über die Befehlszeile als auch.

Kann jemand bitte guide mich, was ich tun müssen, um zu laufen sudo Befehl auf dem remote host.

Ich habe den gleichen Fehler, sollte ich setPty(true) oder setPty(false) ? einige schlugen vor, die Verwendung falschen um dieses Problem zu beheben. Weder die option scheint, dieses Problem zu lösen. Könnte jemand mir bitte helfen mit diesem ?

InformationsquelleAutor waqas | 2012-08-15

Schreibe einen Kommentar