Создание постоянных туннелей SSH в переполнении стека

У меня есть функция, которая должна вернуть объект PDO на удаленный хост через туннель SSH в PHP.

В настоящее время он работает так, что когда запрашивается объект PDO, он создает туннель SSH, подключает PDO и возвращает объект PDO.

Я хотел бы иметь возможность создать SSH-туннель один раз и оставить его там, чтобы при наличии 100 запросов на объект PDO к определенному удаленному серверу я создавал SSH-туннель только один раз.

В данный момент SSH-туннель разрушается, когда скрипт завершает работу.

Как я могу настроить это для достижения этого?

В настоящее время я попробовал:

exec('ssh -fNg -L 13306:127.0.0.1:3306 user@host > /dev/null 2>/dev/null &');

а также

exec('autossh -f -M 13308 -fNg -L 13306:127.0.0.1:3306 user@host > /dev/null 2>/dev/null &');

В обоих случаях туннель разрушается при выходе из сценария.

Спасибо!

0

Решение

Это странный вариант использования, и я бы не советовал его выполнять, отбрасывая веб-запросы. [или вообще, действительно] Однако вы могли бы использовать ssh ControlMaster обрабатывать постоянные и мультиплексные соединения самостоятельно.

Добавьте следующие параметры:

  1. -o ControlMaster auto
    • Разрешает совместное использование нескольких сеансов через одно сетевое соединение.
  2. -o ControlPersist 30
    • Указывает, что главное соединение должно оставаться открытым в фоновом режиме после того, как первоначальное клиентское соединение было закрыто.
  3. -o ControlPath /path/to/socket/dir/%r@%h-%p [необязательно, но рекомендуется]
    • Укажите путь к сокету управления, используемому для совместного использования соединения.

Ref: https://linux.die.net/man/5/ssh_config

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

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

Кроме того, этот код полагается на уровень доверия IMMENSE ваших пользователей, чтобы не делать ничего глупого и / или вредоносного. Как минимум убедитесь, что вы используете либерально escapeshellarg() а также escapeshellcmd() на каждый и все пользовательский ввод, который может превратиться в исполняемую команду.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]