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.
InformationsquelleAutor waqas | 2012-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich ähnlichen code in einem Projekt an dem ich arbeite, und immer war der gleiche Fehler. Ich habe dieses Problem gelöst, mit der
setPty(true)
wie du.Ich glaube, du bist immer diesen Fehler, weil Sie nicht in der Nähe der Bäche in Ihrem code. Wenn Sie mit Java 1.7, können Sie einen resource-block wie folgt:
oder try...finally-block Muster aus vergangenen Versionen.
InformationsquelleAutor BlueRebel
Nach Einstellung
das gemeldete problem in meinem code gelöst habe.
InformationsquelleAutor Jeevan Pingali
Standardmäßig SUDO ist so konfiguriert, dass eine TTY-Schnittstelle. Das ist, SUDO wird erwartet, dass von einer login-shell.
Liegt wahrscheinlich daran dass deine /etc/sudoers-Datei (oder eine Datei, die es enthält) ist:
Aber die option -S in der sudo machen es zu Lesen von der Standardeingabe.
Jsch nutzt das gleiche und versucht, das Kennwort zu senden. Wenn Sie möchten, Jsch, zu arbeiten, ohne Aufforderung das Kennwort , müssen Sie deaktivieren die requiretty aus der sudoers-Datei...mit dem Befehl visudo wie folgt
oder
InformationsquelleAutor nav3916872