如何从 Symfony 进程运行 vi?

Posted

技术标签:

【中文标题】如何从 Symfony 进程运行 vi?【英文标题】:How to run vi from Symfony Process? 【发布时间】:2016-12-10 10:06:13 【问题描述】:

我有以下代码:

$process = new Process('vi'); 尝试 $process->setPty(true); $process->mustRun(function ($type, $buffer) 回声$缓冲区; ); //回显 $process->getOutput(); 捕捉(ProcessFailedException $e) 回声 $e->getMessage();

但是,它对我来说是以下信息:

命令“vi”失败。 退出代码:1(一般错误) 工作目录:[路径] 输出: ================= Vim:读取输入时出错,正在退出... 维姆:完成。 错误输出: ================= Vim:警告:输出不是终端 Vim:警告:输入不是来自终端

更新

似乎有些人不清楚我要做什么。我会解释。此脚本正在控制台中运行。同样的事情通过 passthru 起作用(尽管 Vim 仍然警告输出)。我想要一个交互式过程,允许用户在将某些文件发送到某处之前对其进行修改。我不想实现自己的编辑器,这就是我希望他们使用 vi 的原因。 vi 在我的服务器上可用(从我提供的输出中可以清楚地看到)。

【问题讨论】:

嗯,你确定可以通过php执行vi吗? (至少如果你在谈论 linux 文本编辑器) 我确定。可以使用 passthru() 来执行它。我的目标是运行一个交互式过程,在这个过程中,用户可以修改一个文件,该文件将在修改后发送到某个地方。 【参考方案1】:

在这里我得到了正确的答案: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();
    

【讨论】:

也许比echo更好的替代品:fwrite($type === Process::OUT ? STDOUT : STDERR, $buffer);【参考方案2】:

顺便说一句,你的问题完全有道理..

我的想法是:

你得到一个退出代码:1 --> 这意味着要编辑的文件名不是 指定的。虽然我可能是错的。 它显示“工作目录: [路径]”。这告诉我,可能路径丢失了。 另外,我不知道哪个用户(系统上)运行 Symfony 进程组件。

所以不妨试试:

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

使用 /tmp 因为任何人都应该有权访问,也可能是可写的网络文件夹。另一个想法是使用 sudo 运行进程并指定用户 vimrc:

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

但是你可能需要传递输入(如 sudo 密码):

$process->setInput('someSudoPassword');

但我不知道谁是 sudo 密码。同样,我不确定哪个用户运行流程组件。

这些只是一些想法,我不确定它是否能解决任何问题,但我希望它可以帮助你,甚至帮助你考虑另一种处理方式。

【讨论】:

感谢您的回复。 vi 可以在不指定路径或文件名的情况下运行。 [path] 这里只是我的本地目录,与问题无关,所以我跳过它。我也在root下试过了,所以sudo不是这里的情况。【参考方案3】:

您为什么要这样做? vi 是由键盘控制的东西。如果需要,您可能需要检查完整路径以及 php/symfony 是否有权访问此路径。可能您的 php 脚本无权访问此脚本,并且 Web 服务器(我假设您在这里谈论的是 Web 应用程序)可能不允许在任何地方的服务器上启动登录 shell。如果您能提供有关您的目标和环境的更多详细信息,那就太好了。

如果您只想编辑/操作文件,sed 命令可能是一个选项。或者直接用php打开/操作文件可能会更好。

【讨论】:

我的目标是运行一个交互式控制台进程,在该进程中,用户可以修改一个文件,该文件将在修改后发送到某个地方。而且我根本没有网络服务器。 PHP 可以访问 vi(当然,因为 passthru 有效)。允许启动登录 shell,因为我是从控制台运行的。 @DenisV 您可能想检查是否设置了EDITOR 环境变量,如果设置了则使用它。这样,如果用户将其默认 cli 编辑器配置为 nanoemacsvivimneovim 或其他内容,它将起作用。如果EDITOR 没有设置,你当然可以假设他们默认有vi @Paulpro 是的,谢谢您的建议。事实上,这是我接下来要做的事情,但由于无法运行 vi,这是没有意义的。无论如何,谢谢你。 :)

以上是关于如何从 Symfony 进程运行 vi?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 中增加会话超时

通过单元测试访问 Symfony 2 容器?

如何获取通过 symfony 进程运行的脚本的内存使用情况?

如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2

弃用服务的公共使用

Symfony 进程组件 - 为命令设置输入参数