如何从 Symfony Process 运行 vi?
How to run vi from 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();
}
但是,它因以下信息而死:
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
更新
有些人似乎不清楚我要做什么。我会解释。此脚本在控制台中 运行。同样的事情通过 passthru 起作用(尽管 Vim 仍然警告输出)。我想要一个交互式过程,允许用户在将某些文件发送到某处之前对其进行修改。我不想实现我自己的编辑器,这就是我希望他们使用 vi 的原因。 vi 在我的服务器上可用(从我提供的输出中可以清楚地看到)。
你为什么要这样做? vi 是由键盘控制的东西。如果需要,您可能需要检查完整路径以及 php/symfony 是否可以访问此路径。可能您的 php 脚本无法访问此脚本,并且 Web 服务器(我假设您在这里谈论的是 Web 应用程序)可能不允许在任何地方的服务器上启动登录 shell .如果您能提供有关您的目标+环境的更多详细信息,那就太好了。
如果您只想编辑/操作文件,sed 命令可能是一个选项。或者 open/manipulate 直接用 php 的文件可能会更好。
顺便说一句,你的问题很有道理..
我的想法是:
- 您得到一个退出代码: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密码是谁的。同样,我不确定哪个用户 运行 是进程组件。
这些只是一些想法,我不确定它是否能解决任何问题,但我希望它能对你有所帮助,甚至有助于思考另一种处理方法。
在这里我得到了正确的答案: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();
}
我有以下代码:
$process = new Process('vi'); try { $process->setPty(true); $process->mustRun(function ($type, $buffer) { echo $buffer; }); //echo $process->getOutput(); } catch (ProcessFailedException $e) { echo $e->getMessage(); }
但是,它因以下信息而死:
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
更新
有些人似乎不清楚我要做什么。我会解释。此脚本在控制台中 运行。同样的事情通过 passthru 起作用(尽管 Vim 仍然警告输出)。我想要一个交互式过程,允许用户在将某些文件发送到某处之前对其进行修改。我不想实现我自己的编辑器,这就是我希望他们使用 vi 的原因。 vi 在我的服务器上可用(从我提供的输出中可以清楚地看到)。
你为什么要这样做? vi 是由键盘控制的东西。如果需要,您可能需要检查完整路径以及 php/symfony 是否可以访问此路径。可能您的 php 脚本无法访问此脚本,并且 Web 服务器(我假设您在这里谈论的是 Web 应用程序)可能不允许在任何地方的服务器上启动登录 shell .如果您能提供有关您的目标+环境的更多详细信息,那就太好了。
如果您只想编辑/操作文件,sed 命令可能是一个选项。或者 open/manipulate 直接用 php 的文件可能会更好。
顺便说一句,你的问题很有道理..
我的想法是:
- 您得到一个退出代码: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密码是谁的。同样,我不确定哪个用户 运行 是进程组件。
这些只是一些想法,我不确定它是否能解决任何问题,但我希望它能对你有所帮助,甚至有助于思考另一种处理方法。
在这里我得到了正确的答案: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();
}