Linux Rechner per ssh runterfahren mit Java

mysticado

Aktives Mitglied
Hallo Leute,
ich programmiere gerade ein kleines Rechenzentrums-Cluster und habe folgendes Problem - wenn ein Rechner nicht weiter ausgelastet ist, möchte ich ihn runterfahen...nach Möglichkeit per ssh.
Nun dachte ich mir, ich mache es wie folgt:

Code:
import java.io.IOException;

class Test{

public static void main(String[] args) throws IOException{
Process p = Runtime.getRuntime().exec("ssh user@192.168.0.3 \"sudo shutdown -P now\"");
}
}

Leider reagiert der remote Rechner jedoch nicht auf diesen Befehl. Was habe ich falsch gemacht, bzw. was kann ich machen, um diesen Rechner runterzufahren?
Irgend welche Ideen????

Danke schon mal im voraus!
Viele Grüße
 
In /etc/sudoers folgendes geändert/hinzugefügt:

ich ALL=(user) ALL

Meinst du das?

P.S. Der Befehl funktioniert so ohne Probleme wenn ich ihn in der Kommandozeile eintippe, nur wird er irgendwie nicht angenommen, wenn es meine Java-Datei macht. Hmm, was könnte es sein!?
 
Das sudoers file korrekt angepasst und schon sollte die Befehlsausführung auch ohne Passwort klappen. Ist natürlich nicht wirklich schön was den Sicherheitsaspekt anbelangt, aber mir ist das unwichtig im Moment.
Wie gesagt, wenn ich den Befehl in der shell eingebe funktioniert alles, auch ohne Passworteingabe (ssh braucht kein Passwort wg. "known_hosts").
Um nochmal auf meine Frage zurückzukommen: Weiss einer wieso der Befehl nicht auch über meinen Code klappt? Und, hätte jemand zufällig eine Alternative, aber auch über Java?
 
Du kannst auch sudo so konfigurieren das nur für einen Befehl für diesen bestimmten User kein Passwort erforderlich ist, für den rest schon. Hast du schon mal das ssh Konstrukt in der Shell so ausgeführt? Also nicht am Server sonder von lokal aus direkt
Code:
ssh user@192.168.0.3 "sudo shutdown -P now"
eingeben?
 
Benutze die [c]exec()[/c]-Version, die ein Array erwartet und übergib den SSH-Befehl dort als einzelnes Argument:

Java:
.exec(new String[] { "ssh", "foo@bar", "sudo shutdown -P now" };

Bei deiner aktuellen Variante wird der String an den Leerzeichen gespalten. Dadurch lautet der Befehlsname [c]"sudo[/c] und diesen gibt es nicht.
 
Leute vielen Dank für die Unterstützung - hab wieder was Neues dazugelernt! 🙂

Ich muss jedoch zugeben, ich hab es ganz anders gelöst - ich habe an den einzelnen Rechnern jeweils ein kleines bash-skript erstellt welches nur die Funktion "shutdown -h now" enthält und dieses bash-skript rufe ich nun per exec() auf 🙂

Das ist das Tolle an der Informatik - es gibt so viele verschiedene Wege! 🙂

Vielen Dank nochmal!!
 
Dann hättest Du auch gleich [c]halt[/c] oder [c]poweroff[/c] (letzteres dürfte wohl eher [c]shutdown -P[/c] entsprechen) nehmen können. Das ist zwar glaube ich nicht überall vorhanden, aber mir ist noch kein Linux begegnet, bei dem das auch der Fall ist.
 

Zurück
Oben