Использование компонента Symfony Process с командами, которые имеют встроенные кавычки - PullRequest
0 голосов
/ 08 марта 2019

Я использую компонент Symfony 4 Process для запуска различных команд ssh.Все это работало прошлой осенью и сейчас не работает.

Примерами здесь являются весь реальный код (за исключением удаленного хоста и имени пользователя).Это базовая линия:

<?php
namespace App\Command;

use ...

class TestCommand extends Command
{
  public static $defaultName = 'app:test';

  public function configure()
  {
    $this->setDescription( 'Test command for Process problem' );
  }

  protected function execute( InputInterface $input, OutputInterface $output )
  {
    $host = 'dpatterson@webhost01.dplhenterprises.com';
    $command =
    [
      // Command, arguments, and options.
    ];

    $process = new Process( $command );
    $process->run();
    $output->writeln( 'Output: ' . $process->getOutput());
    $output->writeln( 'Errors: ' . $process->getErrorOutput());
  }
}

В оставшейся части этого поста я представлю значение $ command и выходные данные.

$ command в качестве команды и аргумента вместе:

$command = ['/usr/bin/ssh ' . $host . ' "if [ -d /admin ]; then echo 1; else echo 0; fi"'];

Вывод:
Ошибки: sh: / usr / bin / ssh user@example.com "if [-d / admin]; затем echo 1; еще echo0; fi ": нет такого файла или каталога
sh: строка 0: exec: / usr / bin / ssh user @ example, com" if [-d / admin]; затем echo 1; еще echo 0; fi ": невозможно выполнить: Нет такого файла или каталога

$ команда является отдельной командой и аргументом:

$command =
[ 
  '/usr/bin/ssh',
  $host . ' "if [ -d /admin ]; then echo 1; else echo 0; fi"',
];

Процесс "'/ usr/ bin / ssh '' user@example.com "if [-d / admin];затем эхо 1;еще эхо 0;fi "'" превысил тайм-аут 60 секунд. Команда

$ как три отдельных элемента:

$command =
[
  'ssh',
  $host,
  '"if [ -d /admin ]; then echo 1; else echo 0; fi"',
];

Вывод:
Ошибки: bash: if [-d / admin];затем эхо 1;еще эхо 0;fi: нет такого файла или каталога

Опять же, это сработало с первой конфигурацией осенью 2018 года. Я, честно говоря, не знаю, какую версию Symfony я использовал в то время, но я 'Я уверен, что это было как минимум 4.1.

Среда:
- macOS High Sierra 10.13.6
- PHP: 7.2.14
- Symfony 4.2.2

TIA

1 Ответ

0 голосов
/ 08 марта 2019

Ваша вторая попытка работает нормально, просто установите set_time_limit(0);, а также $process->setTimeout(null); перед вызовом $process->run().

Чтобы отладить команду процесса, дамп $process->getCommandLine(), чтобы увидеть, как она генерируется.

...