phpseclib SSH2 пишет, не выполняя длинную команду

Я пытаюсь выполнить команду SSH для устройства (брандмауэра). Команда выполняется, когда длина короткая. При длине около 1000 символов команда не выполняется.

Когда я выполняю команду через замазку, это тоже работает.

Прочитав несколько решений, я попытался установить тайм-аут на 5 секунд. Все равно никакой помощи.

В журналах устройства я вижу вход и выход SSH. Но никакой активности.

Я использую phpseclib ssh версии 2.0.

$ssh = new SSH2(ip_address);
$ssh->login($user, $password);
$ssh->write($command);
$ssh->setTimeout(5);
$ssh->read()

person Dilani    schedule 11.03.2019    source источник
comment
попробуй с $ssh->setTimeout(0);   -  person Ash-b    schedule 11.03.2019
comment
$ssh-›setTimeout(0); продолжает работать бесконечно.   -  person Dilani    schedule 11.03.2019
comment
Я не думаю, что будет возможно оказать большую помощь без журналов SSH. Вы можете получить их, выполнив define('NET_SSH2_LOGGING', 2); вверху, а затем echo $ssh->getLog(); после $ssh->read();. Кроме того, мне интересно, может быть, для вас будет лучше, если вы поместите эту длинную команду в сценарий оболочки, а затем вызовете сценарий оболочки. Я имею в виду, что это звучит так, как будто это должно работать, не находясь внутри сценария оболочки, но это того стоит!   -  person neubert    schedule 12.03.2019
comment
@neubert, я проверил журналы. С подключением каналов все в порядке. NET_SSH2_MSG_CHANNEL_DATA не передает. Я не вижу этот журнал.   -  person Dilani    schedule 12.03.2019
comment
@Dilani - может быть, все же поделитесь с нами логами? Например, опубликуйте их на pastebin.com или что-то в этом роде. Код PHP в порядке. не знаю, что такое $command, но это очень актуально. Журналы покажут это и многое другое. Я бы предпочел журналы, но в противном случае $command тоже было бы неплохо. Если вы не можете предоставить ни один из них, то я боюсь сказать, что единственный человек, который сможет вам помочь, - это вы сами, и я проголосую за закрытие этого вопроса.   -  person neubert    schedule 12.03.2019
comment
@neubert, пожалуйста, найдите ответ для успешного дела здесь pastebin.com/xHjdKyMU, а для неудачного случая здесь pastebin.com/VJLCvMjg Я не могу поделиться этой командой, так как она содержит некоторые конфиденциальные данные. Однако проблема не в команде, потому что она работает, если я выполняю ее напрямую из cli.   -  person Dilani    schedule 12.03.2019
comment
@Dilani - Ну, вы возвращаете один бит данных: FW1-AMSTERDAM # . idk, что вы ожидаете назад, но я думаю, что это еще не все. Без команды это действительно игра в угадайку, но есть одна вещь, которую стоит попробовать: не отправляйте команду одним большим гигантом $ssh->write(), а вместо этого отправляйте ее по одному символу за раз. например. for ($i = 0; $i < strlen($command); $i++) $ssh->write($command[$i]);. Это больше похоже на то, что делает PuTTY. Трудно точно знать, что делает клиент OpenSSH, потому что их клиент не создает журналы, как это делает PuTTY.   -  person neubert    schedule 12.03.2019
comment
Не повезло и в этом. Моя команда в основном пытается добавить участников в группу в брандмауэре fortigate. Когда он пытается добавить больше участников, брандмауэр не выполняет никаких действий. Когда я добавляю несколько участников, активность проходит успешно. Я использую SSH для подключения к брандмауэру и выполнения команды   -  person Dilani    schedule 13.03.2019
comment
@Dilani - обычно в этой ситуации я бы подключался к PuTTY и запускал команду с PuTTY, а затем пробовал с phpseclib. Я бы записал журналы PuTTY и phpseclib и сравнил их. Я бы также делал полные журналы, а не усеченные. Я бы предоставил инструкции о том, как включить ведение журнала с помощью PuTTY, но я думаю, что на самом деле не вижу смысла, поскольку вы даже не хотели предоставлять полные журналы phpseclib. Поскольку вы сказали, что конфиденциальность является проблемой, я могу предложить вам написать по электронной почте [email protected] (автору phpseclib) вместо того, чтобы транслировать ее всем.   -  person neubert    schedule 13.03.2019


Ответы (2)


Судя по исходному коду библиотеки https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Net/SSH2.php#L4244 мы видим, что время ожидания встроено в библиотеку, поэтому вам не нужно устанавливать тайм-аут.

Если это не сработает, вы можете открыть вопрос на github, предоставив свою команду. ЕСЛИ библиотека поддерживается, вы получите исправление или ответ от разработчиков библиотеки.

person Sergej    schedule 11.03.2019
comment
Вчера у phpseclib был релиз, поэтому похоже, что он все еще поддерживается: github.com/phpseclib/phpseclib/ релизы - person neubert; 11.03.2019

Проблема оказалась на пути между сервером и устройством.

person Dilani    schedule 01.05.2019