Как передать данные через существующее SSH соединение?

У меня есть PHP-скрипт, которому нужно связаться с другим сервером для получения информации о чем-то.
В настоящее время я использую SSH (через ControlMaster auto) для этого, который работает правильно.

Однако проблема в том, что задержка слишком высока - просто shell_exec'ing ssh example.com занимает 80 миллисекунд, что намного больше, чем фактическая задержка между серверами (0.2 мс, поскольку они соединены Ethernet-кабелем).

Поэтому сейчас я думаю о том, чтобы просто передавать данные через существующее SSH-соединение, а не пытаться мультиплексировать новое SSH-соединение в существующее.

Однако я не уверен, как это сделать. Какой лучший способ передать данные в stdin существующего SSH-соединения к example.com и затем прочитать полученный вывод из stdout?
. (BASH-решение подойдет - мне не нужно ничего специфичного для PHP.)

0
23.09.2017, 23:14
2 ответа

Если вы используете ControlMaster auto, вы уже повторно используете существующее TCP-соединение , но в любом случае TCP-соединение устанавливается очень быстро.

Задержка в 80 мс, вероятно, вызвана комбинацией:

  1. php shell_execзапуск новой оболочки (попробуйте exec?)
  2. дополнительные затраты на настройку нового канала ssh по существующему соединению
  3. Выполнение вашей команды на удаленном сервере через ваш новый канал ssh

Если вам нужны более быстрые ответы, сначала измерьте каждый из них по отдельности, а затем поработайте над уменьшением задержки в той части, которая медленнее. Если вы обнаружите, что #2 замедляет вас, как вы подозреваете, вы можете попробовать отправить свои команды по существующему постоянному каналу ssh, возможно, через именованный канал с вашей удаленной командой в read -while loop(будут применяться предостережения @symcbean ).

Примерно так

mkfifo /tmp/f_in
mkfifo /tmp/f_out
tail -f /tmp/f_in | ssh user@example.com 'bash -c "while read name; do echo hello \$name; done"' > /tmp/f_out &
time response=$(head -n 1 /tmp/f_out & echo dwurf > /tmp/f_in); echo $response

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

1
28.01.2020, 02:44

Если бы у вас было «статическое» соединение ssh, как бы экземпляр php-скрипта привязывался к нему, чтобы использовать его?

Очень скоро мы начнем говорить о семантике блокировки (, которую сложно реализовать в php ). Тогда есть проблема масштабирования. Ваше текущее решение будет очень хорошо масштабироваться, поскольку каждое ssh-соединение является дискретным.

Пока я предполагаю, что вы управляете кодом, работающим на обоих устройствах. Если причина, по которой вы используете ssh, заключается в том, что на ssh-сервере выполняется какой-то проприетарный код, то это устраняет множество шаблонов для решения.

Если они подключены через Ethernet, следует ли считать сеть доверенной? Почему бы не использовать что-то вроде rsh?

Важно ли разделение привилегий между клиентом и сервером?

Попахивает проблемой XY.

Единственными практическими решениями здесь являются:

1 )написать сервер для работы на стороне клиента ssh, который поддерживает открытое соединение ssh и разделить его доступ к клиентам, подключающимся с локального хоста, без накладных расходов на ssh. Это не тривиально и не масштабируется.

2 )реализация клиента и сервера с использованием протокола с малой задержкой и любой связанной аутентификацией/целостностью/конфиденциальностью. Это тоже не тривиально. И вы не сказали нам, как и почему вы в настоящее время используете ssh.

0
28.01.2020, 02:44

Теги

Похожие вопросы