Использование компонента Symfony Process с командами со встроенными кавычками

Я использую компонент 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 = '[email protected]';
    $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"'];

Output:
Errors: sh: /usr/bin/ssh [email protected] "if [ -d /admin ]; then echo 1; else echo 0; fi": No such file or directory
sh: line 0: exec: /usr/bin/ssh user@example,com "if [ -d /admin ]; then echo 1; else echo 0; fi": cannot execute: No such file or directory

$command — это отдельная команда и аргумент:

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

The process "'/usr/bin/ssh' '[email protected] "if [ -d /admin ]; then echo 1; else echo 0; fi"'" exceeded the timeout of 60 seconds.

$command в виде трех отдельных элементов:

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

Output:
Errors: bash: if [ -d /admin ]; then echo 1; else echo 0; fi: No such file or directory

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

Окружающая обстановка:
- macOS Высокая Сьерра 10.13.6
- PHP: 7.2.14
- Симфония 4.2.2

ТИА

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
2 224
1

Ответы 1

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

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

Любопытный. Это не работает для меня. Я думаю, что у меня может быть тайм-аут ssh. Это ошибка, которую я получаю: [ssh: подключиться к хосту example.com "if [ -d /admin]; then echo 1; else echo 0; fi" порт 22: время ожидания операции истекло]. Как ни странно, если я скопирую команду из ошибки и ввожу ее напрямую, она работает нормально и быстро.

David Patterson 08.03.2019 23:35

Другие вопросы по теме