Verwenden Sie JSch sudo example und Channel.setPty, um den Befehl sudo auf dem Remote-Host auszuführen

Ich habe JSch Sudo Beispiel unter folgendem Link benutzt:

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

Und änderte es ein bisschen und werde alle Dialoge los, wie ich es für EC2-Instanzen mit PuTTY verwenden muss.

Jetzt sieht mein Code so 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 bekomme den Fehler

Entschuldigung, Sie müssen ein tty haben, um sudo auszuführen

Ich habe auch versucht, zu verwenden((ChannelExec) channel).setPty(true) aber ich kann das Programm einmal ausführen, aber beim nächsten Mal erhalte ich für dieselbe EC2-Instanz die folgende Fehlermeldung, aber für eine neue Instanz funktioniert es zum ersten Mal wieder einwandfrei.

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)

Und dann konnte ich den Remote-Host auch nicht von der Kommandozeile aus sshen.

Kann mir bitte jemand zeigen, was ich tun muss, um zu rennensudo Befehl auf dem Remote-Host.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage