2016-08-04 10 views
6

ich den folgenden Code haben:Wie starte ich vi von Symfony Process?

 
     $process = new Process('vi'); 

     try { 
      $process->setPty(true); 
      $process->mustRun(function ($type, $buffer) { 
       echo $buffer; 
      }); 
      //echo $process->getOutput(); 
     } catch (ProcessFailedException $e) { 
      echo $e->getMessage(); 
     } 

jedoch stirbt es für mich mit den folgenden Informationen:

 
The command "vi" failed. 

Exit Code: 1(General error) 

Working directory: [path] 

Output: 
================ 
Vim: Error reading input, exiting... 
Vim: Finished. 


Error Output: 
================ 
Vim: Warning: Output is not to a terminal 
Vim: Warning: Input is not from a terminal 

UPDATE

scheint es für manche Menschen nicht klar war, was ich werde ich tun. Ich werde erklären. Dieses Skript wird in der Konsole ausgeführt. Das gleiche funktioniert über passthru (obwohl Vim immer noch über die Ausgabe warnt). Ich möchte einen interaktiven Prozess haben, der es Benutzern erlaubt, einige Dateien zu ändern, bevor sie irgendwo gesendet werden. Ich möchte meinen eigenen Editor nicht implementieren und deshalb möchte ich, dass sie vi verwenden. vi ist auf meinem Server verfügbar (es ist deutlich sichtbar von der Ausgabe, die ich zur Verfügung gestellt habe).

+1

Nun, bist du sicher, dass Sie vi über PHP ausführen können? (Zumindest, wenn Sie über den Linux-Texteditor sprechen) – Epodax

+0

Ich bin mir sicher. Es ist möglich, es mit passthru() auszuführen. Mein Ziel ist es, einen interaktiven Prozess zu starten, bei dem ein Benutzer die Möglichkeit erhält, eine Datei zu modifizieren, die nach seinen Änderungen gesendet wird. –

Antwort

4

Hier war ich eine richtige Antwort gegeben: https://github.com/symfony/symfony/issues/19528

Grundsätzlich ist $process->setTty(true) verwenden musste.Also, das vollständige Beispiel wird sein:

$process = new Process('vi'); 

    try { 
     $process->setTty(true); 
     $process->mustRun(function ($type, $buffer) { 
      echo $buffer; 
     }); 
    } catch (ProcessFailedException $e) { 
     echo $e->getMessage(); 
    } 
-2

Warum möchten Sie das tun? vi ist etwas, das über die Tastatur gesteuert wird. Wenn es nötig ist, müssen Sie vielleicht den vollständigen Pfad überprüfen und ob php/symfony Zugriff auf diesen Pfad hat. Wahrscheinlich hat Ihr PHP-Skript keinen Zugriff auf dieses Skript, und der Webserver (ich nehme an, Sie sprechen hier von einer Webanwendung) darf möglicherweise keine Login-Shell am Server irgendwo starten. Wäre toll, wenn Sie mehr Details über Ihr Ziel + Umgebung bereitstellen könnten.

Wenn Sie nur die Datei bearbeiten/bearbeiten möchten, könnte der Befehl sed eine Option sein. Oder öffnen/manipulieren Sie die Datei direkt mit PHP möglicherweise noch besser.

+0

Mein Ziel ist es, einen interaktiven Konsolenprozess zu starten, in dem ein Benutzer die Möglichkeit erhält, eine Datei zu modifizieren, die nach seinen Änderungen irgendwo gesendet wird. Und ich habe überhaupt keinen Webserver. PHP hat Zugriff auf vi (sicher, wie passthru funktioniert). Es ist erlaubt, die Login-Shell zu starten, da ich sie von der Konsole aus starte. –

+1

@DenisV Sie sollten prüfen, ob eine 'EDITOR'-Umgebungsvariable gesetzt ist, und diese stattdessen verwenden, wenn sie gesetzt ist. Wenn ein Benutzer seinen Standard-CLI-Editor so konfiguriert hat, dass er "nano", "emacs", "vi", "vim", "neovim" oder etwas anderes ist, funktioniert es. Wenn 'EDITOR' nicht gesetzt ist, können Sie natürlich annehmen, dass sie' vi' als Standard haben. – Paulpro

+0

@Paulpro ja, danke für deinen Rat. In der Tat war dies das nächste, was ich tun würde, aber ohne "vi" laufen zu können, ergab das keinen Sinn. Trotzdem danke. :) –

0

Ihre Frage nach der Art und Weise durchaus Sinn macht ..

Meine Gedanken sind:

  • Sie erhalten einen Exit-Code: 1 -> die den Dateinamen zu bearbeiten bedeutet, wurde nicht angegeben . Obwohl ich falsch liegen könnte.
  • Es zeigt "Arbeitsverzeichnis: [Pfad]". Was mir sagt, vielleicht fehlt der Weg.
  • Ich weiß auch nicht, welcher Benutzer (auf dem System) die Symfony Process Component ausführt.

Vielleicht versuchen:

$process = new Process('vi /tmp/temp.file'); 

Verwendung/tmp, da jeder Zugriff haben sollte, auch möglich, einen Web-Ordner, die beschreibbar ist. Ein anderer Gedanke ist, den Prozess mit sudo und geben Sie den Benutzer vimrc auszuführen:

$process = new Process('sudo vim -u ~user/.vimrc /tmp/temp.file'); 

Aber dann könnten Sie müssen Eingang passieren (wie sudo Passwort):

$process->setInput('someSudoPassword'); 

Aber wer sudo Passwort, das ich don Ich weiß es nicht. Ich bin mir nicht sicher, welcher Benutzer die Prozesskomponente ausführt.

Dies sind nur einige Gedanken, und ich bin mir nicht sicher, ob es etwas löst, aber ich hoffe, es könnte Ihnen helfen, oder sogar helfen, über eine andere Möglichkeit zu denken, damit umzugehen.

+0

Vielen Dank für Ihre Antwort. 'vi' kann ohne Angabe des Pfades oder Dateinamens ausgeführt werden. '[Pfad]' hier war nur mein lokales Verzeichnis, das für die Frage irrelevant war, also übersprang ich es. Ich habe das auch unter root versucht, also ist 'sudo' hier nicht der Fall. –