7

次のコードがあります。

        $process = new Process('vi');

        試す {
            $process->setPty(true);
            $process->mustRun(function ($type, $buffer) {
                エコー$バッファ;
            });
            //echo $process->getOutput();
        } キャッチ (ProcessFailedException $e) {
            echo $e->getMessage();
        }

ただし、次の情報で死ぬ:

コマンド「vi」が失敗しました。

終了コード: 1 (一般エラー)

作業ディレクトリ: [パス]

出力:
================
Vim: 入力の読み取り中にエラーが発生しました。終了しています...
ヴィム:完成。


エラー出力:
================
Vim: 警告: 出力は端末へではありません
Vim: 警告: 入力は端末からではありません

アップデート

私が何をしようとしているのか、何人かの人々にとっては明確ではなかったようです. 説明します。このスクリプトはコンソールで実行されています。同じことがパススルー経由でも機能します (ただし、Vim はまだ出力について警告します)。ユーザーがファイルをどこかに送信する前に変更できるようにするインタラクティブなプロセスが必要です。私は独自のエディターを実装したくないので、vi を使用してもらいたいのです。vi は私のサーバーで利用できます (提供した出力からはっきりとわかります)。

4

3 に答える 3

6

ここで適切な回答が得られました: https://github.com/symfony/symfony/issues/19528

基本的に、私は使用しなければなりませんでした$process->setTty(true)。したがって、完全な例は次のようになります。

    $process = new Process('vi');

    try {
        $process->setTty(true);
        $process->mustRun(function ($type, $buffer) {
            echo $buffer;
        });
    } catch (ProcessFailedException $e) {
        echo $e->getMessage();
    }
于 2016-08-04T20:05:09.870 に答える
0

ちなみに、あなたの質問は完全に理にかなっています..

私の考えは次のとおりです。

  • 終了コードが表示されます: 1 --> これは、編集するファイル名が指定されていなかったことを意味します。私は間違っているかもしれませんが。
  • 「作業ディレクトリ:[パス]」と表示されます。つまり、パスが欠落している可能性があります。
  • また、(システム上の) どのユーザーが Symfony Process Component を実行しているのかわかりません。

だから多分試してください:

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

誰でもアクセスできる必要があるため、/tmp を使用します。また、書き込み可能な Web フォルダーも可能です。もう 1 つの考えは、sudo でプロセスを実行し、ユーザー vimrc を指定することです。

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

ただし、入力を渡す必要がある場合があります(sudoパスワードなど):

$process->setInput('someSudoPassword');

しかし、私が知らないsudoパスワードは誰ですか。繰り返しますが、どのユーザーがプロセス コンポーネントを実行しているかわかりません。

これらはほんの一部の考えであり、それが何かを解決するかどうかはわかりませんが、あなたの助けになること、またはこれを処理する別の方法を考えるのに役立つことを願っています.

于 2016-08-04T16:13:36.707 に答える
-2

なぜこれをしたいのですか?vi はキーボードで制御するものです。必要に応じて、フル パスを確認し、php/symfony がこのパスにアクセスできるかどうかを確認する必要があります。おそらく、あなたのphpスクリプトはこのスクリプトにアクセスできず、Webサーバー(ここではWebアプリケーションについて話していると思います)は、サーバーでログインシェルを開始することを許可されていない可能性があります。目標と環境について詳しく教えていただければ幸いです。

ファイルを編集/操作するだけの場合は、sed コマンドがオプションになる可能性があります。または、php でファイルを直接開いたり操作したりする方がよい場合もあります。

于 2016-08-04T11:05:37.380 に答える