Frage

Ich bin derzeit ein Deployment Framework in PHP zu schreiben. Die Framework-Connects zu Servern und führt Befehle über SSH. Ich habe für eine ganze suchen bei dem Versuch, einen Weg in PHP zu finden, diese besser zu machen. Hier sind die Anforderungen. Die Technik sollte in der Lage sein:

  1. Geben Sie das SSH-Passwort programmatisch. Ich weiß, dass SSH-Schlüssel verwendet, ist der Weg zu gehen, wenn Sie ein Passwort weniger SSH-Anmeldungen wollen, aber denken Sie daran, dies ist ein Deployment-Framework. Es könnte möglicherweise zu einem Zeitpunkt, zu 25 Servern bereitstellen. Es scheint nicht richtig um den Benutzer zu erfordern SSH-Schlüssel eingerichtet hat, den Rahmen zu nutzen, und wer will ihr Passwort 25 Mal eingeben? Ich verwende Capistrano als Modell hier - einmal nach Ihrem Passwort fragt, dann verwendet es die SSH-Verbindungen ohne erneute Aufforderung an den Benutzer zu etablieren. Ich schlage nicht die Passwörter im deploy Skript gespeichert werden, nur (leise) einmal eingegeben und verwendet, bis die deploy Aufgaben fertig sind.

  2. Send-Ausgang an den PHP-Skript. Ich mag die Terminal-Ausgabe von jedem der SSH-Sitzungen können, unabhängig abfangen, ändern, es dann an das Terminal zurückschicken für den Benutzer zu sehen. Auf diese Weise kann ich den Namen des Servers, auf jede Zeile der Ausgabe prepend zu zeigen, was los ist.

  3. Geben Sie write (sowie Lese-) Zugriff auf das Terminal. Es ist wichtig, dass der Benutzer (oder das Skript) in der Lage sein, andere Informationen in das Terminal neben nur das SSH-Passwort einzugeben.

  4. Support SSH v2.

Derzeit mein Framework „kompiliert“ die Befehle aus dem deploy-Skript in einem riesigen String und führt sie durch den SSH-Befehl. Jeder letzte Befehl deploy sieht ungefähr wie folgt aus:

ssh -t -t -p 12345 user@server.com 'command1; command2;'

Jeder dieser SSH-Befehle über PHP fest eingebaute in passthru Funktion ausgeführt:

<?php passthru("ssh -t -t -p 12345 user@server.com 'command1; command2;'"); ?>

Ich habe mit proc_open versucht und fast alle PHP anderen Befehls-Ausführungs-Funktionen ohne Erfolg - keiner von ihnen bieten alle Funktionen, die ich oben aufgelistet habe. Darüber hinaus habe ich mehrere reine PHP-SSH-Implementierungen versucht, auch ohne Erfolg. Die Bibliotheken entweder keinen Schreibzugriff auf das Endgerät liefern oder nicht SSH v2 unterstützen.

Jede Hilfe zu dieser wäre sehr dankbar - Vielen Dank im Voraus

War es hilfreich?

Lösung

Haben Sie die folgenden sein ein Beispiel für den Schreibzugriff auf das Endgerät berücksichtigen:?

ssh -t -t -p 12345 user@server.com 'command1; command2;'

Wenn ja, dann können Sie das tun mit phpseclib reiner PHP SSH-Implementierung . zB.

$ssh = new Net_SSH2(...);
$ssh->login(..., ...);
$ssh->exec('command1; command2;');

Wenn nicht, dann (1) Ich würde sagen, Sie wäre besser aus phpseclib mit, als Sie mit Ihnen sind sind aktuelle Implementierung und (2), wenn Sie wollen, was der phpseclib Autor als „interaktive“ Unterstützung bezeichnet hat vielleicht Sie könnten versuchen, den Autor zu kontaktieren? Vielleicht bietet ihm etwas Geld zu zahlen, ihn zur Schaffung von Anreizen, die Funktion zu entwickeln. Mit Blick auf den Support-Foren scheint der Autor sensibel genug.

Andere Tipps

Ich bin nicht sicher, php das richtige Werkzeug ist hier. Warum nicht etwas verwenden, die näher an der Shell-Umgebung ist, wie ein Bash-Skript?

Der einzige Grund, warum ich mir vorstellen kann Sie verwenden möchten PHP ist, so dass Sie den Prozess durch Klicken auf einen Link auf einer Seite irgendwo beginnen und damit ein großes Loch stanzen in welcher Sicherheit Ihres Systems angeblich hat. Aber wenn Sie wirklich müssen, dann ist es noch einfacher ist, ein Skript in einer Schale freundliche Sprache zu schreiben und einfach PHP als Gateway verwenden, um das Skript aufrufen.

Sie können SSH-Verbindung mit einer PECL-Erweiterung in PHP machen. http://php.net/manual/en/book.ssh2.php

$connection = ssh2_connect('server.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stream1 = ssh2_exec($connection, $command1);
$stream2 = ssh2_exec($connection, $command2);

Sie können auch ein SSH-interaktiv Shell mit ssh2_shell erstellen (), wenn Sie auf fortgeschrittenere Dinge benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top