Mehrere Befehle mit JSch
Meine Anforderung ist wie folgt:
Ich habe den login auf Unix-Rechner mit meinen Zugangsdaten und einmal einloggen, das muss ich sudo für die verschiedenen Benutzer. Einmal sudo erfolgreich ist, habe ich zum aufrufen von shell in nohup. Nach Abschluss der Ausführungen, engen Kanal und Sitzung beide.
Ich versuchte den ersten Schritt, die Verbindung mittels sudo-Kommando, aber ich weiß nicht, wie zum aufrufen von shell-Skript nach dem sudo-Befehl.
In der unten code ich bin in der Lage, sudo-Kommando, aber nachdem ich sudo-Zugriff, wie kann ich eine shell ausführen im nohup mit Benutzer masteruser
. So, die erforderlichen Dateien erstellt meine shell hat der Eigentümer als masteruser
.
public class SSHUploader {
Session session = null;
public SSHUploader(){
}
public void connect(){
try {
JSch jsch = new JSch();
session = jsch.getSession("user", "xxx.xxx.xx.xx", 22);
session.setPassword("test");
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void executeCommand(String script) throws JSchException, IOException{
System.out.println("Execute sudo");
String sudo_pass = "test";
ChannelExec channel = (ChannelExec) session.openChannel("exec");
((ChannelExec) channel).setCommand( script);
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) {
System.out.println(ee);
}
}
channel.disconnect();
System.out.println("Sudo disconnect");
}
public void disconnect(){
session.disconnect();
}
public static void main(String... args) throws JSchException, IOException {
SSHUploader up = new SSHUploader();
up.connect();
up.executeCommand("sudo -u masteruser bash");
up.disconnect();
}
}
InformationsquelleAutor user1251973 | 2013-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die Ausführung mehrerer Befehle in der Reihenfolge, erstellen Sie einen Befehls-string wie folgt:
Führen Sie es aus und übergeben Sie diesen string zu Ihrem oben genannten Methode.
Auch das hinzufügen "echo Ausgeführt script_X; ./script_X" scheint nett zu haben, mit mehreren Befehlen.
Nur beachten Sie, dass dies der *nix-shell spezifische Lösung - Es ist weder SSH noch JSch-Funktion - Also auf anderen Systemen (wie Windows), eine andere syntax benötigt werden könnten. +1
Ich hatte Probleme mit dieser Art der Umsetzung. stattdessen habe ich erstellt, 2 Kanäle statt 1(hier habe ich 2 Befehle ausführen)
InformationsquelleAutor Sumit Sharma
Der Beitrag mag zwar alt sein, aber ich fand eine andere einfache Möglichkeit, die Ihnen erlaubt zu retreive die Ausgabe von jedem Befehl getrennt. Beachten Sie, dass dieser code ausgeführt werden soll, sobald die Sitzung eröffnet wurde, wie gezeigt in den Beispielen (http://www.jcraft.com/jsch/examples/Exec.java.html):
Wo
printOutput
verwendetchannel.getInpuStream()
zu Lesen, das Ergebnis des Befehls.InformationsquelleAutor yanneke