fragen stichworte

Remote-SSH-Befehl über Java-Programm

Zunächst einmal sind meine Linux-Kenntnisse begrenzt! Ich bin eher ein Entwickler, der gelegentlich einige Server verwaltet :-)

Ich arbeite also auf einer Farm von RHEL5/6-Servern (gemischt) und möchte Folgendes tun: Ich habe ein Java-Programm auf einem Master-Server, das Befehle auf einigen Remote-Computern ausführt. Das Java-Programm sendet meine Befehle korrekt an das Betriebssystem - lokale Befehle können problemlos ausgeführt werden. Mein Problem ist die Ausführung von Befehlen auf den Remote-Servern:

  • Ich habe die SSH-Schlüssel, mit denen mein Master einfach Root-Rechte für die Slaves erhält
  • Mein Befehl funktioniert, wenn ich ihn direkt über ein Terminal auslöst (z. B. ssh root@192.168.1.1 "cd/opt/bla")
  • Ich habe verschiedene Ansätze ausprobiert, mit unterschiedlichen Ergebnissen - keine davon ist korrekt:)

Versuch Nr. 1

$ ssh root@192.168.1.1
Pseudo-terminal will not be allocated because stdin is not a terminal.
Host key verification failed.

Da ich mit Google vertraut bin, habe ich über tty gelesen, das das Problem lösen sollte, aber nur zu:

führte

Versuch Nr. 2

$ ssh -t -t root@192.168.1.1
tcgetattr: Invalid argument
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
RSA key fingerprint is <somehex>.

Also meine Anwendung blieb an diesem Punkt hängen, seltsamerweise nach Strg + C'ing. Ich habe den folgenden Text gesehen:

Are you sure you want to continue connecting (yes/no)? Killed by signal 2.

Ich gehe also davon aus, dass etwas funktioniert hat, es ist nur bei der Eingabe hängen geblieben. Zu diesem Fehler konnte ich jedoch keine schlüssigen Aussagen treffen. Irgendwo gab es einen Hinweis: /etc/sudoers bearbeiten und auskommentieren (ich weiß, dass dies nicht empfohlen wird)

# Defaults    requiretty

was nichts getan hat, obwohl ich keine Ahnung habe, ob ich diese Einstellung am Master und/oder am Slave ändern soll und ob ein Neustart oder ein Neustart eines Daemons erforderlich ist.

Meine Frage lautet nun: Führt dies irgendwo hin oder sind meine Versuche wertlos? Oder gibt es eine bessere Möglichkeit, Remote-Befehle auf Slaves auszuführen, die von einem Programm auf dem Master-Computer ausgelöst werden? Bedenken Sie bitte, dass ich meinen Kernel nicht neu kompilieren oder komplizierte Shenanigan-Dateien machen werde, da mir einfach die Erfahrung mit Linux fehlt.

Hilfe wird sehr geschätzt!

antworten

I've got the SSH keys

Sind diese Schlüssel unter dem root-Konto eingerichtet?

Host key verification failed.

The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established. RSA key fingerprint is .

Ihr Programm schreibt nicht in die Datei "known_hosts". Der Host, mit dem Sie eine Verbindung herstellen möchten, wurde nicht vom Konto verwendet, das der Java-Prozess verwendet. Sie müssen eine gültige known_hosts-Datei generieren, bevor Sie diese verwenden. Oder vielleicht, wenn Sie eine etwas vertrauensvolle Person sind, könnten Sie die Option StrictHostKeyChecking no festlegen.

Wenn es unter diesem Konto verwendet wurde, ist etwas an der Umgebung verpfuscht. Sie sollten in Erwägung ziehen, eine Konfigurationsdatei für den ssh-Client zu erstellen und den Pfad für die Schlüssel und die Datei "known_host" zu definieren. Lassen Sie Ihr Java-Programm mit ssh -f configfile auf die Konfigurationsdatei verweisen.

Mein Problem wurde gelöst, indem die Java-Bibliothek Jsch verwendet wurde, die eine reine Java-Implementierung von SSH2 ist. Ich dachte mir, dass auch meine SSH-Einstellungen in meiner Umgebung durcheinander sind, daher schien mir dies die effektivere Alternative zu sein.

Ich brauchte 1-2 Stunden, um zu funktionieren - sehr einfach zu implementieren.

Trotzdem danke ich für die Vorschläge. Ich musste vor allem die Option StrictHostKeyChecking=no verwenden (die auch in der Java-Bibliothek verfügbar ist), um eine Verbindung herstellen zu können.

Vor- und Nachteile:

  • (-) Die Dokumentation von Jsch ist ziemlich schlecht
  • (-) Es gibt einige Annahmen, die Sie bei der ersten Verwendung herausfinden müssen.
  • (+) Allerdings gibt es im Interweb viele Fragen und Antworten, da die Bibliothek von vielen Leuten genutzt wird.
  • (+) Es gibt sehr gut illustrierte Beispiele, die zeigen, wie verschiedene Funktionen funktionieren - eine gute Dokumentation wird dadurch jedoch nicht vollständig ersetzt.