如何从 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 编辑器配置为 nano
、emacs
、vi
、vim
、neovim
或其他内容,它将起作用。如果EDITOR
没有设置,你当然可以假设他们默认有vi
。
@Paulpro 是的,谢谢您的建议。事实上,这是我接下来要做的事情,但由于无法运行 vi
,这是没有意义的。无论如何,谢谢你。 :)以上是关于如何从 Symfony 进程运行 vi?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取通过 symfony 进程运行的脚本的内存使用情况?
如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2