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.