У меня есть функция, которая должна вернуть объект 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 &');
В обоих случаях туннель разрушается при выходе из сценария.
Спасибо!
Это странный вариант использования, и я бы не советовал его выполнять, отбрасывая веб-запросы. [или вообще, действительно] Однако вы могли бы использовать ssh ControlMaster
обрабатывать постоянные и мультиплексные соединения самостоятельно.
Добавьте следующие параметры:
-o ControlMaster auto
-o ControlPersist 30
-o ControlPath /path/to/socket/dir/%r@%h-%p
[необязательно, но рекомендуется]
Ref: https://linux.die.net/man/5/ssh_config
Важно отметить, что после создания сокета ControlMaster любой пользователь, которому разрешен доступ к нему, может делать это без аутентификации. Вы можете отделить пути сокетов друг от друга на основе аутентификации / авторизации приложения.
С учетом вышесказанного двоичный файл ssh сам обрабатывает то, что по сути является дамонизацией, необходимой для сохранения соединения, ожидания истечения времени ожидания и изящного закрытия соединений. Хотя следует отметить, что если процесс ssh завершен, сокеты все еще существуют, и перед повторным подключением их необходимо будет очистить вручную.
Кроме того, этот код полагается на уровень доверия IMMENSE ваших пользователей, чтобы не делать ничего глупого и / или вредоносного. Как минимум убедитесь, что вы используете либерально escapeshellarg()
а также escapeshellcmd()
на каждый и все пользовательский ввод, который может превратиться в исполняемую команду.
Других решений пока нет …