从Symfony命令运行Linux命令

时间:2017-03-06 14:41:40

标签: php linux symfony command-line-interface

如何在Symfony命令中运行简单的Linux命令?

E.g。我想在命令结束时运行ssh username@host -p port ...

我试过了:

$input = new StringInput('ssh username@host -p port');
$this->getApplication()->run($input, $output);

但是会引发以下异常:`“-p”选项不存在.`

它似乎是在我的Symfony命令的相同“上下文”中执行的。

3 个答案:

答案 0 :(得分:6)

  

如何在Symfony命令中运行简单的Linux命令?

首先,尝试执行一个简单/普通命令(ls)来查看会发生什么,然后转到您的特殊命令。

http://symfony.com/doc/current/components/process.html

<强> CODE:

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

$process = new Process('ls -lsa');
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

<强>结果:

total 36
4 drwxrwxr-x  4 me me 4096 Jun 13  2016 .
4 drwxrwxr-x 16 me me 4096 Mar  2 09:45 ..
4 -rw-rw-r--  1 me me 2617 Feb 19  2015 .htaccess
4 -rw-rw-r--  1 me me 1203 Jun 13  2016 app.php
4 -rw-rw-r--  1 me me 1240 Jun 13  2016 app_dev.php
4 -rw-rw-r--  1 me me 1229 Jun 13  2016 app_test.php
4 drwxrwxr-x  2 me me 4096 Mar  2 17:05 bundles
4 drwxrwxr-x  2 me me 4096 Jul 24  2015 css
4 -rw-rw-r--  1 me me  106 Feb 19  2015 robots.txt

如上所示,如果您将一段代码放在一个控制器中以进行测试,ls -lsa会列出存储在web文件夹下的文件/文件夹!!!

你也可以做shell_exec('ls -lsa');这也是我有时做的事情。例如shell_exec('git ls-remote url-to-my-git-project-repo master');

答案 1 :(得分:0)

据我所知,我对Symfony一无所知,你必须在username @ host之前指定选项。请在此处查看:http://linuxcommand.org/man_pages/ssh1.html

在你的情况下:

'ssh -p port username@host'

答案 2 :(得分:0)

这是更新的界面,在 Symfony 5.2 中使用。流程构造函数现在需要一个数组作为输入。

来源:https://symfony.com/doc/current/components/process.html

<块引用>

Symfony\Component\Process\Process 类在一个 子进程,照顾操作系统之间的差异 并转义参数以防止安全问题。它取代了 PHP exec、passthru、shell_exec 和 system 等函数

use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

$process = new Process(['ls', '-lsa']);
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();