Я использую компонент 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
ТИА






Ваша вторая попытка работает нормально, просто установите 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: время ожидания операции истекло]. Как ни странно, если я скопирую команду из ошибки и ввожу ее напрямую, она работает нормально и быстро.